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 | Date | |
---|---|---|---|
|
a0c6a637fa | ||
|
81d569625e | ||
|
6072d3093c | ||
|
e1b097eb67 | ||
|
92d22d7d62 | ||
|
1b423e3287 |
@@ -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]);
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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]",
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
//==================================================
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
@@ -1504,8 +1504,7 @@ Standard_Boolean ShapeAnalysis_Wire::CheckIntersectingEdges (const Standard_Inte
|
||||
|
||||
Standard_Boolean ShapeAnalysis_Wire::CheckLacking (const Standard_Integer num,
|
||||
const Standard_Real Tolerance,
|
||||
gp_Pnt2d &p2d1, gp_Pnt2d &p2d2,
|
||||
gp_Vec2d& theTangent1, gp_Vec2d& theTangent2)
|
||||
gp_Pnt2d &p2d1, gp_Pnt2d &p2d2)
|
||||
{
|
||||
myStatus = ShapeExtend::EncodeStatus (ShapeExtend_OK);
|
||||
if ( ! IsReady() ) return Standard_False;
|
||||
@@ -1530,24 +1529,22 @@ Standard_Boolean ShapeAnalysis_Wire::CheckLacking (const Standard_Integer num,
|
||||
}
|
||||
|
||||
Standard_Real a, b;
|
||||
gp_Vec2d /*v1, v2,*/ v12;
|
||||
gp_Vec2d v1, v2, v12;
|
||||
Handle(Geom2d_Curve) c2d;
|
||||
if ( ! sae.PCurve ( E1, myFace, c2d, a, b, Standard_True ) ) {
|
||||
myStatus |= ShapeExtend::EncodeStatus (ShapeExtend_FAIL3);
|
||||
return Standard_False;
|
||||
}
|
||||
Geom2dAdaptor_Curve anAdapt(c2d);
|
||||
anAdapt.D1(b, p2d1, theTangent1);
|
||||
if ( E1.Orientation() == TopAbs_REVERSED )
|
||||
theTangent1.Reverse();
|
||||
anAdapt.D1(b, p2d1, v1);
|
||||
if ( E1.Orientation() == TopAbs_REVERSED ) v1.Reverse();
|
||||
if ( ! sae.PCurve ( E2, myFace, c2d, a, b, Standard_True ) ) {
|
||||
myStatus |= ShapeExtend::EncodeStatus (ShapeExtend_FAIL3);
|
||||
return Standard_False;
|
||||
}
|
||||
anAdapt.Load(c2d);
|
||||
anAdapt.D1(a, p2d2, theTangent2);
|
||||
if ( E2.Orientation() == TopAbs_REVERSED )
|
||||
theTangent2.Reverse();
|
||||
anAdapt.D1(a, p2d2, v2);
|
||||
if ( E2.Orientation() == TopAbs_REVERSED ) v2.Reverse();
|
||||
v12 = p2d2.XY() - p2d1.XY();
|
||||
myMax2d = v12.SquareMagnitude();
|
||||
|
||||
@@ -1564,8 +1561,8 @@ Standard_Boolean ShapeAnalysis_Wire::CheckLacking (const Standard_Integer num,
|
||||
myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE1 );
|
||||
|
||||
if ( myMax2d < Precision::PConfusion() || //:abv 03.06.02 CTS21866.stp
|
||||
( theTangent1.SquareMagnitude() > gp::Resolution() && Abs ( v12.Angle ( theTangent1 ) ) > 0.9 * M_PI ) ||
|
||||
( theTangent2.SquareMagnitude() > gp::Resolution() && Abs ( v12.Angle ( theTangent2 ) ) > 0.9 * M_PI ) )
|
||||
( v1.SquareMagnitude() > gp::Resolution() && Abs ( v12.Angle ( v1 ) ) > 0.9 * M_PI ) ||
|
||||
( v2.SquareMagnitude() > gp::Resolution() && Abs ( v12.Angle ( v2 ) ) > 0.9 * M_PI ) )
|
||||
myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE2 );
|
||||
return Standard_True;
|
||||
}
|
||||
@@ -1580,8 +1577,7 @@ Standard_Boolean ShapeAnalysis_Wire::CheckLacking (const Standard_Integer num,
|
||||
const Standard_Real Tolerance)
|
||||
{
|
||||
gp_Pnt2d p1, p2;
|
||||
gp_Vec2d aTangent1, aTangent2;
|
||||
return CheckLacking (num, Tolerance, p1, p2, aTangent1, aTangent2);
|
||||
return CheckLacking (num, Tolerance, p1, p2);
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
|
@@ -403,10 +403,7 @@ public:
|
||||
//! DONE2: is set (together with DONE1) if gap is detected and the
|
||||
//! vector (p2d2 - p2d1) goes in direction opposite to the pcurves
|
||||
//! of the edges (if angle is more than 0.9*PI).
|
||||
Standard_EXPORT Standard_Boolean CheckLacking (const Standard_Integer num,
|
||||
const Standard_Real Tolerance,
|
||||
gp_Pnt2d& p2d1, gp_Pnt2d& p2d2,
|
||||
gp_Vec2d& theTangent1, gp_Vec2d& theTangent2);
|
||||
Standard_EXPORT Standard_Boolean CheckLacking (const Standard_Integer num, const Standard_Real Tolerance, gp_Pnt2d& p2d1, gp_Pnt2d& p2d2);
|
||||
|
||||
//! Checks if there is a gap in 2D between edges and not comprised by vertex tolerance
|
||||
//! The value of SBWD.thepreci is used.
|
||||
|
@@ -2930,8 +2930,7 @@ Standard_Boolean ShapeFix_Wire::FixLacking (const Standard_Integer num,
|
||||
//=============
|
||||
// First phase: analysis whether the problem (gap) exists
|
||||
gp_Pnt2d p2d1, p2d2;
|
||||
gp_Vec2d aTangent1, aTangent2;
|
||||
myAnalyzer->CheckLacking (num, ( force ? Precision() : 0. ), p2d1, p2d2, aTangent1, aTangent2);
|
||||
myAnalyzer->CheckLacking ( num, ( force ? Precision() : 0. ), p2d1, p2d2 );
|
||||
if ( myAnalyzer->LastCheckStatus ( ShapeExtend_FAIL ) ) {
|
||||
myLastFixStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_FAIL1 );
|
||||
}
|
||||
@@ -3053,28 +3052,8 @@ Standard_Boolean ShapeFix_Wire::FixLacking (const Standard_Integer num,
|
||||
gp_Pnt pV = 0.5 * ( BRep_Tool::Pnt(V1).XYZ() + BRep_Tool::Pnt(V2).XYZ() );
|
||||
gp_Pnt pm = myAnalyzer->Surface()->Value ( 0.5 * ( p2d1.XY() + p2d2.XY() ) );
|
||||
|
||||
//Additional check
|
||||
//const Standard_Real anAngularTol = 1.e-5;
|
||||
const Standard_Real aMaxAngle = 7*M_PI/8;
|
||||
Standard_Boolean anIsGoodConnection = Standard_True;
|
||||
gp_Vec2d aVecP1P2 (p2d1, p2d2);
|
||||
if (aVecP1P2.SquareMagnitude() > Precision::SquareConfusion() &&
|
||||
aTangent1.SquareMagnitude() > Precision::SquareConfusion() &&
|
||||
aTangent2.SquareMagnitude() > Precision::SquareConfusion())
|
||||
{
|
||||
Standard_Real anAngle1 = aTangent1.Angle (aVecP1P2);
|
||||
Standard_Real anAngle2 = aVecP1P2.Angle (aTangent2);
|
||||
if (Abs(anAngle1) > aMaxAngle ||
|
||||
Abs(anAngle2) > aMaxAngle)
|
||||
anIsGoodConnection = Standard_False;
|
||||
}
|
||||
|
||||
Standard_Real dist = pV.Distance ( pm );
|
||||
if ( dist <= tol )
|
||||
{
|
||||
if (anIsGoodConnection)
|
||||
doAddDegen = Standard_True;
|
||||
}
|
||||
if ( dist <= tol ) doAddDegen = Standard_True;
|
||||
else if ( myTopoMode ) doAddClosed = Standard_True;
|
||||
else if ( dist <= MaxTolerance() ) { //:r7 abv 12 Apr 99: t3d_opt.stp #14245 after S4136
|
||||
doAddDegen = Standard_True;
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
|
@@ -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}
|
||||
|
@@ -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",
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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
22
tests/bugs/heal/bug33006
Normal 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
|
39
tests/bugs/modalg_8/bug23860
Normal file
39
tests/bugs/modalg_8/bug23860
Normal 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"
|
||||
}
|
30
tests/bugs/modalg_8/bug33080
Normal file
30
tests/bugs/modalg_8/bug33080
Normal 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"
|
||||
}
|
@@ -1,5 +1,3 @@
|
||||
puts "TODO OCC29040 ALL: Error: the history of the removed edges is incorrect"
|
||||
|
||||
puts "======="
|
||||
puts "0028913"
|
||||
puts "======="
|
||||
|
@@ -1,5 +1,3 @@
|
||||
puts "TODO OCC29040 ALL: Error: the history of the removed edges is incorrect"
|
||||
|
||||
puts "======="
|
||||
puts "0028913"
|
||||
puts "======="
|
||||
|
@@ -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
|
||||
|
26
tests/vselect/bugs/bug33084
Normal file
26
tests/vselect/bugs/bug33084
Normal 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" }
|
Reference in New Issue
Block a user