1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-19 13:40:49 +03:00

Compare commits

..

6 Commits

Author SHA1 Message Date
vmigunov
a0c6a637fa 0023860: Bad memory access intersecting two nearly coincident cylindrical faces
Test of 2 nearly coincident cylindrical faces intersection is added
2022-08-12 12:29:03 +03:00
mzernova
81d569625e 0033084: Visualization - Cylindrical prism is selectable only by its base when extruded in some directions
Fixed bounding boxes for Select3D_SensitiveCylinder.

Added display of Select3D_SensitiveCylinder presentation using the "vsensdis" command.
Added test vselect/bugs/bug33084.
2022-08-04 17:50:46 +03:00
ngavrilo
6072d3093c 0032992: Visualization - Font_TextFormatter should wrap words when possible 2022-08-02 17:13:03 +03:00
jgv
e1b097eb67 0033006: Modelling Algorithms - UnifySameDomain raises exception
Correct processing cases where a group of faces lies on U-periodic and V-periodic (torus-like) surface.

Add comments according to the remarks
2022-07-29 19:11:52 +03:00
jgv
92d22d7d62 0033080: Wrong projection point from ShapeAnalysis_Surface
Correct Draw command "projface" so that it really finds only projection points belonging to the face.
2022-07-29 19:10:37 +03:00
dpasukhi
1b423e3287 0033068: Draw Harness, XDEDRAW - improve XGetProperties command to work with all document labels
Upgrade DRAW function XGetProperties to work with all document labels or sequence of labels
2022-07-24 22:33:24 +03:00
26 changed files with 901 additions and 587 deletions

View File

@@ -103,7 +103,7 @@ static Standard_Integer mkvolume (Draw_Interpretor&, Standard_Integer, const c
"-na - disables the approximation of the section curves.\n",
__FILE__, bsection, g);
//
theCommands.Add("bopcurves", "use bopcurves F1 F2 [-2d/-2d1/-2d2] "
theCommands.Add("bopcurves", "use bopcurves F1 F2 [-2d/-2d1/-2d2] [-noapprox] "
"[-p u1 v1 u2 v2 (to add start points] [-v (for extended output)]",
__FILE__, bopcurves, g);
theCommands.Add("mkvolume", "make solids from set of shapes.\nmkvolume r b1 b2 ... [-c] [-ni] [-ai]",
@@ -544,7 +544,7 @@ Standard_Integer bopcurves (Draw_Interpretor& di,
const char** a)
{
if (n<3) {
di << "Usage: bopcurves F1 F2 [-2d/-2d1/-2d2] "
di << "Usage: bopcurves F1 F2 [-2d/-2d1/-2d2] [-noapprox] "
"[-p u1 v1 u2 v2 (to add start points] [-v (for extended output)]\n";
return 1;
}
@@ -597,6 +597,9 @@ Standard_Integer bopcurves (Draw_Interpretor& di,
else if (!strcasecmp(a[i],"-2d2")) {
aToApproxC2dOnS2 = Standard_True;
}
else if (!strcasecmp(a[i],"-noapprox")) {
aToApproxC3d = Standard_False;
}
else if (!strcasecmp(a[i],"-p")) {
IntSurf_PntOn2S aPt;
const Standard_Real aU1 = Draw::Atof(a[++i]);

View File

@@ -60,6 +60,7 @@ Font_TextFormatter::Font_TextFormatter()
myAlignY (Graphic3d_VTA_TOP),
myTabSize (8),
myWrappingWidth (0.0f),
myIsWordWrapping (true),
myLastSymbolWidth (0.0f),
myMaxSymbolWidth (0.0f),
//
@@ -249,6 +250,7 @@ void Font_TextFormatter::Format()
}
}
Standard_Utf32Char aCharPrev = 0;
for (Font_TextFormatter::Iterator aFormatterIt(*this);
aFormatterIt.More(); aFormatterIt.Next())
{
@@ -269,12 +271,30 @@ void Font_TextFormatter::Format()
Font_Rect aBndBox;
GlyphBoundingBox (aRectIter, aBndBox);
const Standard_ShortReal aNextXPos = aBndBox.Right - BottomLeft (aFirstCornerId).x();
if (aNextXPos > aMaxLineWidth) // wrap the line and do processing of the symbol
Standard_Boolean isCurWordFits = true;
if(myIsWordWrapping && IsSeparatorSymbol(aCharPrev))
{
for (Font_TextFormatter::Iterator aWordIt = aFormatterIt; aWordIt.More(); aWordIt.Next())
{
if (IsSeparatorSymbol(aWordIt.Symbol()))
{
break;
}
float aWordWidthPx = myCorners[aWordIt.SymbolPosition()].x() - myCorners[aRectIter].x();
if (aNextXPos + aWordWidthPx > aMaxLineWidth)
{
isCurWordFits = false;
break;
}
}
}
if (aNextXPos > aMaxLineWidth || !isCurWordFits) // wrap the line and do processing of the symbol
{
const Standard_Integer aLastRect = aRectIter - 1; // last rect on current line
newLine (aLastRect, aMaxLineWidth);
}
}
aCharPrev = aCharThis;
}
myBndWidth = aMaxLineWidth;

View File

@@ -220,6 +220,12 @@ public:
//! Returns text maximum width, zero means that the text is not bounded by width
Standard_ShortReal Wrapping() const { return myWrappingWidth; }
//! returns TRUE when trying not to break words when wrapping text
Standard_Boolean WordWrapping () const { return myIsWordWrapping; }
//! returns TRUE when trying not to break words when wrapping text
void SetWordWrapping (const Standard_Boolean theIsWordWrapping) { myIsWordWrapping = theIsWordWrapping; }
//! @return width of formatted text.
inline Standard_ShortReal ResultWidth() const
{
@@ -274,6 +280,14 @@ public:
return Standard_False;
}
//! Returns true if the symbol separates words when wrapping is enabled
static Standard_Boolean IsSeparatorSymbol (const Standard_Utf32Char& theSymbol)
{
return theSymbol == '\x0A' // new line
|| theSymbol == ' ' // space
|| theSymbol == '\x09'; // tab
}
DEFINE_STANDARD_RTTIEXT (Font_TextFormatter, Standard_Transient)
protected: //! @name class auxiliary methods
@@ -288,6 +302,7 @@ protected: //! @name configuration
Graphic3d_VerticalTextAlignment myAlignY; //!< vertical alignment style
Standard_Integer myTabSize; //!< horizontal tabulation width (number of space symbols)
Standard_ShortReal myWrappingWidth; //!< text is wrapped by the width if defined (more 0)
Standard_Boolean myIsWordWrapping; //!< if TRUE try not to break words when wrapping text (true by default)
Standard_ShortReal myLastSymbolWidth; //!< width of the last symbol
Standard_ShortReal myMaxSymbolWidth; //!< maximum symbol width of the formatter string

View File

@@ -432,10 +432,8 @@ static Standard_Integer intersect(Draw_Interpretor& di, Standard_Integer n, cons
Standard_Integer aNbSegments = Intersector.NbSegments();
for (Standard_Integer i = 1; i <= aNbSegments; i++)
{
Intersector.Segment(i,S1,S2);
di << "Segment #" << i << " found.\n";
di << "Curve 1 first parameter: " << S1->FirstParameter() << " last parameter: " << S1->LastParameter() <<"\n";
di << "Curve 2 first parameter: " << S2->FirstParameter() << " last parameter: " << S2->LastParameter() <<"\n";
Intersector.Segment(i,S1,S2);
CD = new DrawTrSurf_Curve2d(S1, Draw_bleu, 30);
dout << CD;
CD = new DrawTrSurf_Curve2d(S2, Draw_violet, 30);

View File

@@ -392,7 +392,6 @@ void LineCircleGeometricIntersection(const gp_Lin2d& Line,
Standard_Real dO1O2=Line.Distance(Circle.Location());
Standard_Real R=Circle.Radius();
Standard_Real RmTol=R-Tol;
Standard_Real RpTol = R + Tol;
Standard_Real binf1,binf2=0,bsup1,bsup2=0;
//----------------------------------------------------------------
@@ -426,7 +425,7 @@ void LineCircleGeometricIntersection(const gp_Lin2d& Line,
if(dO1O2 > RmTol && !b2Sol) {
//if(dO1O2 > RmTol) {
Standard_Real dx=dO1O2;
Standard_Real dy = RpTol * RpTol - dx * dx;
Standard_Real dy=0.0; //(RpTol*RpTol-dx*dx); //Patch !!!
dy=(dy>=0.0)? Sqrt(dy) : 0.0;
dAlpha1=ATan2(dy,dx);
@@ -440,7 +439,7 @@ void LineCircleGeometricIntersection(const gp_Lin2d& Line,
else {
//------------------- Intersection Line Circle+ --------------------------
Standard_Real dx=dO1O2;
Standard_Real dy = RpTol * RpTol - dx * dx;
Standard_Real dy=R*R-dx*dx; //(RpTol*RpTol-dx*dx); //Patch !!!
dy=(dy>=0.0)? Sqrt(dy) : 0.0;
dAlpha1=ATan2(dy,dx);

View File

@@ -141,13 +141,18 @@ static Standard_Integer tolerance
static Standard_Integer projface
(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
{
if (argc < 4) { di<<"Give FACE name and X Y [Z]\n"; return 1 /* Error */; }
if (argc < 4)
{
di << "Give FACE name and X Y [Z]\n";
return 1;
}
Standard_CString arg1 = argv[1];
TopoDS_Shape Shape = DBRep::Get(arg1);
if (Shape.IsNull()) { di<<"Shape unknown : "<<arg1<<"\n"; return 1 /* Error */; }
if (Shape.ShapeType() != TopAbs_FACE) { di<<"Not a face\n"; return 1 /* Error */; }
TopoDS_Face F = TopoDS::Face (Shape);
Handle(Geom_Surface) thesurf = BRep_Tool::Surface (F); // pas locface
BRepTopAdaptor_FClass2d aClassifier (F, Precision::Confusion());
// On y va
Standard_Real X,Y,Z,U,V;
X = U = Draw::Atof (argv[2]);
@@ -167,28 +172,52 @@ static Standard_Integer projface
GeomAPI_ProjectPointOnSurf proj(P3D, thesurf, uf-du, ul+du, vf-dv, vl+dv);
Standard_Integer sol, nPSurf = proj.NbPoints();
di<<" Found "<<nPSurf<<" Points\n";
Standard_Integer anIndSol = 0, anIndMin = 0;
Standard_Real aMinDist = RealLast();
for (sol = 1; sol <= nPSurf; sol ++) {
di<<"n0 "<<sol<<" Distance "<<proj.Distance(sol);
proj.Parameters(sol, U,V);
di<<" U = "<<U<<" V = "<<V<<"\n";
TopAbs_State aStatus = aClassifier.Perform (gp_Pnt2d (U,V));
if (aStatus == TopAbs_OUT)
continue;
anIndSol++;
Standard_Real aDist = proj.Distance(sol);
di << "n0 " << anIndSol << " Distance " << aDist;
di << " U = " << U << " V = " << V << "\n";
if (aDist < aMinDist)
{
aMinDist = aDist;
anIndMin = sol;
}
// reprojection
P3D = thesurf->Value (U,V);
di<<" => reproj X = "<<P3D.X()<<" Y = "<<P3D.Y()<<" Z = "<<P3D.Z()<<"\n";
}
// Que donne ShapeTool ?
P3D.SetCoord (X,Y,Z);
Handle(ShapeAnalysis_Surface) su = new ShapeAnalysis_Surface(thesurf);
gp_Pnt2d suval = su->ValueOfUV (P3D,BRep_Tool::Tolerance(F));
suval.Coord(U,V);
di<<"** ShapeAnalysis_Surface gives U = "<<U<<" V = "<<V<<"\n";
P3D = thesurf->Value(U,V);
di<<" => reproj X = "<<P3D.X()<<" Y = "<<P3D.Y()<<" Z = "<<P3D.Z()<<"\n";
di<<" Found "<<anIndSol<<" Points\n";
} else {
di<<" Point UV U = "<<U<<" V = "<<V<<"\n";
gp_Pnt P3D = thesurf->Value(U,V);
di<<" => proj X = "<<P3D.X()<<" Y = "<<P3D.Y()<<" Z = "<<P3D.Z()<<"\n";
if (anIndMin != 0) //there is at least one suitable solution
{
di << "** Minimal distance to face = " << aMinDist << "\n";
proj.Parameters(anIndMin, U,V);
di << "** Solution of minimal distance: U = " << U << " V = " << V << "\n";
P3D = thesurf->Value(U,V);
di<<" => reproj X = "<<P3D.X()<<" Y = "<<P3D.Y()<<" Z = "<<P3D.Z()<<"\n";
}
}
else //Check 2D point
{
di << " Point UV U = " << U << " V = " << V << "\n";
TopAbs_State aStatus = aClassifier.Perform (gp_Pnt2d (U,V));
if (aStatus == TopAbs_OUT)
di << "does not belong to the face" << "\n";
else
{
gp_Pnt P3D = thesurf->Value(U,V);
di << " => proj X = " << P3D.X() << " Y = " << P3D.Y() << " Z = " << P3D.Z() << "\n";
}
}
return 0;
}
@@ -1199,7 +1228,7 @@ Standard_Integer getanacurve(Draw_Interpretor& di,
Standard_CString g = SWDRAW::GroupName();
theCommands.Add ("tolerance","shape [tolmin tolmax:real]", __FILE__,tolerance,g);
theCommands.Add ("projface","nom_face X Y [Z]", __FILE__,projface,g);
theCommands.Add ("projface","nom_face X Y [Z] - returns the closest orthogonal projection if exists", __FILE__,projface,g);
theCommands.Add ("projcurve","nom_edge | curve3d | curve3d first last + X Y Z",
__FILE__,projcurve,g);
theCommands.Add("projpcurve", "edge face tol x y z [start_param]",

View File

@@ -81,17 +81,14 @@ Handle(Select3D_SensitiveEntity) Select3D_SensitiveCylinder::GetConnected()
Select3D_BndBox3d Select3D_SensitiveCylinder::BoundingBox()
{
Standard_Real aMaxRad = Max (myBottomRadius, myTopRadius);
gp_Pnt aCenterBottom (0, 0, 0);
gp_Pnt aCenterTop (0, 0, myHeight);
aCenterBottom.Transform (myTrsf);
aCenterTop.Transform (myTrsf);
const SelectMgr_Vec3 aMinPnt (Min (aCenterBottom.X(), aCenterTop.X()) - aMaxRad,
Min (aCenterBottom.Y(), aCenterTop.Y()) - aMaxRad,
Min (aCenterBottom.Z(), aCenterTop.Z()) - aMaxRad);
const SelectMgr_Vec3 aMaxPnt (Max (aCenterBottom.X(), aCenterTop.X()) + aMaxRad,
Max (aCenterBottom.Y(), aCenterTop.Y()) + aMaxRad,
Max (aCenterBottom.Z(), aCenterTop.Z()) + aMaxRad);
return Select3D_BndBox3d (aMinPnt, aMaxPnt);
Graphic3d_Mat4d aTrsf;
myTrsf.GetMat4 (aTrsf);
Select3D_BndBox3d aBox (SelectMgr_Vec3 (-aMaxRad, -aMaxRad, 0),
SelectMgr_Vec3 (aMaxRad, aMaxRad, myHeight));
aBox.Transform (aTrsf);
return aBox;
}
//==================================================

View File

@@ -54,6 +54,18 @@ public:
//! Returns center of the cylinder with transformation applied
Standard_EXPORT virtual gp_Pnt CenterOfGeometry() const Standard_OVERRIDE;
//! Returns cylinder transformation
const gp_Trsf& Transformation() const { return myTrsf; }
//! Returns cylinder top radius
Standard_Real TopRadius() const { return myTopRadius; }
//! Returns cylinder bottom radius
Standard_Real BottomRadius() const { return myBottomRadius; }
//! Returns cylinder height
Standard_Real Height() const { return myHeight; }
protected:
gp_Trsf myTrsf; //!< cylinder transformation to apply
Standard_Real myBottomRadius; //!< cylinder bottom radius

View File

@@ -13,6 +13,7 @@
#include <SelectMgr.hxx>
#include <Geom_Circle.hxx>
#include <Graphic3d_ArrayOfPoints.hxx>
#include <Graphic3d_AspectMarker3d.hxx>
#include <Poly_Triangulation.hxx>
@@ -22,6 +23,7 @@
#include <TColgp_HArray1OfPnt.hxx>
#include <TColgp_SequenceOfPnt.hxx>
#include <Select3D_SensitiveBox.hxx>
#include <Select3D_SensitiveCylinder.hxx>
#include <Select3D_SensitiveEntity.hxx>
#include <Select3D_SensitiveFace.hxx>
#include <Select3D_SensitivePoint.hxx>
@@ -130,6 +132,43 @@ namespace
theSeqLines.Append (aPoints);
}
}
//! Fill in cylinder polylines.
static void addCylinder (Prs3d_NListOfSequenceOfPnt& theSeqLines,
const Handle(Select3D_SensitiveCylinder)& theSensCyl)
{
Handle(TColgp_HSequenceOfPnt) aVertLines[2];
aVertLines[0] = new TColgp_HSequenceOfPnt();
aVertLines[1] = new TColgp_HSequenceOfPnt();
const gp_Trsf& aTrsf = theSensCyl->Transformation();
const Standard_Real aHeight = theSensCyl->Height();
const Standard_Real anUStep = 0.1;
for (int aCircNum = 0; aCircNum < 3; aCircNum++)
{
Standard_Real aRadius = 0.5 * (2 - aCircNum) * theSensCyl->BottomRadius()
+ 0.5 * aCircNum * theSensCyl->TopRadius();
Geom_Circle aGeom (gp_Ax2(), aRadius);
Handle(TColgp_HSequenceOfPnt) aPoints = new TColgp_HSequenceOfPnt();
gp_XYZ aVec (0, 0, aHeight * 0.5 * aCircNum);
if (aCircNum != 1)
{
aVertLines[0]->Append (gp_Pnt(aGeom.Value (0).Coord() + aVec).Transformed (aTrsf));
aVertLines[1]->Append (gp_Pnt(aGeom.Value (M_PI).Coord() + aVec).Transformed (aTrsf));
}
for (Standard_Real anU = 0.0f; anU < (2.0 * M_PI + anUStep); anU += anUStep)
{
gp_Pnt aCircPnt = aGeom.Value (anU).Coord() + aVec;
aCircPnt.Transform (aTrsf);
aPoints->Append (aCircPnt);
}
theSeqLines.Append (aPoints);
}
theSeqLines.Append (aVertLines[0]);
theSeqLines.Append (aVertLines[1]);
}
}
//=======================================================================
@@ -152,6 +191,10 @@ void SelectMgr::ComputeSensitivePrs (const Handle(Graphic3d_Structure)& thePrs,
{
addBoundingBox (aSeqLines, aSensBox, theLoc);
}
else if (Handle(Select3D_SensitiveCylinder) aSensCyl = Handle(Select3D_SensitiveCylinder)::DownCast (anEnt))
{
addCylinder (aSeqLines, aSensCyl);
}
else if (Handle(Select3D_SensitiveFace) aFace = Handle(Select3D_SensitiveFace)::DownCast(anEnt))
{
Handle(TColgp_HArray1OfPnt) aSensPnts;

File diff suppressed because it is too large Load Diff

View File

@@ -390,15 +390,23 @@ void StdSelect_BRepSelectionTool::ComputeSensitive (const TopoDS_Shape& theShape
{
if (!aGeomPlanes[0].IsNull()
&& !aGeomPlanes[1].IsNull()
&& aGeomPlanes[0]->Position().Direction().IsEqual (aGeomCyl->Position().Direction(), Precision::Angular())
&& aGeomPlanes[1]->Position().Direction().IsEqual (aGeomCyl->Position().Direction(), Precision::Angular()))
&& aGeomPlanes[0]->Position().Direction().IsParallel (aGeomCyl->Position().Direction(), Precision::Angular())
&& aGeomPlanes[1]->Position().Direction().IsParallel (aGeomCyl->Position().Direction(), Precision::Angular()))
{
const gp_Cylinder aCyl = BRepAdaptor_Surface (*aFaces[aConIndex]).Cylinder();
const Standard_Real aRad = aCyl.Radius();
const Standard_Real aHeight = aGeomPlanes[0]->Location().Transformed (*aGeomPlanesLoc[0])
.Distance (aGeomPlanes[1]->Location().Transformed (*aGeomPlanesLoc[1]));
gp_Trsf aTrsf;
aTrsf.SetTransformation (aCyl.Position(), gp_Ax3());
gp_Ax3 aPos = aCyl.Position();
if (aGeomPlanes[0]->Position().IsCoplanar (aGeomPlanes[1]->Position(), Precision::Angular(), Precision::Angular()))
{
// cylinders created as a prism have an inverse vector of the cylindrical surface
aPos.SetDirection (aPos.Direction().Reversed());
}
aTrsf.SetTransformation (aPos, gp_Ax3());
Handle(Select3D_SensitiveCylinder) aSensSCyl = new Select3D_SensitiveCylinder (theOwner, aRad, aRad, aHeight, aTrsf);
theSelection->Add (aSensSCyl);
break;

View File

@@ -2500,6 +2500,11 @@ static int VDrawText (Draw_Interpretor& theDI,
}
aTextFormatter->SetWrapping ((Standard_ShortReal)Draw::Atof(theArgVec[++anArgIt]));
}
else if (aParam == "-wordwrapping")
{
const bool isWordWrapping = Draw::ParseOnOffNoIterator(theArgsNb, theArgVec, anArgIt);
aTextFormatter->SetWordWrapping(isWordWrapping);
}
else if (aParam == "-aspect"
&& anArgIt + 1 < theArgsNb)
{
@@ -6925,6 +6930,7 @@ vdrawtext name text
[-zoom {0|1}]=0
[-height height]=16
[-wrapping width]=40
[-wordwrapping {0|1}]=1
[-aspect {regular|bold|italic|boldItalic}]=regular
[-font font]=Times
[-2d] [-perspos {X Y Z}]={0 0 0}

View File

@@ -19,7 +19,10 @@
#include <DDocStd.hxx>
#include <Draw.hxx>
#include <gp_Trsf.hxx>
#include <Message.hxx>
#include <NCollection_DataMap.hxx>
#include <TCollection_AsciiString.hxx>
#include <TDF_ChildIterator.hxx>
#include <TDF_Tool.hxx>
#include <TDocStd_Document.hxx>
#include <TopoDS_Compound.hxx>
@@ -934,59 +937,140 @@ static Standard_Integer updateAssemblies(Draw_Interpretor& di, Standard_Integer
return 0;
}
static Standard_Integer XGetProperties(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
static Standard_Integer XGetProperties(Draw_Interpretor& theDI,
Standard_Integer theArgc,
const char** theArgv)
{
if (argc != 3)
if (theArgc < 2)
{
di << "Syntax error: wrong number of arguments\nUse: " << argv[0] << " Doc Label\n";
theDI.PrintHelp(theArgv[0]);
return 1;
}
Handle(TDocStd_Document) aDoc;
DDocStd::GetDocument(argv[1], aDoc);
DDocStd::GetDocument(theArgv[1], aDoc);
if (aDoc.IsNull())
{
di << "Syntax error: " << argv[1] << " is not a document\n";
theDI << "Syntax error: " << theArgv[1] << " is not a document\n";
return 1;
}
TDF_Label aLabel;
TDF_Tool::Label(aDoc->GetData(), argv[2], aLabel);
// Get XDE shape tool
Handle(XCAFDoc_ShapeTool) aShapeTool = XCAFDoc_DocumentTool::ShapeTool(aDoc->Main());
Handle(TDataStd_NamedData) aNamedData = aShapeTool->GetNamedProperties(aLabel);
if (aNamedData.IsNull())
NCollection_IndexedDataMap<TCollection_AsciiString, Handle(TDataStd_NamedData)> aNameDataMap;
for (Standard_Integer anInd = 2; anInd < theArgc; anInd++)
{
di << argv[2] << " has no properties\n";
return 0;
}
aNamedData->LoadDeferredData();
if (aNamedData->HasIntegers())
{
TColStd_DataMapOfStringInteger anIntProperties = aNamedData->GetIntegersContainer();
for (TColStd_DataMapIteratorOfDataMapOfStringInteger anIter(anIntProperties); anIter.More(); anIter.Next())
TDF_Label aLabel;
const TCollection_AsciiString anEntry = theArgv[anInd];
TDF_Tool::Label(aDoc->GetData(), anEntry, aLabel);
if (aLabel.IsNull())
{
di << anIter.Key() << " : " << anIter.Value() << "\n";
TopoDS_Shape aShape = DBRep::Get(theArgv[anInd]);
if (!aShape.IsNull())
{
aLabel = aShapeTool->FindShape(aShape);
}
}
if (!aLabel.IsNull())
{
Handle(TDataStd_NamedData) aNamedData = aShapeTool->GetNamedProperties(aLabel);
if (!aNamedData.IsNull())
{
aNameDataMap.Add(anEntry, aNamedData);
}
}
else
{
Message::SendWarning() << "Warning: incorrect argument [" << theArgv[anInd] << "]" << " is not a label";
}
}
if (aNamedData->HasReals())
if (theArgc == 2)
{
TDataStd_DataMapOfStringReal aRealProperties = aNamedData->GetRealsContainer();
for (TDataStd_DataMapIteratorOfDataMapOfStringReal anIter(aRealProperties); anIter.More(); anIter.Next())
for (TDF_ChildIterator anIter(aShapeTool->Label(), Standard_True);
anIter.More(); anIter.Next())
{
di << anIter.Key() << " : " << anIter.Value() << "\n";
const TDF_Label& aLabel = anIter.Value();
TCollection_AsciiString anEntry;
TDF_Tool::Entry(aLabel, anEntry);
Handle(TDataStd_NamedData) aNamedData = aShapeTool->GetNamedProperties(aLabel);
if (!aNamedData.IsNull())
{
aNameDataMap.Add(anEntry, aNamedData);
}
}
}
if (aNamedData->HasStrings())
for (NCollection_IndexedDataMap<TCollection_AsciiString, Handle(TDataStd_NamedData)>::Iterator aNamedDataIter(aNameDataMap);
aNamedDataIter.More(); aNamedDataIter.Next())
{
TDataStd_DataMapOfStringString aStringProperties = aNamedData->GetStringsContainer();
for (TDataStd_DataMapIteratorOfDataMapOfStringString anIter(aStringProperties); anIter.More(); anIter.Next())
if (theArgc != 3)
{
di << anIter.Key() << " : " << anIter.Value() << "\n";
theDI << "Property for [" << aNamedDataIter.Key() << "]:\n";
}
const Handle(TDataStd_NamedData)& aNamedData = aNamedDataIter.Value();
aNamedData->LoadDeferredData();
if (aNamedData->HasIntegers())
{
const TColStd_DataMapOfStringInteger& anIntProperties = aNamedData->GetIntegersContainer();
for (TColStd_DataMapIteratorOfDataMapOfStringInteger anIter(anIntProperties); anIter.More(); anIter.Next())
{
theDI << anIter.Key() << " : " << anIter.Value() << "\n";
}
}
if (aNamedData->HasReals())
{
const TDataStd_DataMapOfStringReal& aRealProperties = aNamedData->GetRealsContainer();
for (TDataStd_DataMapIteratorOfDataMapOfStringReal anIter(aRealProperties); anIter.More(); anIter.Next())
{
theDI << anIter.Key() << " : " << anIter.Value() << "\n";
}
}
if (aNamedData->HasStrings())
{
const TDataStd_DataMapOfStringString& aStringProperties = aNamedData->GetStringsContainer();
for (TDataStd_DataMapIteratorOfDataMapOfStringString anIter(aStringProperties); anIter.More(); anIter.Next())
{
theDI << anIter.Key() << " : " << anIter.Value() << "\n";
}
}
if (aNamedData->HasBytes())
{
const TDataStd_DataMapOfStringByte& aByteProperties = aNamedData->GetBytesContainer();
for (TDataStd_DataMapOfStringByte::Iterator anIter(aByteProperties); anIter.More(); anIter.Next())
{
theDI << anIter.Key() << " : " << anIter.Value() << "\n";
}
}
if (aNamedData->HasArraysOfIntegers())
{
const TDataStd_DataMapOfStringHArray1OfInteger& anArrayIntegerProperties =
aNamedData->GetArraysOfIntegersContainer();
for (TDataStd_DataMapOfStringHArray1OfInteger::Iterator anIter(anArrayIntegerProperties);
anIter.More(); anIter.Next())
{
TCollection_AsciiString aMessage(anIter.Key() + " : ");
for (TColStd_HArray1OfInteger::Iterator anSubIter(anIter.Value()->Array1());
anSubIter.More(); anSubIter.Next())
{
aMessage += " ";
aMessage += anSubIter.Value();
}
theDI << aMessage << "\n";
}
}
if (aNamedData->HasArraysOfReals())
{
const TDataStd_DataMapOfStringHArray1OfReal& anArrayRealsProperties =
aNamedData->GetArraysOfRealsContainer();
for (TDataStd_DataMapOfStringHArray1OfReal::Iterator anIter(anArrayRealsProperties);
anIter.More(); anIter.Next())
{
TCollection_AsciiString aMessage(anIter.Key() + " : ");
for (TColStd_HArray1OfReal::Iterator anSubIter(anIter.Value()->Array1());
anSubIter.More(); anSubIter.Next())
{
aMessage += " ";
aMessage += anSubIter.Value();
}
theDI << aMessage << "\n";
}
}
}
@@ -1142,7 +1226,7 @@ void XDEDRAW_Shapes::InitCommands(Draw_Interpretor& di)
di.Add ("XUpdateAssemblies","Doc \t: updates assembly compounds",
__FILE__, updateAssemblies, g);
di.Add("XGetProperties", "Doc Label \t: prints named properties assigned to the Label",
di.Add("XGetProperties", "Doc [label1, label2, ...] [shape1, shape2, ...]\t: prints named properties assigned to the all document's shape labels or chosen labels of shapes",
__FILE__, XGetProperties, g);
di.Add ("XAutoNaming","Doc [0|1]\t: Disable/enable autonaming to Document",

View File

@@ -10,7 +10,7 @@ stepread [locate_data_file bug27894_usd_raises_Standard_NullObject.stp] a *
renamevar a_1 a
unifysamedom result a
checknbshapes result -m UnifySameDomain -face 12 -edge 29
checknbshapes result -m UnifySameDomain -face 12 -edge 30
checkshape result

View File

@@ -9,7 +9,7 @@ unifysamedom result a
checkshape result
checknbshapes result -solid 1 -shell 1 -face 21 -wire 22 -edge 58 -vertex 38
checknbshapes result -solid 1 -shell 1 -face 21 -wire 22 -edge 57 -vertex 37
set tolres [checkmaxtol result]

22
tests/bugs/heal/bug33006 Normal file
View File

@@ -0,0 +1,22 @@
puts "========================================="
puts "OCC33006: UnifySameDomain raises exceptio"
puts "========================================="
puts ""
restore [locate_data_file bug33006.brep] a
unifysamedom result a
checkshape result
checknbshapes result -t -solid 1 -shell 1 -face 3 -wire 4 -edge 11 -vertex 4
set tolres [checkmaxtol result]
if { ${tolres} > 0.004416} {
puts "Error: bad tolerance of result"
}
checkprops result -s 77917.5 -v 195647
checkview -display result -2d -path ${imagedir}/${test_image}.png

View File

@@ -1,29 +0,0 @@
puts "============"
puts "OCC30217_1"
puts "============"
puts ""
#########################################################################
# Intersection between a circle and a line not detected (2d)
#########################################################################
2ddrseg s2 -80.461134694338 53.07587187722 -31.501464018476 67.029737602069
circle c2 -18.339655323916 20.849340929486 48.019394466707
# Set tolerance.
set tol_abs 1.0e-7
set tol_rel 1.0e-2
# Set reference data.
set param11 1.8484218380721342
set param12 1.8484627151687805
set param21 50.908401295062035
set param22 50.909328431594709
set info [2dintersect c2 s2 -tol 1e-8]
regexp {Curve 1 first parameter: +([-0-9.+eE]+) last parameter: +([-0-9.+eE]+)} ${info} full curve1p1 curve1p2
regexp {Curve 2 first parameter: +([-0-9.+eE]+) last parameter: +([-0-9.+eE]+)} ${info} full curve2p1 curve2p2
checkreal "Curve 1 param 1" ${curve1p1} ${param11} ${tol_abs} ${tol_rel}
checkreal "Curve 1 param 2" ${curve1p2} ${param12} ${tol_abs} ${tol_rel}
checkreal "Curve 2 param 1" ${curve2p1} ${param21} ${tol_abs} ${tol_rel}
checkreal "Curve 2 param 2" ${curve2p2} ${param22} ${tol_abs} ${tol_rel}

View File

@@ -1,26 +0,0 @@
puts "============"
puts "OCC30217_2"
puts "============"
puts ""
#########################################################################
# Intersection between a circle and a line not detected (3d)
#########################################################################
set tol_abs 2.e-7
drseg s -80.461134694338 53.07587187722 0.0 -31.501464018476 67.029737602069 0.0
circle c -18.339655323916 20.849340929486 0.0 48.019394466707
set info1 [extrema c s]
if {[regexp "ext" ${info1}] != 1} {
puts "Error : No intersection detected"
} else {
puts "OK: Intersection are detected"
}
# Distance check
set info2 [dump ext_1]
regexp "Parameters : 0 +(\[-0-9*\.+eE\]+)" $info2 full extLength
if { ${extLength} > $tol_abs } {
puts "Error: bad distance poins obtained"
} else {
puts "OK: good distance between obtained points"
}

View File

@@ -1,28 +0,0 @@
puts "============"
puts "OCC30217_3"
puts "============"
puts ""
#########################################################################
# Intersection between a circle and a line not detected (3d)
#########################################################################
set tol_abs 2.e-7
drseg s -31.501464018476 67.029737602069 -10.0 -31.501464018476 67.029737602069 0.0
circle c -18.339655323916 20.849340929486 0.0 48.019394466707
set info1 [extrema c s]
if {[regexp "ext" ${info1}] != 1} {
puts "Error : No intersection detected"
} else {
puts "OK: Intersection are detected"
}
# Distance check
set infoext1 [dump ext_1]
regexp "Parameters : 0 +(\[-0-9*\.+eE\]+)" $infoext1 full ext1Length ext2Length
if { $ext1Length > $tol_abs || $ext2Length > $tol_abs } {
puts "Error: bad distance poins obtained"
} else {
puts "OK: good distance between obtained points"
}

View File

@@ -1,20 +0,0 @@
puts "============"
puts "OCC30217_4"
puts "============"
puts ""
#########################################################################
# Intersection between a circle and a line not detected (3d)
#########################################################################
set ExpDist 5
circle c1 0 0 0 0 0 1 5
line c2 0 0 0 0 0 1
trim c2 c2 -1 -5e-8
regexp {Infinite number of extremas, distance = +([-0-9.+eE]+)} [extrema c1 c2] full aDist1
checkreal Distance $aDist1 $ExpDist 1.0e-7 0.0
regexp {Infinite number of extremas, distance = +([-0-9.+eE]+)} [extrema c2 c1] full aDist2
checkreal Distance $aDist2 $ExpDist 1.0e-7 0.0

View File

@@ -0,0 +1,39 @@
puts "================================================="
puts "0023860: Bad memory access intersecting two nearly coincident cylindrical faces"
puts "================================================="
puts ""
cylinder c1 1031.3339148728076 -113.25868616662650 56.152387686082520 \
-0.86602540378443815 0.50000000000000089 0.00000000000000000 \
-0.50000000000000089 -0.86602540378443815 0.00000000000000000 \
76.499999999999986
cylinder c2 1017.0706583606553 -103.24955863669388 56.152387686082548 \
0.86602540378443915 -0.49999999999999933 0.00000000000000000 \
0.49999999999999933 0.86602540378443915 0.00000000000000000 \
76.499999999999986
mkface f1 c1
mkface f2 c2
set curves_found [lindex [split [bopcurves f1 f2 -2d -noapprox] "\n"] 1]
if { $curves_found != "2 curve(s) found." } {
puts "Error wrong curves number"
}
smallview
donly c_1 c_2
fit
xwd ${imagedir}/${casename}_1.png
set lines [split [dump c_1] "\n"]
if { [lindex $lines 4] != " Origin :1031.71804748645, -112.593348962955, -20.34375449469 " ||
[lindex $lines 5] != " Axis :-0.866025403784438, 0.500000000000001, 0 " } {
puts "Error: wrong first curve"
}
set lines [split [dump c_2] "\n"]
if { [lindex $lines 4] != " Origin :1031.71804748645, -112.593348962957, 132.648529866855 " ||
[lindex $lines 5] != " Axis :-0.866025403784438, 0.500000000000001, 0 "} {
puts "Error: wrong second curve"
}

View File

@@ -0,0 +1,30 @@
puts "================================"
puts "OCC33080: Wrong projection point"
puts "================================"
puts ""
restore [locate_data_file bug33080.brep] a
set log [projface a -0.21115 1.17515 1.4504]
regexp {n0 1 Distance ([0-9+-.eE]*)} $log full dist
if { $dist > 0.1240364 } {
puts "Error distance: projection is wrong"
}
regexp {U = ([0-9+-.eE]*)} $log full uparam
if { $uparam < 869.174321 || $uparam > 869.174322 } {
puts "Error point: projection is wrong"
}
regexp {V = ([0-9+-.eE]*)} $log full vparam
if { $vparam < 732.602489 || $vparam > 732.602490 } {
puts "Error point: projection is wrong"
}
if {![regexp "Found 1 Points" $log]} {
puts "Error number of points: projection is wrong"
}

View File

@@ -1,5 +1,3 @@
puts "TODO OCC29040 ALL: Error: the history of the removed edges is incorrect"
puts "======="
puts "0028913"
puts "======="

View File

@@ -1,5 +1,3 @@
puts "TODO OCC29040 ALL: Error: the history of the removed edges is incorrect"
puts "======="
puts "0028913"
puts "======="

View File

@@ -4,21 +4,30 @@ puts ""
puts "==========="
pload MODELING VISUALIZATION
vinit View1
vinit View1 -width 500
vclear
vaxo
box b1 10 0 360 10 180 40
box b1 10 0 460 10 180 40
vdisplay b1
vdrawtext t1 "Top text on plane yOz\n(not wrapped)" -pos 10 5 400 -color green -plane 1 0 0 0 1 0 -valign top -font SansFont -zoom 1
vdrawtext t1 "Top text on plane yOz\n(not wrapped)" -pos 10 5 500 -color green -plane 1 0 0 0 1 0 -valign top -font SansFont -zoom 1
box b2 10 0 240 10 130 60
box b2 10 0 340 10 130 60
vdisplay b2
vdrawtext t2 "Top text on plane yOz\n(wrapping=120)" -pos 10 5 300 -color green -wrapping 120 -plane 1 0 0 0 1 0 -valign top -font SansFont -zoom 1
vdrawtext t2 "Top text on plane yOz\n(wrapping=120)" -pos 10 5 400 -color green -wrapping 120 -plane 1 0 0 0 1 0 -valign top -font SansFont -zoom 1
box b3 10 0 60 10 60 150
box b3 10 0 160 10 60 150
vdisplay b3
vdrawtext t3 "Top text on plane yOz\n(wrapping=50)" -pos 10 5 200 -color green -wrapping 50 -plane 1 0 0 0 1 0 -valign top -font SansFont -zoom 1
vdrawtext t3 "Top text on plane yOz\n(wrapping=50)" -pos 10 5 300 -color green -wrapping 50 -plane 1 0 0 0 1 0 -valign top -font SansFont -zoom 1
box b4 10 200 400 10 130 100
vdisplay b4
vdrawtext t4 "Top text on plane yOz\n(wrapping=120, word wrapping disabled)" -pos 10 205 500 -color green -wrapping 120 -plane 1 0 0 0 1 0 -valign top -font SansFont -zoom 1 -wordwrapping 0
box b5 10 200 160 10 60 200
vdisplay b5
vdrawtext t5 "Top text on plane yOz\n(wrapping=50, word wrapping disabled)" -pos 10 205 350 -color green -wrapping 50 -plane 1 0 0 0 1 0 -valign top -font SansFont -zoom 1 -wordwrapping 0
vright
vfit

View File

@@ -0,0 +1,26 @@
puts "============="
puts "0033084: Visualization - Cylindrical prism is selectable only by its base when extruded in some directions"
puts "============="
pload MODELING VISUALIZATION
profile p1 c 1 360 ww
mkplane f p1
prism pr1 f 0 0 2
prism pr2 f 0 0 -2
ttranslate pr1 1 1 1
ttranslate pr2 -1 -1 -1
vinit View1
vclear
vaxo
vdisplay -dispmode 1 pr1 pr2
vfit
vsensdis
vdump $imagedir/${casename}_prism_sensitive_prs.png
vmoveto 130 330
if { ![string match "*Select3D_SensitiveCylinder*" [vstate -entities]] } { puts "Error: cylinder should be detected" }
vmoveto 270 130
if { ![string match "*Select3D_SensitiveCylinder*" [vstate -entities]] } { puts "Error: cylinder should be detected" }