1 // Created on: 1998-11-12
2 // Created by: Robert COUBLANC
3 // Copyright (c) 1998-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <ViewerTest.hxx>
19 #include <AIS_PlaneTrihedron.hxx>
21 #include <Quantity_NameOfColor.hxx>
22 #include <Draw_Interpretor.hxx>
24 #include <Draw_Appli.hxx>
26 #include <DBRep_DrawableShape.hxx>
28 #include <Font_BRepFont.hxx>
29 #include <Font_BRepTextBuilder.hxx>
30 #include <Font_FontMgr.hxx>
31 #include <Message.hxx>
32 #include <NCollection_List.hxx>
34 #include <OSD_Chronometer.hxx>
35 #include <TCollection_AsciiString.hxx>
36 #include <V3d_Viewer.hxx>
37 #include <V3d_View.hxx>
40 #include <AIS_Shape.hxx>
41 #include <AIS_DisplayMode.hxx>
42 #include <AIS_PointCloud.hxx>
43 #include <TColStd_MapOfInteger.hxx>
44 #include <ViewerTest_AutoUpdater.hxx>
45 #include <ViewerTest_DoubleMapOfInteractiveAndName.hxx>
46 #include <ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName.hxx>
47 #include <ViewerTest_EventManager.hxx>
49 #include <TopoDS_Solid.hxx>
50 #include <BRepTools.hxx>
51 #include <BRep_Builder.hxx>
52 #include <TopAbs_ShapeEnum.hxx>
55 #include <BRep_Tool.hxx>
56 #include <TopExp_Explorer.hxx>
58 #include <BRepAdaptor_Curve.hxx>
59 #include <BRepAdaptor_Surface.hxx>
63 #include <TopoDS_Vertex.hxx>
64 #include <TopoDS_Shape.hxx>
65 #include <TopoDS_Face.hxx>
67 #include <Draw_Window.hxx>
68 #include <AIS_ListIteratorOfListOfInteractive.hxx>
69 #include <AIS_ListOfInteractive.hxx>
70 #include <AIS_ColoredShape.hxx>
71 #include <AIS_DisplayMode.hxx>
72 #include <AIS_Shape.hxx>
74 #include <AIS_InteractiveContext.hxx>
75 #include <Geom_Plane.hxx>
77 #include <TCollection_ExtendedString.hxx>
78 #include <TCollection_HAsciiString.hxx>
79 #include <GC_MakePlane.hxx>
80 #include <gp_Circ.hxx>
81 #include <AIS_Axis.hxx>
82 #include <Geom_Axis2Placement.hxx>
83 #include <Geom_Axis1Placement.hxx>
84 #include <AIS_Trihedron.hxx>
85 #include <AIS_Axis.hxx>
86 #include <gp_Trsf.hxx>
87 #include <gp_Quaternion.hxx>
88 #include <TopLoc_Location.hxx>
90 #include <HLRAlgo_Projector.hxx>
91 #include <HLRBRep_Algo.hxx>
92 #include <HLRBRep_PolyAlgo.hxx>
93 #include <HLRBRep_PolyHLRToShape.hxx>
94 #include <HLRBRep_HLRToShape.hxx>
95 #include <Aspect_Window.hxx>
97 #include <Graphic3d_ArrayOfPoints.hxx>
98 #include <Graphic3d_ArrayOfSegments.hxx>
99 #include <Graphic3d_ArrayOfPolylines.hxx>
100 #include <Graphic3d_ArrayOfTriangles.hxx>
101 #include <Graphic3d_ArrayOfTriangleFans.hxx>
102 #include <Graphic3d_ArrayOfTriangleStrips.hxx>
103 #include <Graphic3d_ArrayOfQuadrangles.hxx>
104 #include <Graphic3d_ArrayOfQuadrangleStrips.hxx>
105 #include <Graphic3d_ArrayOfPolygons.hxx>
106 #include <Graphic3d_AttribBuffer.hxx>
107 #include <Graphic3d_AspectMarker3d.hxx>
108 #include <Graphic3d_Group.hxx>
109 #include <Standard_Real.hxx>
111 #include <AIS_Circle.hxx>
112 #include <BRepBuilderAPI_MakeEdge.hxx>
113 #include <BRepBuilderAPI_MakeFace.hxx>
114 #include <BRepBuilderAPI_MakeWire.hxx>
115 #include <Geom_Circle.hxx>
116 #include <GC_MakeCircle.hxx>
117 #include <Select3D_SensitiveCircle.hxx>
118 #include <SelectMgr_EntityOwner.hxx>
119 #include <SelectMgr_Selection.hxx>
120 #include <StdFail_NotDone.hxx>
121 #include <StdPrs_ShadedShape.hxx>
122 #include <TopoDS_Wire.hxx>
124 #include <AIS_MultipleConnectedInteractive.hxx>
125 #include <AIS_ConnectedInteractive.hxx>
126 #include <AIS_TextLabel.hxx>
127 #include <TopLoc_Location.hxx>
128 #include <TColStd_ListOfInteger.hxx>
129 #include <TColStd_ListIteratorOfListOfInteger.hxx>
131 #include <Select3D_SensitiveSegment.hxx>
132 #include <Select3D_SensitivePrimitiveArray.hxx>
133 #include <Select3D_SensitivePoint.hxx>
134 #include <BRepAdaptor_Curve.hxx>
135 #include <StdPrs_Curve.hxx>
137 #include <BRepExtrema_ExtPC.hxx>
138 #include <BRepExtrema_ExtPF.hxx>
140 #include <Prs3d_Arrow.hxx>
141 #include <Prs3d_ArrowAspect.hxx>
142 #include <Prs3d_DatumAttribute.hxx>
143 #include <Prs3d_DatumAspect.hxx>
144 #include <Prs3d_Drawer.hxx>
145 #include <Prs3d_VertexDrawMode.hxx>
146 #include <Prs3d_LineAspect.hxx>
147 #include <Prs3d_PointAspect.hxx>
148 #include <Prs3d_Presentation.hxx>
149 #include <Prs3d_TextAspect.hxx>
150 #include <Prs3d_ToolCylinder.hxx>
151 #include <Prs3d_ToolSphere.hxx>
152 #include <Prs3d_ToolTorus.hxx>
154 #include <Image_AlienPixMap.hxx>
155 #include <TColStd_HArray1OfAsciiString.hxx>
156 #include <TColStd_HSequenceOfAsciiString.hxx>
158 extern ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS();
159 extern Standard_Boolean VDisplayAISObject (const TCollection_AsciiString& theName,
160 const Handle(AIS_InteractiveObject)& theAISObj,
161 Standard_Boolean theReplaceIfExists = Standard_True);
162 extern Handle(AIS_InteractiveContext)& TheAISContext();
166 static bool convertToColor (const Handle(TColStd_HSequenceOfAsciiString)& theColorValues,
167 Quantity_Color& theColor)
169 const char* anArgs[3] =
171 theColorValues->Size() >= 1 ? theColorValues->Value (1).ToCString() : "",
172 theColorValues->Size() >= 2 ? theColorValues->Value (2).ToCString() : "",
173 theColorValues->Size() >= 3 ? theColorValues->Value (3).ToCString() : ""
175 return Draw::ParseColor (theColorValues->Size(), anArgs, theColor) != 0;
178 static bool convertToDatumPart (const TCollection_AsciiString& theValue,
179 Prs3d_DatumParts& theDatumPart)
181 TCollection_AsciiString aValue = theValue;
183 if (aValue == "origin") theDatumPart = Prs3d_DatumParts_Origin;
184 else if (aValue == "xaxis") theDatumPart = Prs3d_DatumParts_XAxis;
185 else if (aValue == "yaxis") theDatumPart = Prs3d_DatumParts_YAxis;
186 else if (aValue == "zaxis") theDatumPart = Prs3d_DatumParts_ZAxis;
187 else if (aValue == "xarrow") theDatumPart = Prs3d_DatumParts_XArrow;
188 else if (aValue == "yarrow") theDatumPart = Prs3d_DatumParts_YArrow;
189 else if (aValue == "zarrow") theDatumPart = Prs3d_DatumParts_ZArrow;
190 else if (aValue == "xoyaxis") theDatumPart = Prs3d_DatumParts_XOYAxis;
191 else if (aValue == "yozaxis") theDatumPart = Prs3d_DatumParts_YOZAxis;
192 else if (aValue == "xozaxis") theDatumPart = Prs3d_DatumParts_XOZAxis;
193 else if (aValue == "whole") theDatumPart = Prs3d_DatumParts_None;
201 static void convertToDatumParts (const TCollection_AsciiString& theValue,
202 NCollection_List<Prs3d_DatumParts>& theParts)
204 TCollection_AsciiString aValue = theValue;
205 const Standard_Integer aSplitPos = theValue.Search ("|");
206 Prs3d_DatumParts aPart = Prs3d_DatumParts_None;
209 convertToDatumParts (theValue.SubString (aSplitPos + 1, theValue.Length()), theParts);
210 if (aSplitPos == 1) // first symbol
214 aValue = theValue.SubString (1, aSplitPos - 1);
216 if (convertToDatumPart (aValue, aPart))
218 theParts.Append (aPart);
222 static bool convertToDatumAttribute (const TCollection_AsciiString& theValue,
223 Prs3d_DatumAttribute& theAttribute)
225 TCollection_AsciiString aValue = theValue;
227 if (aValue == "xaxislength") theAttribute = Prs3d_DatumAttribute_XAxisLength;
228 else if (aValue == "yaxislength") theAttribute = Prs3d_DatumAttribute_YAxisLength;
229 else if (aValue == "zaxislength") theAttribute = Prs3d_DatumAttribute_ZAxisLength;
230 else if (aValue == "tuberadiuspercent") theAttribute = Prs3d_DatumAttribute_ShadingTubeRadiusPercent;
231 else if (aValue == "coneradiuspercent") theAttribute = Prs3d_DatumAttribute_ShadingConeRadiusPercent;
232 else if (aValue == "conelengthpercent") theAttribute = Prs3d_DatumAttribute_ShadingConeLengthPercent;
233 else if (aValue == "originradiuspercent") theAttribute = Prs3d_DatumAttribute_ShadingOriginRadiusPercent;
234 else if (aValue == "shadingnumberoffacettes") theAttribute = Prs3d_DatumAttribute_ShadingNumberOfFacettes;
240 static void convertToDatumAttributes (const TCollection_AsciiString& theValue,
241 NCollection_List<Prs3d_DatumAttribute>& theAttributes)
243 TCollection_AsciiString aValue = theValue;
244 const Standard_Integer aSplitPos = theValue.Search ("|");
245 Prs3d_DatumAttribute anAttribute = Prs3d_DatumAttribute_XAxisLength;
248 convertToDatumAttributes (theValue.SubString (aSplitPos + 1, theValue.Length()), theAttributes);
249 if (aSplitPos == 1) // first symbol
253 aValue = theValue.SubString (1, aSplitPos - 1);
255 if (convertToDatumAttribute (aValue, anAttribute))
257 theAttributes.Append (anAttribute);
261 static bool convertToDatumAxes (const TCollection_AsciiString& theValue,
262 Prs3d_DatumAxes& theDatumAxes)
264 TCollection_AsciiString aValue = theValue;
266 if (aValue == "x") theDatumAxes = Prs3d_DatumAxes_XAxis;
267 else if (aValue == "y") theDatumAxes = Prs3d_DatumAxes_YAxis;
268 else if (aValue == "z") theDatumAxes = Prs3d_DatumAxes_ZAxis;
269 else if (aValue == "xy") theDatumAxes = Prs3d_DatumAxes_XYAxes;
270 else if (aValue == "zy") theDatumAxes = Prs3d_DatumAxes_YZAxes;
271 else if (aValue == "xz") theDatumAxes = Prs3d_DatumAxes_XZAxes;
272 else if (aValue == "xyz") theDatumAxes = Prs3d_DatumAxes_XYZAxes;
280 static Standard_Boolean setTrihedronParams (Standard_Integer theArgsNb,
281 const char** theArgVec,
282 Handle(AIS_Trihedron) theTrihedron)
284 NCollection_DataMap<TCollection_AsciiString, Handle(TColStd_HSequenceOfAsciiString)> aMapOfArgs;
285 TCollection_AsciiString aParseKey;
286 for (Standard_Integer anArgIt = 1; anArgIt < theArgsNb; ++anArgIt)
288 TCollection_AsciiString anArg (theArgVec [anArgIt]);
289 if (anArg.Value (1) == '-'
290 && !anArg.IsRealValue (Standard_True))
293 aParseKey.Remove (1);
294 aParseKey.LowerCase();
295 std::string aKey = aParseKey.ToCString();
296 aMapOfArgs.Bind (aParseKey, new TColStd_HSequenceOfAsciiString());
300 if (aParseKey.IsEmpty())
305 aMapOfArgs (aParseKey)->Append (anArg);
309 if ((aMapOfArgs.IsBound ("xaxis") && !aMapOfArgs.IsBound ("zaxis"))
310 || (!aMapOfArgs.IsBound ("xaxis") && aMapOfArgs.IsBound ("zaxis")))
312 Message::SendFail ("Syntax error: -xaxis and -zaxis parameters are to set together");
313 return Standard_False;
316 Handle(TColStd_HSequenceOfAsciiString) aValues;
317 Handle(Geom_Axis2Placement) aComponent = theTrihedron->Component();
318 if (aMapOfArgs.Find ("origin", aValues))
320 aComponent->SetLocation (gp_Pnt (aValues->Value (1).RealValue(),
321 aValues->Value (2).RealValue(),
322 aValues->Value (3).RealValue()));
324 Handle(TColStd_HSequenceOfAsciiString) aXValues, aZValues;
325 if (aMapOfArgs.Find ("xaxis", aXValues) && aMapOfArgs.Find ("zaxis", aZValues))
327 gp_Dir aXDir (aXValues->Value (1).RealValue(),
328 aXValues->Value (2).RealValue(),
329 aXValues->Value (3).RealValue());
331 gp_Dir aZDir (aZValues->Value (1).RealValue(),
332 aZValues->Value (2).RealValue(),
333 aZValues->Value (3).RealValue());
335 if (!aZDir.IsNormal (aXDir, M_PI / 180.0))
337 Message::SendFail ("Syntax error - parameters 'xaxis' and 'zaxis' are not applied as VectorX is not normal to VectorZ");
338 return Standard_False;
341 aComponent->SetAx2 (gp_Ax2 (aComponent->Location(), aZDir, aXDir));
344 if (aMapOfArgs.Find ("dispmode", aValues))
346 TCollection_AsciiString aValue (aValues->Value (1));
347 bool isWireframe = true;
348 if (aValue.IsEqual ("sh") || aValue.IsEqual ("shading"))
350 theTrihedron->SetDatumDisplayMode (isWireframe ? Prs3d_DM_WireFrame
354 if (aMapOfArgs.Find ("hidelabels", aValues))
356 Standard_Boolean toHideLabels = Standard_True;
357 if (aValues->Size() == 1)
359 Draw::ParseOnOff (aValues->First().ToCString(), toHideLabels);
361 else if (aValues->Size() != 0)
363 Message::SendFail ("Syntax error: -hidelabels expects parameter 'on' or 'off' after");
364 return Standard_False;
367 if (!theTrihedron->Attributes()->HasOwnDatumAspect())
369 theTrihedron->Attributes()->SetDatumAspect (new Prs3d_DatumAspect());
371 theTrihedron->Attributes()->DatumAspect()->SetDrawLabels (!toHideLabels);
374 if (aMapOfArgs.Find ("hidearrows", aValues))
376 Standard_Boolean toHideArrows = Standard_True;
377 if (aValues->Size() == 1)
379 Draw::ParseOnOff (aValues->First().ToCString(), toHideArrows);
381 else if (aValues->Size() != 0)
383 Message::SendFail ("Syntax error: -hidearrows expects parameter 'on' or 'off' after");
384 return Standard_False;
387 if (!theTrihedron->Attributes()->HasOwnDatumAspect())
389 theTrihedron->Attributes()->SetDatumAspect (new Prs3d_DatumAspect());
391 theTrihedron->Attributes()->DatumAspect()->SetDrawArrows (!toHideArrows);
394 if (aMapOfArgs.Find ("color", aValues))
396 NCollection_List<Prs3d_DatumParts> aParts;
397 if (aValues->Size() < 2)
399 Message::SendFail ("Syntax error: -color wrong parameters");
400 return Standard_False;
403 convertToDatumParts (aValues->Value(1), aParts);
404 aValues->Remove (1); // datum part is processed
405 Quantity_Color aColor;
406 if (!convertToColor (aValues, aColor))
408 Message::SendFail ("Syntax error: -color wrong parameters");
409 return Standard_False;
412 for (NCollection_List<Prs3d_DatumParts>::Iterator anIterator (aParts); anIterator.More(); anIterator.Next())
414 Prs3d_DatumParts aDatumPart = anIterator.Value();
415 if (aDatumPart == Prs3d_DatumParts_None)
417 theTrihedron->SetColor (aColor);
421 theTrihedron->SetDatumPartColor (aDatumPart, aColor);
426 if (aMapOfArgs.Find ("textcolor", aValues))
428 Prs3d_DatumParts aDatumPart = Prs3d_DatumParts_None;
429 if (!aValues->IsEmpty()
430 && convertToDatumPart (aValues->First(), aDatumPart)
431 && aDatumPart >= Prs3d_DatumParts_XAxis
432 && aDatumPart <= Prs3d_DatumParts_ZAxis)
434 aValues->Remove (1); // datum part is processed
437 Quantity_Color aColor;
438 if (!convertToColor (aValues, aColor))
440 Message::SendFail ("Syntax error: -textcolor wrong parameters");
441 return Standard_False;
444 if (aDatumPart != Prs3d_DatumParts_None)
446 theTrihedron->SetTextColor (aDatumPart, aColor);
450 theTrihedron->SetTextColor (aColor);
454 if (aMapOfArgs.Find ("arrowcolor", aValues))
456 Prs3d_DatumParts aDatumPart = Prs3d_DatumParts_None;
457 if (!aValues->IsEmpty()
458 && convertToDatumPart (aValues->First(), aDatumPart)
459 && ((aDatumPart >= Prs3d_DatumParts_XArrow && aDatumPart <= Prs3d_DatumParts_ZArrow)
460 || (aDatumPart >= Prs3d_DatumParts_XAxis && aDatumPart <= Prs3d_DatumParts_ZAxis)))
462 aValues->Remove (1); // datum part is processed
465 Quantity_Color aColor;
466 if (!convertToColor (aValues, aColor))
468 Message::SendFail ("Syntax error: -arrowcolor wrong parameters");
469 return Standard_False;
472 if (aDatumPart != Prs3d_DatumParts_None)
474 Prs3d_DatumParts anArrowPart = Prs3d_DatumAspect::ArrowPartForAxis (aDatumPart);
475 theTrihedron->SetArrowColor (anArrowPart, aColor);
479 theTrihedron->SetArrowColor (aColor);
483 if (aMapOfArgs.Find ("attribute", aValues))
485 NCollection_List<Prs3d_DatumAttribute> anAttributes;
486 if (aValues->Size() != 2)
488 Message::SendFail ("Syntax error: -attribute wrong parameters");
489 return Standard_False;
492 convertToDatumAttributes (aValues->Value (1), anAttributes);
493 if (!theTrihedron->Attributes()->HasOwnDatumAspect())
494 theTrihedron->Attributes()->SetDatumAspect(new Prs3d_DatumAspect());
495 for (NCollection_List<Prs3d_DatumAttribute>::Iterator anIterator (anAttributes); anIterator.More(); anIterator.Next())
497 theTrihedron->Attributes()->DatumAspect()->SetAttribute (anIterator.Value(), aValues->Value (2).RealValue());
501 if (aMapOfArgs.Find ("priority", aValues))
503 Prs3d_DatumParts aDatumPart;
504 if (aValues->Size() < 2
505 || !convertToDatumPart (aValues->Value (1), aDatumPart))
507 Message::SendFail ("Syntax error: -priority wrong parameters");
508 return Standard_False;
510 theTrihedron->SetSelectionPriority (aDatumPart, aValues->Value (2).IntegerValue());
513 if (aMapOfArgs.Find ("labels", aValues)
514 || aMapOfArgs.Find ("label", aValues))
516 Prs3d_DatumParts aDatumPart = Prs3d_DatumParts_None;
517 if (aValues->Size() >= 2
518 && convertToDatumPart(aValues->Value(1), aDatumPart)
519 && aDatumPart >= Prs3d_DatumParts_XAxis
520 && aDatumPart <= Prs3d_DatumParts_ZAxis) // labels are set to axes only
522 theTrihedron->SetLabel (aDatumPart, aValues->Value (2));
526 Message::SendFail ("Syntax error: -labels wrong parameters");
527 return Standard_False;
531 if (aMapOfArgs.Find ("drawaxes", aValues))
533 Prs3d_DatumAxes aDatumAxes = Prs3d_DatumAxes_XAxis;
534 if (aValues->Size() < 1
535 || !convertToDatumAxes (aValues->Value (1), aDatumAxes))
537 Message::SendFail ("Syntax error: -drawaxes wrong parameters");
538 return Standard_False;
540 if (!theTrihedron->Attributes()->HasOwnDatumAspect())
541 theTrihedron->Attributes()->SetDatumAspect(new Prs3d_DatumAspect());
542 theTrihedron->Attributes()->DatumAspect()->SetDrawDatumAxes (aDatumAxes);
544 return Standard_True;
547 //! Auxiliary function to parse font aspect style argument
548 static Standard_Boolean parseFontStyle (const TCollection_AsciiString& theArg,
549 Font_FontAspect& theAspect)
551 if (theArg == "regular"
552 || *theArg.ToCString() == 'r')
554 theAspect = Font_FA_Regular;
555 return Standard_True;
557 else if (theArg == "bolditalic"
558 || theArg == "bold-italic"
559 || theArg == "italic-bold"
560 || theArg == "italicbold")
562 theAspect = Font_FA_BoldItalic;
563 return Standard_True;
565 else if (theArg == "bold"
566 || *theArg.ToCString() == 'b')
568 theAspect = Font_FA_Bold;
569 return Standard_True;
571 else if (theArg == "italic"
572 || *theArg.ToCString() == 'i')
574 theAspect = Font_FA_Italic;
575 return Standard_True;
577 return Standard_False;
580 //! Auxiliary function to parse font strict level argument
581 static Standard_Integer parseFontStrictLevel (const Standard_Integer theArgNb,
582 const char** theArgVec,
583 Font_StrictLevel& theLevel)
587 TCollection_AsciiString anArg (theArgVec[0]);
591 theLevel = Font_StrictLevel_Any;
594 else if (anArg == "aliases")
596 theLevel = Font_StrictLevel_Aliases;
599 else if (anArg == "strict")
601 theLevel = Font_StrictLevel_Strict;
605 theLevel = Font_StrictLevel_Strict;
610 //==============================================================================
611 //function : Vtrihedron 2d
612 //purpose : Create a plane with a 2D trihedron from a faceselection
613 //Draw arg : vtri2d name
614 //==============================================================================
615 static int VTrihedron2D (Draw_Interpretor& /*theDI*/,
616 Standard_Integer theArgsNum,
617 const char** theArgVec)
619 if (ViewerTest::CurrentView().IsNull())
621 Message::SendFail ("Error: no active viewer");
626 Message::SendFail() << "Syntax error: wrong number of arguments.";
630 TopTools_ListOfShape aShapes;
631 ViewerTest::GetSelectedShapes (aShapes);
633 if (aShapes.Extent() != 1)
635 Message::SendFail ("Error: wrong number of selected shapes.");
639 const TopoDS_Shape& aShape = aShapes.First();
641 TopoDS_Face aFace = TopoDS::Face (aShape);
642 TopExp_Explorer aFaceExp (aFace, TopAbs_EDGE);
643 TopoDS_Edge anEdge0 = TopoDS::Edge (aFaceExp.Current());
649 TopoDS_Edge anEdge1 = TopoDS::Edge (aFaceExp.Current() );
650 BRepAdaptor_Curve aCurve0 (anEdge0);
651 BRepAdaptor_Curve aCurve1 (anEdge1);
652 A = aCurve1.Value (0.1);
653 B = aCurve1.Value (0.9);
654 C = aCurve0.Value (0.5);
658 BRepAdaptor_Curve aCurve0 (anEdge0);
659 A = aCurve0.Value (0.1);
660 B = aCurve0.Value (0.9);
661 C = aCurve0.Value (0.5);
664 GC_MakePlane aMkPlane (A,B,C);
666 Handle(AIS_PlaneTrihedron) anAISPlaneTri = new AIS_PlaneTrihedron (aMkPlane.Value());
667 TCollection_AsciiString aName (theArgVec[1]);
669 VDisplayAISObject (aName, anAISPlaneTri);
674 //=======================================================================
675 //function : VTrihedron
677 //=======================================================================
678 static int VTrihedron (Draw_Interpretor& ,
679 Standard_Integer theArgsNb,
680 const char** theArgVec)
682 if (ViewerTest::CurrentView().IsNull())
684 Message::SendFail ("Error: no active viewer");
689 Message::SendFail ("Syntax error: the wrong number of input parameters");
693 TCollection_AsciiString aName (theArgVec[1]);
694 gp_Pln aWorkingPlane;
695 Standard_Boolean toUpdate = Standard_True;
697 NCollection_DataMap<TCollection_AsciiString, Standard_Real> aRealParams;
698 NCollection_DataMap<TCollection_AsciiString, TCollection_AsciiString> aStringParams;
700 Handle(AIS_Trihedron) aTrihedron;
701 Handle(AIS_InteractiveObject) anObject;
702 if (GetMapOfAIS().Find2 (aName, anObject))
704 aTrihedron = Handle(AIS_Trihedron)::DownCast (anObject);
705 if (aTrihedron.IsNull())
707 Message::SendFail ("Syntax error: no trihedron with this name");
713 Handle(Geom_Axis2Placement) aPlacement = new Geom_Axis2Placement (gp_Pnt (0.0, 0.0, 0.0),
715 aTrihedron = new AIS_Trihedron (aPlacement);
718 if (!setTrihedronParams (theArgsNb, theArgVec, aTrihedron))
723 // Redisplay a dimension after parameter changing.
724 if (ViewerTest::GetAISContext()->IsDisplayed (aTrihedron))
726 ViewerTest::GetAISContext()->Redisplay (aTrihedron, toUpdate);
730 VDisplayAISObject (theArgVec[1], aTrihedron);
736 //==============================================================================
739 //purpose : Change the size of a named or selected trihedron
740 // if no name : it affects the trihedrons witch are selected otherwise nothing is donne
741 // if no value, the value is set at 100 by default
742 //Draw arg : vsize [name] [size]
743 //==============================================================================
744 static int VSize (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
746 if (TheAISContext().IsNull())
748 Message::SendFail ("Error: no active viewer");
752 TCollection_AsciiString aName;
753 Standard_Real aSize = 0.0;
763 aSize = Draw::Atof (argv[1]);
769 aSize = Draw::Atof (argv[2]);
774 di << "Syntax error";
779 NCollection_Sequence<Handle(AIS_Trihedron)> aTrihedrons;
780 if (!aName.IsEmpty())
782 Handle(AIS_InteractiveObject) aShape;
783 if (GetMapOfAIS().Find2 (aName, aShape))
785 if (Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast (aShape))
787 aTrihedrons.Append (aTrihedron);
791 di << "Syntax error: " << aName << " is not a trihedron";
796 else if (TheAISContext()->NbSelected() > 0)
798 for (ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName it (GetMapOfAIS()); it.More(); it.Next())
800 const Handle(AIS_InteractiveObject)& aShape = it.Key1();
802 && TheAISContext()->IsSelected (aShape))
804 if (Handle(AIS_Trihedron) aTrihedron = Handle(AIS_Trihedron)::DownCast (aShape))
806 aTrihedrons.Append (aTrihedron);
812 for (NCollection_Sequence<Handle(AIS_Trihedron)>::Iterator anObjIter (aTrihedrons); anObjIter.More(); anObjIter.Next())
814 const Handle(AIS_Trihedron)& aTrihedron = anObjIter.Value();
815 Quantity_Color aColor = Quantity_NOC_BLACK;
816 const bool hasColor = aTrihedron->HasColor();
819 aTrihedron->Color (aColor);
822 aTrihedron->SetSize (aSize);
823 if (hasColor) { aTrihedron->SetColor (aColor); }
824 else { aTrihedron->UnsetColor(); }
826 TheAISContext()->Redisplay (aTrihedron, Standard_False);
828 if (!aTrihedrons.IsEmpty())
830 TheAISContext()->UpdateCurrentViewer();
836 //==============================================================================
838 //==============================================================================
839 //function : VPlaneTrihedron
840 //purpose : Create a plane from a trihedron selection. If no arguments are set, the default
841 //Draw arg : vplanetri name
842 //==============================================================================
843 #include <AIS_Plane.hxx>
847 static int VPlaneTrihedron (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
850 // Verification des arguments
851 if ( argc!=2) {di<<argv[0]<<" error\n"; return 1;}
853 if (TheAISContext().IsNull())
855 Message::SendFail ("Error: no active viewer");
859 if (TheAISContext()->NbSelected() != 1)
861 Message::SendFail ("Error: Wrong number of selected shapes.");
865 TheAISContext()->InitSelected();
866 Handle(AIS_InteractiveObject) aTest = TheAISContext()->SelectedInteractive();
867 Handle(AIS_Plane) aPlane = Handle(AIS_Plane)::DownCast (aTest);
870 Message::SendFail ("Error: Selected shape is not a plane.");
874 VDisplayAISObject (argv[1], aPlane);
881 //==============================================================================
882 // Fonction First click 2de click
884 // vaxis vertex vertex
886 // vaxispara edge vertex
887 // vaxisortho edge Vertex
888 // vaxisinter Face Face
889 //==============================================================================
891 //==============================================================================
892 //function : VAxisBuilder
894 //Draw arg : vaxis AxisName Xa Ya Za Xb Yb Zb
895 //==============================================================================
896 #include <TopoDS_Edge.hxx>
897 #include <TopoDS_Vertex.hxx>
898 #include <TopExp.hxx>
899 #include <Geom_Line.hxx>
901 static int VAxisBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
904 Standard_Boolean HasArg;
905 TCollection_AsciiString name;
908 if (argc<2 || argc>8 ) {di<<" Syntaxe error\n";return 1;}
909 if (argc==8) HasArg=Standard_True;
910 else HasArg=Standard_False;
914 TopTools_ListOfShape aShapes;
915 ViewerTest::GetSelectedShapes (aShapes);
917 // Cas ou il y a des arguments
918 // Purpose: Teste le constructeur AIS_Axis::AIS_Axis(x: Line from Geom)
920 Standard_Real coord[6];
921 for(Standard_Integer i=0;i<=5;i++){
922 coord[i]=Draw::Atof(argv[2+i]);
924 gp_Pnt p1(coord[0],coord[1],coord[2]), p2(coord[3],coord[4],coord[5]) ;
926 gp_Vec myVect (p1,p2);
927 Handle(Geom_Line) myLine=new Geom_Line (p1 ,myVect );
928 Handle(AIS_Axis) TheAxis=new AIS_Axis (myLine );
929 GetMapOfAIS().Bind (TheAxis,name);
930 TheAISContext()->Display(TheAxis, Standard_True);
936 // Purpose: Teste le constructeur AIS_Axis::AIS_Axis (x:Axis1Placement from Geom)
937 if ( !strcasecmp(argv[0], "vaxis")) {
938 if (aShapes.Extent() != 2 && aShapes.Extent() != 1)
940 Message::SendFail ("Error: Wrong number of selected shapes.");
944 const TopoDS_Shape& aShapeA = aShapes.First();
945 if (aShapeA.ShapeType() == TopAbs_VERTEX)
947 if (aShapes.Extent() != 2)
949 Message::SendFail ("Error: Wrong number of selected shapes.");
953 const TopoDS_Shape& aShapeB = aShapes.Last();
954 if (aShapeB.ShapeType() != TopAbs_VERTEX)
956 Message::SendFail ("Syntax error: You should select two vertices or one edge.");
960 // Construction de l'axe
961 gp_Pnt A = BRep_Tool::Pnt (TopoDS::Vertex (aShapeA));
962 gp_Pnt B = BRep_Tool::Pnt (TopoDS::Vertex (aShapeB));
965 Handle(Geom_Axis1Placement) OrigineAndVect=new Geom_Axis1Placement (A,D);
966 Handle(AIS_Axis) TheAxis=new AIS_Axis (OrigineAndVect);
967 GetMapOfAIS().Bind (TheAxis,name);
968 TheAISContext()->Display (TheAxis, Standard_True);
972 TopoDS_Edge ed =TopoDS::Edge (aShapeA);
974 TopExp::Vertices(ed,Va,Vb );
975 gp_Pnt A=BRep_Tool::Pnt(Va);
976 gp_Pnt B=BRep_Tool::Pnt(Vb);
979 Handle(Geom_Axis1Placement) OrigineAndVect=new Geom_Axis1Placement (A,D);
980 Handle(AIS_Axis) TheAxis=new AIS_Axis (OrigineAndVect);
981 GetMapOfAIS().Bind (TheAxis,name);
982 TheAISContext()->Display (TheAxis, Standard_True);
988 // Purpose: Teste le constructeur AIS_Axis::AIS_Axis(x: Axis2Placement from Geom, y: TypeOfAxis from AIS)
989 else if ( !strcasecmp(argv[0], "vaxispara"))
991 if (aShapes.Extent() != 2)
993 Message::SendFail ("Error: Wrong number of selected shapes.");
997 const TopoDS_Shape& aShapeA = aShapes.First();
998 const TopoDS_Shape& aShapeB = aShapes.Last();
999 if (!(aShapeA.ShapeType() == TopAbs_EDGE
1000 && aShapeB.ShapeType() == TopAbs_VERTEX))
1002 Message::SendFail ("Syntax error: You should select face and then vertex.");
1006 TopoDS_Edge ed=TopoDS::Edge (aShapeA);
1007 gp_Pnt B=BRep_Tool::Pnt(TopoDS::Vertex(aShapeB));
1008 TopoDS_Vertex Va,Vc;
1009 TopExp::Vertices(ed,Va,Vc );
1010 gp_Pnt A=BRep_Tool::Pnt(Va);
1011 gp_Pnt C=BRep_Tool::Pnt(Vc);
1014 Handle(Geom_Axis1Placement) OrigineAndVect=new Geom_Axis1Placement (B,D);
1015 Handle(AIS_Axis) TheAxis=new AIS_Axis (OrigineAndVect);
1016 GetMapOfAIS().Bind (TheAxis,name);
1017 TheAISContext()->Display (TheAxis, Standard_True);
1021 // Fonction axisortho
1024 if (aShapes.Extent() != 2)
1026 Message::SendFail ("Error: Wrong number of selected shapes.");
1030 const TopoDS_Shape& aShapeA = aShapes.First();
1031 const TopoDS_Shape& aShapeB = aShapes.Last();
1032 if (!(aShapeA.ShapeType() == TopAbs_EDGE
1033 && aShapeB.ShapeType() == TopAbs_VERTEX))
1035 Message::SendFail ("Syntax error: You should select face and then vertex.");
1039 // Construction de l'axe
1040 TopoDS_Edge ed=TopoDS::Edge(aShapeA) ;
1041 gp_Pnt B=BRep_Tool::Pnt(TopoDS::Vertex(aShapeB) );
1042 TopoDS_Vertex Va,Vc;
1043 TopExp::Vertices(ed,Va,Vc );
1044 gp_Pnt A=BRep_Tool::Pnt(Va);
1045 gp_Pnt C=BRep_Tool::Pnt(Vc);
1046 gp_Pnt E(A.Y()+A.Z()-C.Y()-C.Z() ,C.X()-A.X() ,C.X()-A.X() );
1049 Handle(Geom_Axis1Placement) OrigineAndVect=new Geom_Axis1Placement (B,D);
1050 Handle(AIS_Axis) TheAxis=new AIS_Axis (OrigineAndVect);
1051 GetMapOfAIS().Bind (TheAxis,name);
1052 TheAISContext()->Display (TheAxis, Standard_True);
1061 //==============================================================================
1062 // Fonction First click Result
1064 // vpoint vertex AIS_Point=Vertex
1065 // edge AIS_Point=Middle of the edge
1066 //==============================================================================
1068 //==============================================================================
1069 //function : VPointBuilder
1071 //==============================================================================
1072 #include <TopoDS_Edge.hxx>
1073 #include <TopoDS_Vertex.hxx>
1074 #include <TopExp.hxx>
1075 #include <AIS_Point.hxx>
1076 #include <Geom_CartesianPoint.hxx>
1078 static int VPointBuilder(Draw_Interpretor& ,
1079 Standard_Integer theArgNb,
1080 const char** theArgVec)
1082 TCollection_AsciiString aName;
1083 gp_Pnt aPnt (RealLast(), 0.0, 0.0);
1084 bool is2d = false, isNoSel = false;
1085 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
1087 TCollection_AsciiString anArg (theArgVec[anArgIter]);
1093 else if (anArg == "-nosel"
1094 || anArg == "-noselection")
1098 else if (aName.IsEmpty())
1100 aName = theArgVec[anArgIter];
1102 else if (aPnt.X() == RealLast()
1103 && anArgIter + 1 < theArgNb
1104 && Draw::ParseReal (theArgVec[anArgIter + 0], aPnt.ChangeCoord().ChangeCoord (1))
1105 && Draw::ParseReal (theArgVec[anArgIter + 1], aPnt.ChangeCoord().ChangeCoord (2)))
1107 if (anArgIter + 2 < theArgNb
1108 && TCollection_AsciiString (theArgVec[anArgIter + 2]) != "-2d"
1109 && Draw::ParseReal (theArgVec[anArgIter + 2], aPnt.ChangeCoord().ChangeCoord (3)))
1120 Message::SendFail() << "Syntax error at argument '" << anArg << "'\n";
1125 if (aPnt.X() == RealLast())
1127 TopTools_ListOfShape aShapes;
1128 ViewerTest::GetSelectedShapes (aShapes);
1129 TopoDS_Shape aShapeA;
1130 if (aShapes.Extent() == 1)
1132 aShapeA = aShapes.First();
1134 switch (!aShapeA.IsNull() ? aShapeA.ShapeType() : TopAbs_SHAPE)
1138 aPnt = BRep_Tool::Pnt (TopoDS::Vertex (aShapeA));
1141 case TopAbs_EDGE: // edge middle point
1143 const TopoDS_Edge& anEdge = TopoDS::Edge (aShapeA);
1144 TopoDS_Vertex aVertPair[2];
1145 TopExp::Vertices (anEdge, aVertPair[0], aVertPair[1]);
1146 const gp_Pnt A = BRep_Tool::Pnt (aVertPair[0]);
1147 const gp_Pnt B = BRep_Tool::Pnt (aVertPair[1]);
1148 aPnt = (A.XYZ() + B.XYZ()) / 2;
1153 Message::SendFail() << "Error: Wrong number of selected shapes.\n"
1154 << "\tYou should select one edge or vertex.";
1162 aPnt.SetY (-aPnt.Y());
1164 Handle(Geom_CartesianPoint ) aGeomPoint = new Geom_CartesianPoint (aPnt);
1165 Handle(AIS_Point) aPointPrs = new AIS_Point (aGeomPoint);
1168 aPointPrs->SetTransformPersistence (new Graphic3d_TransformPers (Graphic3d_TMF_2d, Aspect_TOTP_LEFT_UPPER));
1169 aPointPrs->SetZLayer (Graphic3d_ZLayerId_TopOSD);
1171 ViewerTest::Display (aName, aPointPrs);
1174 ViewerTest::GetAISContext()->Deactivate (aPointPrs);
1179 //==============================================================================
1180 // Function 1st click 2de click 3de click
1181 // vplane Vertex Vertex Vertex
1185 // vplanepara Face Vertex
1187 // vplaneortho Face Edge
1189 //==============================================================================
1191 //==============================================================================
1192 //function : VPlaneBuilder
1193 //purpose : Build an AIS_Plane from selected entities or Named AIS components
1194 //Draw arg : vplane PlaneName [AxisName] [PointName] [TypeOfSensitivity]
1195 // [PointName] [PointName] [PointName] [TypeOfSensitivity]
1196 // [PlaneName] [PointName] [TypeOfSensitivity]
1197 //==============================================================================
1199 static Standard_Integer VPlaneBuilder (Draw_Interpretor& /*di*/,
1200 Standard_Integer argc,
1204 Standard_Boolean hasArg;
1205 TCollection_AsciiString aName;
1208 if (argc<2 || argc>6 )
1210 Message::SendFail ("Syntax error: wrong number of arguments");
1213 if (argc == 6 || argc==5 || argc==4)
1214 hasArg=Standard_True;
1216 hasArg=Standard_False;
1220 // There are some arguments
1223 Handle(AIS_InteractiveObject) aShapeA;
1224 if (!GetMapOfAIS().Find2 (argv[2], aShapeA))
1226 Message::SendFail ("Syntax error: 1st name is not displayed");
1230 // The first argument is an AIS_Point
1231 if (!aShapeA.IsNull()
1232 && aShapeA->Type() == AIS_KindOfInteractive_Datum
1233 && aShapeA->Signature() == 1)
1235 // The second argument must also be an AIS_Point
1236 Handle(AIS_InteractiveObject) aShapeB;
1237 if (argc<5 || !GetMapOfAIS().Find2 (argv[3], aShapeB))
1239 Message::SendFail ("Syntax error: 2nd name is not displayed");
1243 // If B is not an AIS_Point
1244 if (aShapeB.IsNull()
1245 || !(aShapeB->Type() == AIS_KindOfInteractive_Datum
1246 && aShapeB->Signature() == 1))
1248 Message::SendFail ("Syntax error: 2nd object is expected to be an AIS_Point");
1252 // The third object is an AIS_Point
1253 Handle(AIS_InteractiveObject) aShapeC;
1254 if (!GetMapOfAIS().Find2(argv[4], aShapeC))
1256 Message::SendFail ("Syntax error: 3d name is not displayed");
1260 // If C is not an AIS_Point
1261 if (aShapeC.IsNull()
1262 || !(aShapeC->Type() == AIS_KindOfInteractive_Datum
1263 && aShapeC->Signature() == 1))
1265 Message::SendFail ("Syntax error: 3d object is expected to be an AIS_Point");
1269 // Treatment of objects A, B, C
1270 // Downcast an AIS_IO to AIS_Point
1271 Handle(AIS_Point) anAISPointA = Handle(AIS_Point)::DownCast (aShapeA);
1272 Handle(AIS_Point) anAISPointB = Handle(AIS_Point)::DownCast (aShapeB);
1273 Handle(AIS_Point) anAISPointC = Handle(AIS_Point)::DownCast (aShapeC);
1275 Handle(Geom_CartesianPoint ) aCartPointA = Handle(Geom_CartesianPoint)::DownCast (anAISPointA->Component());
1276 Handle(Geom_CartesianPoint ) aCartPointB = Handle(Geom_CartesianPoint)::DownCast (anAISPointB->Component());
1277 Handle(Geom_CartesianPoint ) aCartPointC = Handle(Geom_CartesianPoint)::DownCast (anAISPointC->Component());
1279 // Verification that the three points are different
1280 if (Abs(aCartPointB->X()-aCartPointA->X()) <= Precision::Confusion()
1281 && Abs(aCartPointB->Y()-aCartPointA->Y()) <= Precision::Confusion()
1282 && Abs(aCartPointB->Z()-aCartPointA->Z()) <= Precision::Confusion())
1285 Message::SendFail ("Error: same points");
1288 if (Abs(aCartPointC->X()-aCartPointA->X()) <= Precision::Confusion()
1289 && Abs(aCartPointC->Y()-aCartPointA->Y()) <= Precision::Confusion()
1290 && Abs(aCartPointC->Z()-aCartPointA->Z()) <= Precision::Confusion())
1293 Message::SendFail ("Error: same points");
1296 if (Abs(aCartPointC->X()-aCartPointB->X()) <= Precision::Confusion()
1297 && Abs(aCartPointC->Y()-aCartPointB->Y()) <= Precision::Confusion()
1298 && Abs(aCartPointC->Z()-aCartPointB->Z()) <= Precision::Confusion())
1301 Message::SendFail ("Error: same points");
1305 gp_Pnt A = aCartPointA->Pnt();
1306 gp_Pnt B = aCartPointB->Pnt();
1307 gp_Pnt C = aCartPointC->Pnt();
1309 // Construction of AIS_Plane
1310 GC_MakePlane MkPlane (A,B,C);
1311 Handle(Geom_Plane) aGeomPlane = MkPlane.Value();
1312 Handle(AIS_Plane) anAISPlane = new AIS_Plane (aGeomPlane);
1313 GetMapOfAIS().Bind (anAISPlane, aName);
1316 Standard_Integer aType = Draw::Atoi (argv[5]);
1317 if (aType != 0 && aType != 1)
1319 Message::SendFail("Syntax error: wrong type of sensitivity.\n"
1320 "Should be one of the following values:\n"
1327 anAISPlane->SetTypeOfSensitivity (Select3D_TypeOfSensitivity (aType));
1330 TheAISContext()->Display (anAISPlane, Standard_True);
1332 // The first argument is an AIS_Axis
1333 // Creation of a plane orthogonal to the axis through a point
1334 else if (aShapeA->Type() == AIS_KindOfInteractive_Datum
1335 && aShapeA->Signature() == 2)
1337 // The second argument should be an AIS_Point
1338 Handle(AIS_InteractiveObject) aShapeB;
1339 if (argc!=4 || !GetMapOfAIS().Find2 (argv[3], aShapeB))
1341 Message::SendFail ("Syntax error: 2d name is not displayed");
1344 // If B is not an AIS_Point
1345 if (aShapeB.IsNull()
1346 || !(aShapeB->Type() == AIS_KindOfInteractive_Datum
1347 && aShapeB->Signature() == 1))
1349 Message::SendFail ("Syntax error: 2d object is expected to be an AIS_Point");
1353 // Treatment of objects A and B
1354 Handle(AIS_Axis) anAISAxisA = Handle(AIS_Axis)::DownCast(aShapeA);
1355 Handle(AIS_Point) anAISPointB = Handle(AIS_Point)::DownCast(aShapeB);
1357 Handle(Geom_Line ) aGeomLineA = anAISAxisA->Component();
1358 Handle(Geom_Point) aGeomPointB = anAISPointB->Component();
1360 gp_Ax1 anAxis = aGeomLineA->Position();
1361 Handle(Geom_CartesianPoint) aCartPointB = Handle(Geom_CartesianPoint)::DownCast(aGeomPointB);
1363 gp_Dir D = anAxis.Direction();
1364 gp_Pnt B = aCartPointB->Pnt();
1366 // Construction of AIS_Plane
1367 Handle(Geom_Plane) aGeomPlane = new Geom_Plane(B,D);
1368 Handle(AIS_Plane) anAISPlane = new AIS_Plane(aGeomPlane,B );
1369 GetMapOfAIS().Bind (anAISPlane,aName );
1372 Standard_Integer aType = Draw::Atoi (argv[4]);
1373 if (aType != 0 && aType != 1)
1375 Message::SendFail ("Syntax error: wrong type of sensitivity!\n"
1376 "Should be one of the following values:\n"
1383 anAISPlane->SetTypeOfSensitivity (Select3D_TypeOfSensitivity (aType));
1386 TheAISContext()->Display (anAISPlane, Standard_True);
1388 // The first argument is an AIS_Plane
1389 // Creation of a plane parallel to the plane passing through the point
1390 else if (aShapeA->Type() == AIS_KindOfInteractive_Datum
1391 && aShapeA->Signature() == 7)
1393 // The second argument should be an AIS_Point
1394 Handle(AIS_InteractiveObject) aShapeB;
1395 if (argc!=4 || !GetMapOfAIS().Find2 (argv[3], aShapeB))
1397 Message::SendFail ("Syntax error: 2d name is not displayed");
1400 // B should be an AIS_Point
1401 if (aShapeB.IsNull()
1402 || !(aShapeB->Type()==AIS_KindOfInteractive_Datum
1403 && aShapeB->Signature() == 1))
1405 Message::SendFail ("Syntax error: 2d object is expected to be an AIS_Point");
1409 // Treatment of objects A and B
1410 Handle(AIS_Plane) anAISPlaneA = Handle(AIS_Plane)::DownCast(aShapeA);
1411 Handle(AIS_Point) anAISPointB = Handle(AIS_Point)::DownCast(aShapeB);
1413 Handle(Geom_Plane) aNewGeomPlane= anAISPlaneA->Component();
1414 Handle(Geom_Point) aGeomPointB = anAISPointB->Component();
1416 Handle(Geom_CartesianPoint) aCartPointB = Handle(Geom_CartesianPoint)::DownCast(aGeomPointB);
1417 gp_Pnt B= aCartPointB->Pnt();
1419 // Construction of an AIS_Plane
1420 Handle(AIS_Plane) anAISPlane = new AIS_Plane(aNewGeomPlane, B);
1421 GetMapOfAIS().Bind (anAISPlane, aName);
1424 Standard_Integer aType = Draw::Atoi (argv[4]);
1425 if (aType != 0 && aType != 1)
1427 Message::SendFail ("Syntax error: wrong type of sensitivity!\n"
1428 "Should be one of the following values:\n"
1435 anAISPlane->SetTypeOfSensitivity (Select3D_TypeOfSensitivity (aType));
1438 TheAISContext()->Display (anAISPlane, Standard_True);
1443 Message::SendFail ("Syntax error: 1st object is not an AIS");
1447 // There are no arguments
1450 TopTools_ListOfShape aShapes;
1451 ViewerTest::GetSelectedShapes (aShapes);
1454 // Test the constructor AIS_Plane::AIS_Plane(Geom_Plane, Standard_Boolean )
1455 if (!strcasecmp(argv[0], "vplane"))
1457 if (aShapes.Extent() < 1 || aShapes.Extent() > 3)
1459 Message::SendFail() << "Error: Wront number of selected shapes.\n"
1460 << "\tYou should one of variant: face, edge and vertex or three vertices.";
1464 const TopoDS_Shape& aShapeA = aShapes.First();
1465 if (aShapeA.ShapeType() == TopAbs_VERTEX)
1467 if (aShapes.Extent() == 2)
1469 const TopoDS_Shape& aShapeB = aShapes.Last();
1470 if (aShapeB.ShapeType() != TopAbs_EDGE)
1472 Message::SendFail ("Syntax error: Together with vertex should be edge.");
1476 // Verify that the vertex is not on the edge ShapeB
1477 TopoDS_Edge anEdgeB = TopoDS::Edge(aShapeB);
1478 TopoDS_Vertex aVertA = TopoDS::Vertex(aShapeA);
1480 BRepExtrema_ExtPC OrthoProj(aVertA, anEdgeB);
1481 if (OrthoProj.SquareDistance(1)<Precision::Approximation())
1483 // The vertex is on the edge
1484 Message::SendFail ("Error: point is on the edge");
1489 gp_Pnt A = BRep_Tool::Pnt(aVertA);
1490 TopoDS_Vertex aVBa, aVBb;
1491 TopExp::Vertices(anEdgeB ,aVBa ,aVBb);
1492 gp_Pnt aBa = BRep_Tool::Pnt(aVBa);
1493 gp_Pnt aBb = BRep_Tool::Pnt(aVBb);
1494 GC_MakePlane MkPlane (A, aBa, aBb);
1495 Handle(Geom_Plane) aGeomPlane = MkPlane.Value();
1496 Handle(AIS_Plane) anAISPlane = new AIS_Plane (aGeomPlane);
1497 GetMapOfAIS().Bind (anAISPlane, aName);
1498 TheAISContext()->Display (anAISPlane, Standard_True);
1501 else if (aShapes.Extent() == 3)
1503 TopTools_ListOfShape::Iterator anIter (aShapes);
1506 const TopoDS_Shape& aShapeB = anIter.Value();
1509 const TopoDS_Shape& aShapeC = anIter.Value();
1511 if (!(aShapeB.ShapeType() == TopAbs_VERTEX
1512 && aShapeC.ShapeType() == TopAbs_VERTEX))
1514 Message::SendFail ("Syntax error: You should one of variant: face, edge and vertex or three vertices.");
1518 gp_Pnt A = BRep_Tool::Pnt(TopoDS::Vertex(aShapeA));
1519 gp_Pnt B = BRep_Tool::Pnt(TopoDS::Vertex(aShapeB));
1520 gp_Pnt C = BRep_Tool::Pnt(TopoDS::Vertex(aShapeC));
1521 GC_MakePlane MkPlane(A, B, C);
1522 Handle(Geom_Plane) aGeomPlane = MkPlane.Value();
1523 Handle(AIS_Plane) anAISPlane = new AIS_Plane (aGeomPlane);
1524 GetMapOfAIS().Bind (anAISPlane, aName);
1525 TheAISContext()->Display (anAISPlane, Standard_True);
1529 Message::SendFail ("Syntax error: You should one of variant: face, edge and vertex or three vertices.");
1533 else if (aShapeA.ShapeType() == TopAbs_EDGE)
1535 if (aShapes.Extent() != 2)
1537 Message::SendFail ("Error: wrong number of selected shapes.");
1541 const TopoDS_Shape& aShapeB = aShapes.Last();
1542 if (aShapeB.ShapeType() != TopAbs_VERTEX)
1544 Message::SendFail ("Syntax error: Together with edge should be vertex.");
1548 // Check that the vertex aShapeB is not on the edge
1549 TopoDS_Edge anEdgeA = TopoDS::Edge(aShapeA);
1550 TopoDS_Vertex aVertB = TopoDS::Vertex(aShapeB);
1552 BRepExtrema_ExtPC OrthoProj (aVertB, anEdgeA);
1553 if (OrthoProj.SquareDistance(1)<Precision::Approximation())
1555 // The vertex is on the edge
1556 Message::SendFail ("Error point is on the edge");
1560 gp_Pnt B = BRep_Tool::Pnt(aVertB);
1561 TopoDS_Vertex aVAa, aVAb;
1562 TopExp::Vertices(anEdgeA, aVAa, aVAb);
1563 gp_Pnt Aa = BRep_Tool::Pnt(aVAa);
1564 gp_Pnt Ab = BRep_Tool::Pnt(aVAb);
1565 GC_MakePlane MkPlane (B,Aa,Ab);
1566 Handle(Geom_Plane) aGeomPlane = MkPlane.Value();
1567 Handle(AIS_Plane) anAISPlane = new AIS_Plane (aGeomPlane);
1568 GetMapOfAIS().Bind (anAISPlane ,aName);
1569 TheAISContext()->Display (anAISPlane, Standard_True);
1571 else if (aShapeA.ShapeType() == TopAbs_FACE)
1573 TopoDS_Face aFace = TopoDS::Face(aShapeA);
1574 BRepAdaptor_Surface aSurface (aFace, Standard_False);
1575 if (aSurface.GetType()==GeomAbs_Plane)
1577 gp_Pln aPlane = aSurface.Plane();
1578 Handle(Geom_Plane) aGeomPlane = new Geom_Plane(aPlane);
1579 Handle(AIS_Plane) anAISPlane = new AIS_Plane(aGeomPlane);
1580 GetMapOfAIS().Bind (anAISPlane, aName);
1581 TheAISContext()->Display (anAISPlane, Standard_True);
1585 Message::SendFail ("Error: surface is not Plane");
1591 Message::SendFail ("Syntax error: You should one of variant: face, edge and vertex or three vertices");
1596 // Function vPlanePara
1597 // ===================
1598 // test the constructor AIS_Plane::AIS_Plane(Geom_Plane,gp_Pnt)
1599 else if (!strcasecmp(argv[0], "vplanepara"))
1601 if (aShapes.Extent() != 2)
1603 Message::SendFail ("Error: Wrong number of selected shapes.");
1607 const TopoDS_Shape* aShapeA = &aShapes.First();
1608 const TopoDS_Shape* aShapeB = &aShapes.Last();
1609 if (aShapeA->ShapeType() != TopAbs_VERTEX)
1611 std::swap (aShapeA, aShapeB);
1614 if (!(aShapeA->ShapeType() == TopAbs_VERTEX
1615 && aShapeB->ShapeType() == TopAbs_FACE))
1617 Message::SendFail ("Syntax error: you should select face and vertex.");
1621 gp_Pnt A = BRep_Tool::Pnt(TopoDS::Vertex(*aShapeA));
1623 TopoDS_Face aFace = TopoDS::Face(*aShapeB);
1624 BRepAdaptor_Surface aSurface (aFace, Standard_False);
1625 if (aSurface.GetType() == GeomAbs_Plane)
1627 gp_Pln aPlane = aSurface.Plane();
1628 // Construct a plane parallel to aGeomPlane through A
1629 aPlane.SetLocation(A);
1630 Handle(Geom_Plane) aGeomPlane = new Geom_Plane (aPlane);
1631 Handle(AIS_Plane) aAISPlane = new AIS_Plane (aGeomPlane, A);
1632 GetMapOfAIS().Bind (aAISPlane ,aName);
1633 TheAISContext()->Display (aAISPlane, Standard_True);
1637 Message::SendFail ("Error: Built surface is not a plane.");
1642 // Function vplaneortho
1643 // ====================
1644 // test the constructor AIS_Plane::AIS_Plane(Geom_Plane,gp_Pnt,gp_Pnt,gp_Pnt)
1647 if (aShapes.Extent() != 2)
1649 Message::SendFail ("Error: wrong number of selected shapes.");
1653 const TopoDS_Shape* aShapeA = &aShapes.First();
1654 const TopoDS_Shape* aShapeB = &aShapes.Last();
1656 if (aShapeA->ShapeType() != TopAbs_EDGE)
1658 std::swap (aShapeA, aShapeB);
1661 if (!(aShapeA->ShapeType() == TopAbs_EDGE
1662 && aShapeB->ShapeType() == TopAbs_FACE))
1664 Message::SendFail ("Error: you should select edge and face.");
1668 // Construction of plane
1669 TopoDS_Edge anEdgeA = TopoDS::Edge(*aShapeA);
1670 TopoDS_Vertex aVAa, aVAb;
1671 TopExp::Vertices(anEdgeA, aVAa, aVAb);
1672 gp_Pnt Aa = BRep_Tool::Pnt(aVAa);
1673 gp_Pnt Ab = BRep_Tool::Pnt(aVAb);
1677 // Creation of rotation axis
1678 gp_Ax1 aRotAxis (Aa,Dab);
1680 TopoDS_Face aFace = TopoDS::Face(*aShapeB);
1681 // The edge must be parallel to the face
1682 BRepExtrema_ExtPF aHeightA (aVAa, aFace);
1683 BRepExtrema_ExtPF aHeightB (aVAb, aFace);
1684 // Compare to heights
1685 if (fabs(sqrt(aHeightA.SquareDistance(1)) - sqrt(aHeightB.SquareDistance(1)))
1686 >Precision::Confusion())
1688 // the edge is not parallel to the face
1689 Message::SendFail ("Error: the edge is not parallel to the face");
1693 BRepAdaptor_Surface aSurface (aFace, Standard_False);
1694 if (aSurface.GetType()==GeomAbs_Plane)
1696 gp_Pln aPlane = aSurface.Plane();
1697 // It rotates a half turn round the axis of rotation
1698 aPlane.Rotate(aRotAxis , M_PI/2);
1700 Handle(Geom_Plane) aGeomPlane = new Geom_Plane (aPlane);
1701 // constructed aGeomPlane parallel to a plane containing the edge (center mid-edge)
1702 gp_Pnt aMiddle ((Aa.X()+Ab.X() )/2 ,(Aa.Y()+Ab.Y() )/2 ,(Aa.Z()+Ab.Z() )/2 );
1703 Handle(AIS_Plane) anAISPlane = new AIS_Plane (aGeomPlane, aMiddle);
1704 GetMapOfAIS().Bind (anAISPlane, aName);
1705 TheAISContext()->Display (anAISPlane, Standard_True);
1709 Message::SendFail ("Error: surface is not Plane");
1717 //===============================================================================================
1718 //function : VChangePlane
1720 //===============================================================================================
1721 static int VChangePlane (Draw_Interpretor& /*theDi*/, Standard_Integer theArgsNb, const char** theArgVec)
1723 Handle(AIS_InteractiveContext) aContextAIS = ViewerTest::GetAISContext();
1724 if (aContextAIS.IsNull())
1726 Message::SendFail ("Error: no active viewer.");
1730 if (theArgsNb < 3 || theArgsNb > 11)
1732 Message::SendFail ("Syntax error: wrong number of arguments.");
1736 TCollection_AsciiString aName (theArgVec[1]);
1738 Handle(AIS_Plane) aPlane = GetMapOfAIS().IsBound2(aName)
1739 ? Handle(AIS_Plane)::DownCast (GetMapOfAIS().Find2 (aName))
1742 if ( aPlane.IsNull() )
1744 Message::SendFail() << "Syntax error: there is no interactive plane with the given name '" << aName << "'.";
1748 Standard_Real aCenterX = aPlane->Center().X();
1749 Standard_Real aCenterY = aPlane->Center().Y();
1750 Standard_Real aCenterZ = aPlane->Center().Z();
1752 Standard_Real aDirX = aPlane->Component()->Axis().Direction().X();
1753 Standard_Real aDirY = aPlane->Component()->Axis().Direction().Y();
1754 Standard_Real aDirZ = aPlane->Component()->Axis().Direction().Z();
1756 Standard_Real aSizeX = 0.0;
1757 Standard_Real aSizeY = 0.0;
1758 Standard_Boolean aHasMinSize = aPlane->HasMinimumSize();
1759 Standard_Real aMinSizeY = 0.0;
1760 aPlane->Size (aSizeX, aSizeY);
1761 Standard_Boolean isUpdate = Standard_True;
1763 TCollection_AsciiString aPName, aPValue;
1764 for (Standard_Integer anArgIt = 1; anArgIt < theArgsNb; ++anArgIt)
1766 const TCollection_AsciiString anArg = theArgVec[anArgIt];
1767 TCollection_AsciiString anArgCase = anArg;
1768 anArgCase.UpperCase();
1769 if (ViewerTest::SplitParameter (anArg, aPName, aPValue))
1772 if (aPName.IsEqual ("X"))
1774 aCenterX = aPValue.RealValue();
1776 else if (aPName.IsEqual ("Y"))
1778 aCenterY = aPValue.RealValue();
1780 else if (aPName.IsEqual ("Z"))
1782 aCenterZ = aPValue.RealValue();
1784 else if (aPName.IsEqual ("DX"))
1786 aDirX = aPValue.RealValue();
1788 else if (aPName.IsEqual ("DY"))
1790 aDirY = aPValue.RealValue();
1792 else if (aPName.IsEqual ("DZ"))
1794 aDirZ = aPValue.RealValue();
1796 else if (aPName.IsEqual ("SX"))
1798 aSizeX = aPValue.RealValue();
1800 else if (aPName.IsEqual ("SY"))
1802 aSizeY = aPValue.RealValue();
1804 else if (aPName.IsEqual ("MINSIZE"))
1806 aHasMinSize = Standard_True;
1807 aMinSizeY = aPValue.RealValue();
1810 else if (anArg.IsEqual ("NOUPDATE"))
1812 isUpdate = Standard_False;
1816 gp_Dir aDirection (aDirX, aDirY, aDirZ);
1817 gp_Pnt aCenterPnt (aCenterX, aCenterY, aCenterZ);
1818 aPlane->SetCenter (aCenterPnt);
1819 aPlane->SetComponent (new Geom_Plane (aCenterPnt, aDirection));
1820 aPlane->SetSize (aSizeX, aSizeY);
1824 aPlane->SetMinimumSize (aMinSizeY);
1826 else if (aPlane->HasMinimumSize())
1828 aPlane->UnsetMinimumSize();
1831 aContextAIS->Update (aPlane, isUpdate);
1836 //==============================================================================
1838 // --------------- Uniquement par parametre. Pas de selection dans le viewer.
1839 //==============================================================================
1841 //==============================================================================
1842 //function : VLineBuilder
1843 //purpose : Build an AIS_Line
1844 //Draw arg : vline LineName [AIS_PointName] [AIS_PointName]
1845 // [Xa] [Ya] [Za] [Xb] [Yb] [Zb]
1846 //==============================================================================
1847 #include <Geom_CartesianPoint.hxx>
1848 #include <AIS_Line.hxx>
1851 static int VLineBuilder(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
1853 if (argc == 4) // parameters: AIS_Point AIS_Point
1855 Handle(AIS_InteractiveObject) aShapeA, aShapeB;
1856 GetMapOfAIS().Find2 (argv[2], aShapeA);
1857 GetMapOfAIS().Find2 (argv[3], aShapeB);
1858 Handle(AIS_Point) anAISPointA = Handle(AIS_Point)::DownCast (aShapeA);
1859 Handle(AIS_Point) anAISPointB = Handle(AIS_Point)::DownCast (aShapeB);
1860 if (anAISPointA.IsNull()
1861 || anAISPointB.IsNull())
1863 di << "vline error: wrong type of arguments\n";
1867 Handle(Geom_Point) aGeomPointBA = anAISPointA->Component();
1868 Handle(Geom_CartesianPoint) aCartPointA = Handle(Geom_CartesianPoint)::DownCast (aGeomPointBA);
1870 Handle(Geom_Point) aGeomPointB = anAISPointB->Component();
1871 Handle(Geom_CartesianPoint) aCartPointB = Handle(Geom_CartesianPoint)::DownCast (aGeomPointB);
1873 if (aCartPointB->X() == aCartPointA->X()
1874 && aCartPointB->Y() == aCartPointA->Y()
1875 && aCartPointB->Z() == aCartPointA->Z())
1878 di << "vline error: same points\n";
1882 Handle(AIS_Line) anAISLine = new AIS_Line (aCartPointA, aCartPointB);
1883 GetMapOfAIS().Bind (anAISLine, argv[1]);
1884 TheAISContext()->Display (anAISLine, Standard_True);
1886 else if (argc == 8) // parametres 6 reals
1888 Standard_Real aCoord[6] = {};
1889 for (Standard_Integer i = 0; i <= 2; ++i)
1891 aCoord[i] = Draw::Atof (argv[2 + i]);
1892 aCoord[i + 3] = Draw::Atof (argv[5 + i]);
1895 Handle(Geom_CartesianPoint) aCartPointA = new Geom_CartesianPoint (aCoord[0], aCoord[1], aCoord[2]);
1896 Handle(Geom_CartesianPoint) aCartPointB = new Geom_CartesianPoint (aCoord[3], aCoord[4], aCoord[5]);
1898 Handle(AIS_Line) anAISLine = new AIS_Line (aCartPointA, aCartPointB);
1899 GetMapOfAIS().Bind (anAISLine, argv[1]);
1900 TheAISContext()->Display (anAISLine, Standard_True);
1903 else if (argc == 2) // selection in 3D viewer
1905 TopTools_ListOfShape aShapes;
1906 ViewerTest::GetSelectedShapes (aShapes);
1907 if (aShapes.Extent() != 2)
1909 Message::SendFail ("Error: wrong number of selected shapes.");
1913 const TopoDS_Shape& aShapeA = aShapes.First();
1914 const TopoDS_Shape& aShapeB = aShapes.Last();
1915 if (aShapeA.ShapeType() != TopAbs_VERTEX
1916 || aShapeB.ShapeType() != TopAbs_VERTEX)
1918 Message::SendFail ("Error: you should select two different vertex.");
1922 // Construction de la line
1923 gp_Pnt A = BRep_Tool::Pnt (TopoDS::Vertex (aShapeA));
1924 gp_Pnt B = BRep_Tool::Pnt (TopoDS::Vertex (aShapeB));
1926 Handle(Geom_CartesianPoint) aCartPointA = new Geom_CartesianPoint (A);
1927 Handle(Geom_CartesianPoint) aCartPointB = new Geom_CartesianPoint (B);
1929 Handle(AIS_Line) anAISLine = new AIS_Line (aCartPointA, aCartPointB);
1930 GetMapOfAIS().Bind (anAISLine, argv[1]);
1931 TheAISContext()->Display (anAISLine, Standard_True);
1935 di << "Syntax error: wrong number of arguments";
1942 //==============================================================================
1943 // class : FilledCircle
1944 // purpose : creates filled circle based on AIS_InteractiveObject
1946 // This class is used to check method Matches() of class
1947 // Select3D_SensitiveCircle with member myFillStatus = Standard_True,
1948 // because none of AIS classes provides creation of
1949 // Select3D_SensitiveCircle with member myFillStatus = Standard_True
1950 // (look method ComputeSelection() )
1951 //==============================================================================
1953 Handle(Geom_Circle) CreateCircle(gp_Pnt theCenter, Standard_Real theRadius)
1955 gp_Ax2 anAxes(theCenter, gp_Dir(gp_Vec(0., 0., 1.)));
1956 gp_Circ aCirc(anAxes, theRadius);
1957 Handle(Geom_Circle) aCircle = new Geom_Circle(aCirc);
1961 class FilledCircle : public AIS_InteractiveObject
1965 DEFINE_STANDARD_RTTI_INLINE(FilledCircle, AIS_InteractiveObject);
1967 FilledCircle (gp_Pnt theCenter, Standard_Real theRadius);
1968 FilledCircle (Handle(Geom_Circle) theCircle);
1971 TopoDS_Face ComputeFace();
1973 // Virtual methods implementation
1974 virtual void Compute (const Handle(PrsMgr_PresentationManager)& thePrsMgr,
1975 const Handle(Prs3d_Presentation)& thePrs,
1976 const Standard_Integer theMode) Standard_OVERRIDE;
1978 virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSel,
1979 const Standard_Integer theMode) Standard_OVERRIDE;
1983 Handle(Geom_Circle) myCircle;
1984 Standard_Boolean myFilledStatus;
1989 FilledCircle::FilledCircle(gp_Pnt theCenter, Standard_Real theRadius)
1991 myCircle = CreateCircle(theCenter, theRadius);
1992 myFilledStatus = Standard_True;
1995 FilledCircle::FilledCircle(Handle(Geom_Circle) theCircle)
1997 myCircle = theCircle;
1998 myFilledStatus = Standard_True;
2001 TopoDS_Face FilledCircle::ComputeFace()
2003 // Create edge from myCircle
2004 BRepBuilderAPI_MakeEdge anEdgeMaker(myCircle->Circ());
2005 TopoDS_Edge anEdge = anEdgeMaker.Edge();
2007 // Create wire from anEdge
2008 BRepBuilderAPI_MakeWire aWireMaker(anEdge);
2009 TopoDS_Wire aWire = aWireMaker.Wire();
2011 // Create face from aWire
2012 BRepBuilderAPI_MakeFace aFaceMaker(aWire);
2013 TopoDS_Face aFace = aFaceMaker.Face();
2018 void FilledCircle::Compute (const Handle(PrsMgr_PresentationManager)& ,
2019 const Handle(Prs3d_Presentation)& thePrs,
2020 const Standard_Integer theMode)
2024 TopoDS_Face aFace = ComputeFace();
2026 if (aFace.IsNull()) return;
2027 if (theMode != 0) return;
2029 StdPrs_ShadedShape::Add (thePrs, aFace, myDrawer);
2032 void FilledCircle::ComputeSelection(const Handle(SelectMgr_Selection) &theSelection,
2033 const Standard_Integer /*theMode*/)
2035 Handle(SelectMgr_EntityOwner) anEntityOwner = new SelectMgr_EntityOwner(this);
2036 Handle(Select3D_SensitiveCircle) aSensitiveCircle = new Select3D_SensitiveCircle (anEntityOwner, myCircle->Circ(), myFilledStatus);
2037 theSelection->Add(aSensitiveCircle);
2040 //==============================================================================
2042 // ----------------- Uniquement par parametre. Pas de selection dans le viewer.
2043 //==============================================================================
2045 //==============================================================================
2046 //function : VCircleBuilder
2047 //purpose : Build an AIS_Circle
2048 //Draw arg : vcircle CircleName PlaneName PointName Radius IsFilled
2049 // PointName PointName PointName IsFilled
2050 //==============================================================================
2052 void DisplayCircle (Handle (Geom_Circle) theGeomCircle,
2053 TCollection_AsciiString theName,
2054 Standard_Boolean isFilled)
2056 Handle(AIS_InteractiveObject) aCircle;
2059 aCircle = new FilledCircle(theGeomCircle);
2063 aCircle = new AIS_Circle(theGeomCircle);
2064 Handle(AIS_Circle)::DownCast (aCircle)->SetFilledCircleSens (Standard_False);
2067 // Check if there is an object with given name
2068 // and remove it from context
2069 if (GetMapOfAIS().IsBound2(theName))
2071 Handle(AIS_InteractiveObject) anInterObj = GetMapOfAIS().Find2(theName);
2072 TheAISContext()->Remove(anInterObj, Standard_False);
2073 GetMapOfAIS().UnBind2(theName);
2076 // Bind the circle to its name
2077 GetMapOfAIS().Bind(aCircle, theName);
2079 // Display the circle
2080 TheAISContext()->Display (aCircle, Standard_True);
2084 static int VCircleBuilder(Draw_Interpretor& /*di*/, Standard_Integer argc, const char** argv)
2086 if (argc > 6 || argc < 2)
2088 Message::SendFail ("Syntax error: wrong number of arguments");
2094 TCollection_AsciiString aName (argv[1]);
2095 Standard_Boolean isFilled = Draw::Atoi(argv[5]) != 0;
2097 Handle(AIS_InteractiveObject) aShapeA, aShapeB;
2098 GetMapOfAIS().Find2 (argv[2], aShapeA);
2099 GetMapOfAIS().Find2 (argv[3], aShapeB);
2101 // Arguments: AIS_Point AIS_Point AIS_Point
2102 if (!aShapeA.IsNull()
2103 && !aShapeB.IsNull()
2104 && aShapeA->Type() == AIS_KindOfInteractive_Datum
2105 && aShapeA->Signature() == 1)
2107 Handle(AIS_InteractiveObject) aShapeC;
2108 GetMapOfAIS().Find2 (argv[4], aShapeC);
2109 Handle(AIS_Point) anAISPointA = Handle(AIS_Point)::DownCast (aShapeA);
2110 Handle(AIS_Point) anAISPointB = Handle(AIS_Point)::DownCast (aShapeB);
2111 Handle(AIS_Point) anAISPointC = Handle(AIS_Point)::DownCast (aShapeC);
2112 if (anAISPointA.IsNull()
2113 || anAISPointB.IsNull()
2114 || anAISPointC.IsNull())
2116 Message::SendFail ("Error: arguments are expected to be points");
2120 // Verify that the three points are different
2121 Handle(Geom_CartesianPoint) aCartPointA = Handle(Geom_CartesianPoint)::DownCast (anAISPointA->Component());
2122 Handle(Geom_CartesianPoint) aCartPointB = Handle(Geom_CartesianPoint)::DownCast (anAISPointB->Component());
2123 Handle(Geom_CartesianPoint) aCartPointC = Handle(Geom_CartesianPoint)::DownCast (anAISPointC->Component());
2125 if (Abs(aCartPointA->X() - aCartPointB->X()) <= Precision::Confusion()
2126 && Abs(aCartPointA->Y() - aCartPointB->Y()) <= Precision::Confusion()
2127 && Abs(aCartPointA->Z() - aCartPointB->Z()) <= Precision::Confusion())
2129 Message::SendFail ("Error: Same points");
2133 if (Abs(aCartPointA->X() - aCartPointC->X()) <= Precision::Confusion()
2134 && Abs(aCartPointA->Y() - aCartPointC->Y()) <= Precision::Confusion()
2135 && Abs(aCartPointA->Z() - aCartPointC->Z()) <= Precision::Confusion())
2137 Message::SendFail ("Error: Same points");
2141 if (Abs(aCartPointB->X() - aCartPointC->X()) <= Precision::Confusion()
2142 && Abs(aCartPointB->Y() - aCartPointC->Y()) <= Precision::Confusion()
2143 && Abs(aCartPointB->Z() - aCartPointC->Z()) <= Precision::Confusion())
2145 Message::SendFail ("Error: Same points");
2148 // Construction of the circle
2149 GC_MakeCircle aCir = GC_MakeCircle (aCartPointA->Pnt(), aCartPointB->Pnt(), aCartPointC->Pnt());
2150 Handle (Geom_Circle) aGeomCircle;
2153 aGeomCircle = aCir.Value();
2155 catch (StdFail_NotDone const&)
2157 Message::SendFail ("Error: can't create circle");
2161 DisplayCircle (aGeomCircle, aName, isFilled);
2164 // Arguments: AIS_Plane AIS_Point Real
2165 else if (aShapeA->Type() == AIS_KindOfInteractive_Datum
2166 && aShapeA->Signature() == 7)
2168 Handle(AIS_Plane) anAISPlane = Handle(AIS_Plane)::DownCast (aShapeA);
2169 Handle(AIS_Point) anAISPointB = Handle(AIS_Point)::DownCast (aShapeB);
2170 if (anAISPointB.IsNull())
2172 Message::SendFail ("Error: 2d element is a expected to be a point");
2176 // Check that the radius is >= 0
2177 const Standard_Real anR = Draw::Atof (argv[4]);
2180 Message::SendFail ("Syntax error: the radius must be >=0");
2184 // Recover the normal to the plane
2185 Handle(Geom_Plane) aGeomPlane = anAISPlane->Component();
2186 Handle(Geom_Point) aGeomPointB = anAISPointB->Component();
2187 Handle(Geom_CartesianPoint) aCartPointB = Handle(Geom_CartesianPoint)::DownCast(aGeomPointB);
2189 gp_Pln aGpPlane = aGeomPlane->Pln();
2190 gp_Ax1 aGpAxe = aGpPlane.Axis();
2191 gp_Dir aDir = aGpAxe.Direction();
2192 gp_Pnt aCenter = aCartPointB->Pnt();
2193 GC_MakeCircle aCir = GC_MakeCircle (aCenter, aDir, anR);
2194 Handle(Geom_Circle) aGeomCircle;
2197 aGeomCircle = aCir.Value();
2199 catch (StdFail_NotDone const&)
2201 Message::SendFail ("Error: can't create circle");
2205 DisplayCircle (aGeomCircle, aName, isFilled);
2209 Message::SendFail ("Error: 1st argument has an unexpected type");
2213 else // No arguments: selection in the viewer
2215 // Get the name of the circle
2216 TCollection_AsciiString aName (argv[1]);
2218 TopTools_ListOfShape aShapes;
2219 ViewerTest::GetSelectedShapes (aShapes);
2220 if (aShapes.Extent() != 3 && aShapes.Extent() != 2)
2222 Message::SendFail ("Error: Wrong number of selected shapes.");
2226 const TopoDS_Shape& aShapeA = aShapes.First();
2227 if (aShapeA.ShapeType() == TopAbs_VERTEX)
2229 if (aShapes.Extent() != 3)
2231 Message::SendFail ("Error: wrong number of selected shapes.");
2235 TopTools_ListOfShape::Iterator anIter (aShapes);
2238 const TopoDS_Shape& aShapeB = anIter.Value();
2241 const TopoDS_Shape& aShapeC = anIter.Value();
2244 Standard_Boolean isFilled;
2245 std::cout << "Enter filled status (0 or 1)\n";
2246 std::cin >> isFilled;
2248 // Construction of the circle
2249 gp_Pnt A = BRep_Tool::Pnt (TopoDS::Vertex (aShapeA));
2250 gp_Pnt B = BRep_Tool::Pnt (TopoDS::Vertex (aShapeB));
2251 gp_Pnt C = BRep_Tool::Pnt (TopoDS::Vertex (aShapeC));
2253 GC_MakeCircle aCir = GC_MakeCircle (A, B, C);
2254 Handle(Geom_Circle) aGeomCircle;
2257 aGeomCircle = aCir.Value();
2259 catch (StdFail_NotDone const&)
2261 Message::SendFail ("Error: can't create circle");
2265 DisplayCircle (aGeomCircle, aName, isFilled);
2267 else if (aShapeA.ShapeType() == TopAbs_FACE)
2269 const TopoDS_Shape& aShapeB = aShapes.Last();
2271 // Recover the radius
2272 Standard_Real aRad = 0.0;
2275 std::cout << " Enter the value of the radius:\n";
2277 } while (aRad <= 0);
2279 // Get filled status
2280 Standard_Boolean isFilled;
2281 std::cout << "Enter filled status (0 or 1)\n";
2282 std::cin >> isFilled;
2284 // Recover the normal to the plane. tag
2285 TopoDS_Face aFace = TopoDS::Face (aShapeA);
2286 BRepAdaptor_Surface aSurface (aFace, Standard_False);
2287 gp_Pln aPlane = aSurface.Plane();
2288 Handle(Geom_Plane) aGeomPlane = new Geom_Plane (aPlane);
2289 gp_Pln aGpPlane = aGeomPlane->Pln();
2290 gp_Ax1 aGpAxe = aGpPlane.Axis();
2291 gp_Dir aDir = aGpAxe.Direction();
2293 // Recover the center
2294 gp_Pnt aCenter = BRep_Tool::Pnt (TopoDS::Vertex (aShapeB));
2296 // Construct the circle
2297 GC_MakeCircle aCir = GC_MakeCircle (aCenter, aDir, aRad);
2298 Handle(Geom_Circle) aGeomCircle;
2301 aGeomCircle = aCir.Value();
2303 catch (StdFail_NotDone const&)
2305 Message::SendFail ("Error: can't create circle");
2309 DisplayCircle (aGeomCircle, aName, isFilled);
2313 Message::SendFail ("Error: You should select face and vertex or three vertices.");
2321 //=======================================================================
2322 //function : VDrawText
2324 //=======================================================================
2325 static int VDrawText (Draw_Interpretor& theDI,
2326 Standard_Integer theArgsNb,
2327 const char** theArgVec)
2329 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
2332 Message::SendFail ("Syntax error: wrong number of arguments. See usage:");
2333 theDI.PrintHelp (theArgVec[0]);
2336 else if (aContext.IsNull())
2338 Message::SendFail ("Error: no active viewer");
2342 Standard_Integer anArgIt = 1;
2343 TCollection_ExtendedString aName (theArgVec[anArgIt++], Standard_True);
2344 TCollection_ExtendedString aText (theArgVec[anArgIt++], Standard_True);
2345 Handle(AIS_TextLabel) aTextPrs;
2346 ViewerTest_AutoUpdater anAutoUpdater (aContext, ViewerTest::CurrentView());
2348 Standard_Boolean isNewPrs = Standard_False;
2349 if (GetMapOfAIS().IsBound2 (aName))
2351 aTextPrs = Handle(AIS_TextLabel)::DownCast (GetMapOfAIS().Find2 (aName));
2354 if (aTextPrs.IsNull())
2356 isNewPrs = Standard_True;
2357 aTextPrs = new AIS_TextLabel();
2360 aTextPrs->SetText (aText);
2362 Handle(Graphic3d_TransformPers) aTrsfPers;
2363 Aspect_TypeOfDisplayText aDisplayType = Aspect_TODT_NORMAL;
2365 Standard_Boolean aHasPlane = Standard_False;
2371 Handle(Font_TextFormatter) aTextFormatter;
2372 for (; anArgIt < theArgsNb; ++anArgIt)
2374 TCollection_AsciiString aParam (theArgVec[anArgIt]);
2377 if (anAutoUpdater.parseRedrawMode (aParam))
2381 else if (aParam == "-pos"
2382 || aParam == "-position")
2384 if (anArgIt + 3 >= theArgsNb)
2386 Message::SendFail() << "Error: wrong number of values for parameter '" << aParam << "'";
2390 aPos.SetX (Draw::Atof (theArgVec[++anArgIt]));
2391 aPos.SetY (Draw::Atof (theArgVec[++anArgIt]));
2392 aPos.SetZ (Draw::Atof (theArgVec[++anArgIt]));
2393 aTextPrs->SetPosition (aPos);
2395 else if (aParam == "-color")
2397 Quantity_Color aColor;
2398 Standard_Integer aNbParsed = Draw::ParseColor (theArgsNb - anArgIt - 1,
2399 theArgVec + anArgIt + 1,
2403 Message::SendFail() << "Syntax error at '" << aParam << "'";
2406 anArgIt += aNbParsed;
2407 aTextPrs->SetColor (aColor);
2409 else if (aParam == "-halign")
2411 if (++anArgIt >= theArgsNb)
2413 Message::SendFail() << "Error: wrong number of values for parameter '" << aParam.ToCString() << "'";
2417 TCollection_AsciiString aType (theArgVec[anArgIt]);
2419 if (aType == "left")
2421 aTextPrs->SetHJustification (Graphic3d_HTA_LEFT);
2423 else if (aType == "center")
2425 aTextPrs->SetHJustification (Graphic3d_HTA_CENTER);
2427 else if (aType == "right")
2429 aTextPrs->SetHJustification (Graphic3d_HTA_RIGHT);
2433 Message::SendFail() << "Syntax error at '" << aParam << "'";
2437 else if (aParam == "-valign")
2439 if (++anArgIt >= theArgsNb)
2441 Message::SendFail() << "Syntax error: wrong number of values for parameter '" << aParam << "'";
2445 TCollection_AsciiString aType (theArgVec[anArgIt]);
2449 aTextPrs->SetVJustification (Graphic3d_VTA_TOP);
2451 else if (aType == "center")
2453 aTextPrs->SetVJustification (Graphic3d_VTA_CENTER);
2455 else if (aType == "bottom")
2457 aTextPrs->SetVJustification (Graphic3d_VTA_BOTTOM);
2459 else if (aType == "topfirstline")
2461 aTextPrs->SetVJustification (Graphic3d_VTA_TOPFIRSTLINE);
2465 Message::SendFail() << "Syntax error at '" << aParam << "'";
2469 else if (aParam == "-angle")
2471 if (++anArgIt >= theArgsNb)
2473 Message::SendFail() << "Syntax error: wrong number of values for parameter '" << aParam << "'";
2477 aTextPrs->SetAngle (Draw::Atof (theArgVec[anArgIt]) * (M_PI / 180.0));
2479 else if (aParam == "-zoom")
2481 if (++anArgIt >= theArgsNb)
2483 Message::SendFail() << "Syntax error: wrong number of values for parameter '" << aParam << "'";
2487 aTextPrs->SetZoomable (Draw::Atoi (theArgVec[anArgIt]) == 1);
2489 else if (aParam == "-height")
2491 if (++anArgIt >= theArgsNb)
2493 Message::SendFail() << "Syntax error: wrong number of values for parameter '" << aParam << "'";
2497 aTextPrs->SetHeight (Draw::Atof(theArgVec[anArgIt]));
2499 else if (aParam == "-wrapping")
2501 if (++anArgIt >= theArgsNb)
2503 Message::SendFail() << "Syntax error: wrong number of values for parameter '" << aParam << "'";
2507 if (aTextFormatter.IsNull())
2509 aTextFormatter = new Font_TextFormatter();
2511 aTextFormatter->SetWrapping ((Standard_ShortReal)Draw::Atof(theArgVec[anArgIt]));
2513 else if (aParam == "-aspect")
2515 if (++anArgIt >= theArgsNb)
2517 Message::SendFail() << "Syntax error: wrong number of values for parameter '" << aParam << "'";
2521 TCollection_AsciiString anOption (theArgVec[anArgIt]);
2522 anOption.LowerCase();
2523 Font_FontAspect aFontAspect = Font_FA_Undefined;
2524 if (!parseFontStyle (anOption, aFontAspect))
2526 Message::SendFail() << "Syntax error: unknown font aspect '" << anOption << "'";
2529 aTextPrs->SetFontAspect (aFontAspect);
2531 else if (aParam == "-font")
2533 if (++anArgIt >= theArgsNb)
2535 Message::SendFail() << "Syntax error: wrong number of values for parameter '" << aParam << "'";
2539 aTextPrs->SetFont (theArgVec[anArgIt]);
2541 else if (aParam == "-plane")
2543 if (anArgIt + 6 >= theArgsNb)
2545 Message::SendFail() << "Syntax error: wrong number of values for parameter '" << aParam << "'";
2549 Standard_Real aX = Draw::Atof (theArgVec[++anArgIt]);
2550 Standard_Real aY = Draw::Atof (theArgVec[++anArgIt]);
2551 Standard_Real aZ = Draw::Atof (theArgVec[++anArgIt]);
2552 aNormal.SetCoord (aX, aY, aZ);
2554 aX = Draw::Atof (theArgVec[++anArgIt]);
2555 aY = Draw::Atof (theArgVec[++anArgIt]);
2556 aZ = Draw::Atof (theArgVec[++anArgIt]);
2557 aDirection.SetCoord (aX, aY, aZ);
2559 aHasPlane = Standard_True;
2561 else if (aParam == "-flipping")
2563 aTextPrs->SetFlipping (Standard_True);
2565 else if (aParam == "-ownanchor")
2567 if (++anArgIt >= theArgsNb)
2569 std::cout << "Error: wrong number of values for parameter '" << aParam.ToCString() << "'.\n";
2572 aTextPrs->SetOwnAnchorPoint (Draw::Atoi (theArgVec[anArgIt]) == 1);
2574 else if (aParam == "-disptype"
2575 || aParam == "-displaytype")
2577 if (++anArgIt >= theArgsNb)
2579 Message::SendFail() << "Syntax error: wrong number of values for parameter '" << aParam << "'";
2582 TCollection_AsciiString aType (theArgVec[anArgIt]);
2584 if (aType == "subtitle")
2585 aDisplayType = Aspect_TODT_SUBTITLE;
2586 else if (aType == "decal")
2587 aDisplayType = Aspect_TODT_DEKALE;
2588 else if (aType == "blend")
2589 aDisplayType = Aspect_TODT_BLEND;
2590 else if (aType == "dimension")
2591 aDisplayType = Aspect_TODT_DIMENSION;
2592 else if (aType == "normal")
2593 aDisplayType = Aspect_TODT_NORMAL;
2594 else if (aType == "shadow")
2595 aDisplayType = Aspect_TODT_SHADOW;
2598 Message::SendFail() << "Syntax error: wrong display type '" << aType << "'";
2602 else if (aParam == "-subcolor"
2603 || aParam == "-subtitlecolor")
2605 Quantity_Color aColor;
2606 Standard_Integer aNbParsed = Draw::ParseColor (theArgsNb - anArgIt - 1,
2607 theArgVec + anArgIt + 1,
2611 Message::SendFail() << "Syntax error at '" << aParam << "'";
2614 anArgIt += aNbParsed;
2615 aTextPrs->SetColorSubTitle (aColor);
2617 else if (aParam == "-2d")
2619 aTrsfPers = new Graphic3d_TransformPers (Graphic3d_TMF_2d);
2621 else if (aParam == "-trsfperspos"
2622 || aParam == "-perspos")
2624 if (anArgIt + 2 >= theArgsNb)
2626 Message::SendFail() << "Error: wrong number of values for parameter '" << aParam << "'.";
2630 TCollection_AsciiString aX (theArgVec[++anArgIt]);
2631 TCollection_AsciiString aY (theArgVec[++anArgIt]);
2632 TCollection_AsciiString aZ = "0";
2633 if (!aX.IsIntegerValue()
2634 || !aY.IsIntegerValue())
2636 Message::SendFail() << "Error: wrong syntax at '" << aParam << "'.";
2639 if (anArgIt + 1 < theArgsNb)
2641 TCollection_AsciiString aTemp = theArgVec[anArgIt + 1];
2642 if (aTemp.IsIntegerValue())
2649 Standard_Integer aCorner = Aspect_TOTP_CENTER;
2650 if (aX.IntegerValue() > 0.0) { aCorner |= Aspect_TOTP_RIGHT; }
2651 else if (aX.IntegerValue() < 0.0) { aCorner |= Aspect_TOTP_LEFT; }
2652 if (aY.IntegerValue() > 0.0) { aCorner |= Aspect_TOTP_TOP; }
2653 else if (aY.IntegerValue() < 0.0) { aCorner |= Aspect_TOTP_BOTTOM; }
2654 aTrsfPers = new Graphic3d_TransformPers (aTrsfPers->Mode(), Aspect_TypeOfTriedronPosition (aCorner), Graphic3d_Vec2i (aZ.IntegerValue()));
2658 Message::SendFail() << "Syntax error: unknown argument '" << aParam << "'";
2663 aTextPrs->SetTextFormatter (aTextFormatter);
2667 aTextPrs->SetOrientation3D (gp_Ax2 (aPos, aNormal, aDirection));
2670 aTextPrs->SetDisplayType (aDisplayType);
2672 if (!aTrsfPers.IsNull())
2674 aContext->SetTransformPersistence (aTextPrs, aTrsfPers);
2675 aTextPrs->SetZLayer(Graphic3d_ZLayerId_TopOSD);
2676 if (aTextPrs->Position().Z() != 0)
2678 aTextPrs->SetPosition (gp_Pnt(aTextPrs->Position().X(), aTextPrs->Position().Y(), 0));
2681 else if (!aTextPrs->TransformPersistence().IsNull())
2683 aContext->SetTransformPersistence (aTextPrs, Handle(Graphic3d_TransformPers)());
2688 ViewerTest::Display (aName, aTextPrs, Standard_False);
2692 aContext->Redisplay (aTextPrs, Standard_False, Standard_True);
2698 #include <gp_Pnt.hxx>
2699 #include <Graphic3d_ArrayOfPoints.hxx>
2700 #include <Graphic3d_ArrayOfPrimitives.hxx>
2701 #include <Graphic3d_ArrayOfTriangles.hxx>
2702 #include <Poly_Array1OfTriangle.hxx>
2703 #include <Poly_Triangle.hxx>
2704 #include <Poly_Triangulation.hxx>
2705 #include <TColgp_Array1OfPnt.hxx>
2706 #include <TShort_Array1OfShortReal.hxx>
2707 #include <TShort_HArray1OfShortReal.hxx>
2709 #include <AIS_Triangulation.hxx>
2710 #include <StdPrs_ToolTriangulatedShape.hxx>
2711 #include <Poly_Connect.hxx>
2712 #include <TColgp_Array1OfDir.hxx>
2713 #include <Graphic3d_GraphicDriver.hxx>
2715 #include <TColStd_Array1OfInteger.hxx>
2716 #include <TColStd_HArray1OfInteger.hxx>
2717 #include <Prs3d_ShadingAspect.hxx>
2718 #include <Graphic3d_MaterialAspect.hxx>
2719 #include <Graphic3d_AspectFillArea3d.hxx>
2721 #include <BRepPrimAPI_MakeCylinder.hxx>
2722 #include <TopoDS_Shape.hxx>
2723 #include <TopExp_Explorer.hxx>
2724 #include <TopAbs.hxx>
2725 #include <AIS_InteractiveObject.hxx>
2728 //===============================================================================================
2729 //function : CalculationOfSphere
2731 //purpose : Create a Sphere
2732 //===============================================================================================
2734 Handle( Poly_Triangulation ) CalculationOfSphere( double X , double Y , double Z ,
2737 double mRadius = Radius;
2738 double mCenter[3] = {X,Y,Z};
2739 int mThetaResolution;
2741 double mStartTheta = 0;//StartTheta;
2742 double mEndTheta = 360;//EndTheta;
2743 double mStartPhi = 0;//StartPhi;
2744 double mEndPhi = 180;//EndPhi;
2745 res = res < 4 ? 4 : res;
2747 mThetaResolution = res;
2748 mPhiResolution = res;
2751 int jStart, jEnd, numOffset;
2752 double x[3], n[3], deltaPhi, deltaTheta, phi, theta, radius;
2753 double startTheta, endTheta, startPhi, endPhi;
2754 int base, numPoles=0, thetaResolution, phiResolution;
2759 if ( numPieces > mThetaResolution ) {
2760 numPieces = mThetaResolution;
2763 int localThetaResolution = mThetaResolution;
2764 double localStartTheta = mStartTheta;
2765 double localEndTheta = mEndTheta;
2767 while ( localEndTheta < localStartTheta ) {
2768 localEndTheta += 360.0;
2771 deltaTheta = (localEndTheta - localStartTheta) / localThetaResolution;
2773 // Change the ivars based on pieces.
2775 start = piece * localThetaResolution / numPieces;
2776 end = (piece+1) * localThetaResolution / numPieces;
2777 localEndTheta = localStartTheta + (double)(end) * deltaTheta;
2778 localStartTheta = localStartTheta + (double)(start) * deltaTheta;
2779 localThetaResolution = end - start;
2781 // Create north pole if needed
2782 int number_point = 0;
2783 int number_pointArray = 0;
2785 if ( mStartPhi <= 0.0 ) {
2786 number_pointArray++;
2789 if ( mEndPhi >= 180.0 ) {
2790 number_pointArray++;
2794 // Check data, determine increments, and convert to radians
2795 startTheta = (localStartTheta < localEndTheta ? localStartTheta : localEndTheta);
2796 startTheta *= M_PI / 180.0;
2797 endTheta = (localEndTheta > localStartTheta ? localEndTheta : localStartTheta);
2798 endTheta *= M_PI / 180.0;
2801 startPhi = ( mStartPhi < mEndPhi ? mStartPhi : mEndPhi);
2802 startPhi *= M_PI / 180.0;
2803 endPhi = ( mEndPhi > mStartPhi ? mEndPhi : mStartPhi);
2804 endPhi *= M_PI / 180.0;
2806 phiResolution = mPhiResolution - numPoles;
2807 deltaPhi = (endPhi - startPhi) / ( mPhiResolution - 1);
2808 thetaResolution = localThetaResolution;
2809 if ( fabs(localStartTheta - localEndTheta) < 360.0 ) {
2810 ++localThetaResolution;
2812 deltaTheta = (endTheta - startTheta) / thetaResolution;
2814 jStart = ( mStartPhi <= 0.0 ? 1 : 0);
2815 jEnd = ( mEndPhi >= 180.0 ? mPhiResolution - 1 : mPhiResolution);
2817 // Create intermediate points
2818 for ( i = 0; i < localThetaResolution; i++ ) {
2819 for ( j = jStart; j < jEnd; j++ ) {
2820 number_pointArray++;
2824 //Generate mesh connectivity
2825 base = phiResolution * localThetaResolution;
2827 int number_triangle = 0 ;
2828 if ( mStartPhi <= 0.0 ) { // around north pole
2829 number_triangle += localThetaResolution;
2832 if ( mEndPhi >= 180.0 ) { // around south pole
2833 number_triangle += localThetaResolution;
2836 // bands in-between poles
2837 for ( i=0; i < localThetaResolution; i++){
2838 for ( j=0; j < (phiResolution-1); j++){
2839 number_triangle +=2;
2843 Handle(Poly_Triangulation) polyTriangulation = new Poly_Triangulation (number_pointArray, number_triangle, false, true);
2845 if ( mStartPhi <= 0.0 ){
2848 x[2] = mCenter[2] + mRadius;
2849 polyTriangulation->SetNode (1, gp_Pnt (x[0],x[1],x[2]));
2852 // Create south pole if needed
2853 if ( mEndPhi >= 180.0 ){
2856 x[2] = mCenter[2] - mRadius;
2857 polyTriangulation->SetNode (2, gp_Pnt (x[0],x[1],x[2]));
2861 for ( i=0; i < localThetaResolution; i++){
2862 theta = localStartTheta * M_PI / 180.0 + i*deltaTheta;
2863 for ( j = jStart; j < jEnd; j++){
2864 phi = startPhi + j*deltaPhi;
2865 radius = mRadius * sin((double)phi);
2866 n[0] = radius * cos((double)theta);
2867 n[1] = radius * sin((double)theta);
2868 n[2] = mRadius * cos((double)phi);
2869 x[0] = n[0] + mCenter[0];
2870 x[1] = n[1] + mCenter[1];
2871 x[2] = n[2] + mCenter[2];
2872 polyTriangulation->SetNode (number_point, gp_Pnt (x[0],x[1],x[2]));
2878 number_triangle = 1;
2879 if ( mStartPhi <= 0.0 ){// around north pole
2880 for (i=0; i < localThetaResolution; i++){
2881 pts[0] = phiResolution*i + numPoles;
2882 pts[1] = (phiResolution*(i+1) % base) + numPoles;
2884 polyTriangulation->SetTriangle (number_triangle, Poly_Triangle (pts[0],pts[1],pts[2]));
2889 if ( mEndPhi >= 180.0 ){ // around south pole
2890 numOffset = phiResolution - 1 + numPoles;
2891 for (i=0; i < localThetaResolution; i++){
2892 pts[0] = phiResolution*i + numOffset;
2893 pts[2] = ((phiResolution*(i+1)) % base) + numOffset;
2894 pts[1] = numPoles - 1;
2895 polyTriangulation->SetTriangle (number_triangle, Poly_Triangle (pts[0],pts[1],pts[2]));
2900 // bands in-between poles
2902 for (i=0; i < localThetaResolution; i++){
2903 for (j=0; j < (phiResolution-1); j++){
2904 pts[0] = phiResolution*i + j + numPoles;
2905 pts[1] = pts[0] + 1;
2906 pts[2] = ((phiResolution*(i+1)+j) % base) + numPoles + 1;
2907 polyTriangulation->SetTriangle (number_triangle, Poly_Triangle (pts[0],pts[1],pts[2]));
2910 pts[2] = pts[1] - 1;
2911 polyTriangulation->SetTriangle (number_triangle, Poly_Triangle (pts[0],pts[1],pts[2]));
2916 Poly_Connect pc (polyTriangulation);
2918 Standard_Integer index[3];
2919 Standard_Real Tol = Precision::Confusion();
2922 for (i = 1; i <= polyTriangulation->NbNodes(); i++)
2924 gp_XYZ eqPlan(0, 0, 0);
2925 for (pc.Initialize (i); pc.More(); pc.Next())
2927 polyTriangulation->Triangle (pc.Value()).Get (index[0], index[1], index[2]);
2928 gp_XYZ v1 (polyTriangulation->Node (index[1]).Coord() - polyTriangulation->Node (index[0]).Coord());
2929 gp_XYZ v2 (polyTriangulation->Node (index[2]).Coord() - polyTriangulation->Node (index[1]).Coord());
2931 Standard_Real mod = vv.Modulus();
2932 if(mod < Tol) continue;
2936 Standard_Real modmax = eqPlan.Modulus();
2938 Nor = gp_Dir(eqPlan);
2940 Nor = gp_Dir(0., 0., 1.);
2942 polyTriangulation->SetNormal (i, Nor.XYZ());
2945 return polyTriangulation;
2948 //===============================================================================================
2949 //function : VDrawSphere
2951 //purpose : Create an AIS shape.
2952 //===============================================================================================
2953 static int VDrawSphere (Draw_Interpretor& /*di*/, Standard_Integer argc, const char** argv)
2956 Handle(AIS_InteractiveContext) aContextAIS = ViewerTest::GetAISContext();
2957 if (aContextAIS.IsNull())
2959 Message::SendFail ("Error: no active viewer");
2964 Message::SendFail() << "Syntax error: wrong number of arguments.\n"
2965 << "Use: " << argv[0] << " shapeName Fineness [X=0.0 Y=0.0 Z=0.0] [Radius=100.0] [ToShowEdges=0]";
2969 // read the arguments
2970 TCollection_AsciiString aShapeName (argv[1]);
2971 Standard_Integer aResolution = Draw::Atoi (argv[2]);
2972 Standard_Real aCenterX = (argc > 5) ? Draw::Atof (argv[3]) : 0.0;
2973 Standard_Real aCenterY = (argc > 5) ? Draw::Atof (argv[4]) : 0.0;
2974 Standard_Real aCenterZ = (argc > 5) ? Draw::Atof (argv[5]) : 0.0;
2975 Standard_Real aRadius = (argc > 6) ? Draw::Atof (argv[6]) : 100.0;
2976 Standard_Boolean toShowEdges = (argc > 7) ? Draw::Atoi (argv[7]) == 1 : Standard_False;
2977 Standard_Boolean toPrintInfo = (argc > 8) ? Draw::Atoi (argv[8]) == 1 : Standard_True;
2979 // remove AIS object with given name from map
2980 VDisplayAISObject (aShapeName, Handle(AIS_InteractiveObject)());
2983 std::cout << "Compute Triangulation...\n";
2984 Handle(AIS_Triangulation) aShape
2985 = new AIS_Triangulation (CalculationOfSphere (aCenterX, aCenterY, aCenterZ,
2988 const Standard_Integer aNumberPoints = aShape->GetTriangulation()->NbNodes();
2989 const Standard_Integer aNumberTriangles = aShape->GetTriangulation()->NbTriangles();
2991 // stupid initialization of Green color in RGBA space as integer
2992 // probably wrong for big-endian CPUs
2993 const Graphic3d_Vec4ub aColor (0, 255, 0, 0);
2995 // setup colors array per vertex
2996 Handle(TColStd_HArray1OfInteger) aColorArray = new TColStd_HArray1OfInteger (1, aNumberPoints);
2997 for (Standard_Integer aNodeId = 1; aNodeId <= aNumberPoints; ++aNodeId)
2999 aColorArray->SetValue (aNodeId, *reinterpret_cast<const Standard_Integer*> (aColor.GetData()));
3001 aShape->SetColors (aColorArray);
3004 Standard_Integer aPointsSize = aNumberPoints * 3 * sizeof(float); // 3x GLfloat
3005 Standard_Integer aNormalsSize = aNumberPoints * 3 * sizeof(float); // 3x GLfloat
3006 Standard_Integer aColorsSize = aNumberPoints * 3 * sizeof(float); // 3x GLfloat without alpha
3007 Standard_Integer aTrianglesSize = aNumberTriangles * 3 * sizeof(int); // 3x GLint
3008 Standard_Integer aPolyConnectSize = aNumberPoints * 4 + aNumberTriangles * 6 * 4;
3009 Standard_Integer aTotalSize = aPointsSize + aNormalsSize + aColorsSize + aTrianglesSize;
3010 aTotalSize >>= 20; //MB
3011 aNormalsSize >>= 20;
3013 aTrianglesSize >>= 20;
3014 aPolyConnectSize >>= 20;
3017 std::cout << "NumberOfPoints: " << aNumberPoints << "\n"
3018 << "NumberOfTriangles: " << aNumberTriangles << "\n"
3019 << "Amount of memory required for PolyTriangulation without Normals: " << (aTotalSize - aNormalsSize) << " Mb\n"
3020 << "Amount of memory for colors: " << aColorsSize << " Mb\n"
3021 << "Amount of memory for PolyConnect: " << aPolyConnectSize << " Mb\n"
3022 << "Amount of graphic card memory required: " << aTotalSize << " Mb\n";
3025 // Setting material properties, very important for desirable visual result!
3026 Graphic3d_MaterialAspect aMat (Graphic3d_NameOfMaterial_Plastified);
3027 aMat.SetAmbientColor (Quantity_Color (Graphic3d_Vec3 (0.04f)));
3028 aMat.SetSpecularColor(Quantity_Color (Graphic3d_Vec3 (0.50f)));
3029 Handle(Graphic3d_AspectFillArea3d) anAspect
3030 = new Graphic3d_AspectFillArea3d (Aspect_IS_SOLID,
3032 Quantity_NOC_YELLOW,
3037 Handle(Prs3d_ShadingAspect) aShAsp = new Prs3d_ShadingAspect();
3038 anAspect->SetDrawEdges (toShowEdges);
3039 aShAsp->SetAspect (anAspect);
3040 aShape->Attributes()->SetShadingAspect (aShAsp);
3042 VDisplayAISObject (aShapeName, aShape);
3046 //=============================================================================
3047 //function : VComputeHLR
3049 //=============================================================================
3051 static int VComputeHLR (Draw_Interpretor& ,
3052 Standard_Integer theArgNb,
3053 const char** theArgVec)
3055 TCollection_AsciiString aShapeName, aHlrName;
3060 bool hasViewDirArg = false;
3061 Prs3d_TypeOfHLR anAlgoType = Prs3d_TOH_PolyAlgo;
3062 bool toShowCNEdges = false, toShowHiddenEdges = false;
3063 int aNbIsolines = 0;
3064 if (Handle(V3d_Viewer) aViewer = ViewerTest::GetViewerFromContext())
3067 Handle(V3d_View) aView = ViewerTest::CurrentView();
3068 Standard_Integer aWidth, aHeight;
3069 Standard_Real aCentX, aCentY, aCentZ, aDirX, aDirY, aDirZ;
3070 Standard_Real aRightX, aRightY, aRightZ;
3071 aView->Window()->Size (aWidth, aHeight);
3073 aView->ConvertWithProj (aWidth, aHeight/2,
3074 aRightX, aRightY, aRightZ,
3075 aDirX, aDirY, aDirZ);
3076 aView->ConvertWithProj (aWidth/2, aHeight/2,
3077 aCentX, aCentY, aCentZ,
3078 aDirX, aDirY, aDirZ);
3080 anEye.SetCoord (-aCentX, -aCentY, -aCentZ);
3081 aDir.SetCoord (-aDirX, -aDirY, -aDirZ);
3082 aRight.SetCoord (aRightX - aCentX, aRightY - aCentY, aRightZ - aCentZ);
3083 aProjAx.SetLocation (anEye);
3084 aProjAx.SetDirection (aDir);
3085 aProjAx.SetXDirection (aRight);
3087 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
3089 TCollection_AsciiString anArgCase (theArgVec[anArgIter]);
3090 anArgCase.LowerCase();
3091 if (anArgIter + 1 < theArgNb
3092 && (anArgCase == "-algotype"
3093 || anArgCase == "-algo"
3094 || anArgCase == "-type"))
3096 TCollection_AsciiString anArgNext (theArgVec[++anArgIter]);
3097 anArgNext.LowerCase();
3098 if (anArgNext == "polyalgo")
3100 anAlgoType = Prs3d_TOH_PolyAlgo;
3102 else if (anArgNext == "algo")
3104 anAlgoType = Prs3d_TOH_Algo;
3108 Message::SendFail() << "Syntax error: unknown algo type '" << anArgNext << "'";
3112 else if (anArgCase == "-showhiddenedges"
3113 || anArgCase == "-hiddenedges"
3114 || anArgCase == "-hidden")
3116 toShowHiddenEdges = true;
3117 if (anArgIter + 1 < theArgNb
3118 && Draw::ParseOnOff (theArgVec[anArgIter + 1], toShowHiddenEdges))
3123 else if (anArgCase == "-showtangentedges"
3124 || anArgCase == "-tangentedges"
3125 || anArgCase == "-tangent")
3127 toShowCNEdges = true;
3128 if (anArgIter + 1 < theArgNb
3129 && Draw::ParseOnOff (theArgVec[anArgIter + 1], toShowCNEdges))
3134 else if (anArgIter + 1 < theArgNb
3135 && (anArgCase == "-nbiso"
3136 || anArgCase == "-nbisolines"))
3138 aNbIsolines = Draw::Atoi (theArgVec[++anArgIter]);
3140 else if (aSh.IsNull())
3142 aSh = DBRep::Get (theArgVec[anArgIter]);
3143 aShapeName = theArgVec[anArgIter];
3146 BRep_Builder aBrepBuilder;
3147 BRepTools::Read (aSh, theArgVec[anArgIter], aBrepBuilder);
3150 Message::SendFail() << "Syntax error: no shape with name " << theArgVec[anArgIter] << " found";
3155 else if (aHlrName.IsEmpty())
3157 aHlrName = theArgVec[anArgIter];
3159 else if (!hasViewDirArg
3160 && anArgIter + 8 < theArgNb)
3162 hasViewDirArg = true;
3164 anEye.SetCoord (Draw::Atof (theArgVec[anArgIter + 0]), Draw::Atof (theArgVec[anArgIter + 1]), Draw::Atof (theArgVec[anArgIter + 2]));
3165 aDir .SetCoord (Draw::Atof (theArgVec[anArgIter + 3]), Draw::Atof (theArgVec[anArgIter + 4]), Draw::Atof (theArgVec[anArgIter + 5]));
3166 anUp .SetCoord (Draw::Atof (theArgVec[anArgIter + 6]), Draw::Atof (theArgVec[anArgIter + 7]), Draw::Atof (theArgVec[anArgIter + 8]));
3167 aProjAx.SetLocation (anEye);
3168 aProjAx.SetDirection (aDir);
3169 aProjAx.SetYDirection (anUp);
3174 Message::SendFail() << "Syntax error: unknown argument '" << theArgVec[anArgIter] << "'";
3179 if (aHlrName.IsEmpty() || aSh.IsNull()
3180 || (ViewerTest::GetAISContext().IsNull() && hasViewDirArg))
3182 Message::SendFail ("Syntax error: wrong number of arguments");
3186 HLRAlgo_Projector aProjector (aProjAx);
3187 TopoDS_Shape aVisible[6];
3188 TopoDS_Shape aHidden[6];
3189 if (anAlgoType == Prs3d_TOH_PolyAlgo)
3191 Handle(HLRBRep_PolyAlgo) aPolyAlgo = new HLRBRep_PolyAlgo();
3192 aPolyAlgo->Projector (aProjector);
3193 aPolyAlgo->Load (aSh);
3194 aPolyAlgo->Update();
3196 HLRBRep_PolyHLRToShape aHLRToShape;
3197 aHLRToShape.Update (aPolyAlgo);
3199 aVisible[HLRBRep_Sharp] = aHLRToShape.VCompound();
3200 aVisible[HLRBRep_OutLine] = aHLRToShape.OutLineVCompound(); // extract visible outlines
3201 aVisible[HLRBRep_Rg1Line] = aHLRToShape.Rg1LineVCompound();
3204 aVisible[HLRBRep_RgNLine] = aHLRToShape.RgNLineVCompound();
3206 if (toShowHiddenEdges)
3208 aHidden[HLRBRep_Sharp] = aHLRToShape.HCompound();
3209 aHidden[HLRBRep_OutLine] = aHLRToShape.OutLineHCompound();
3210 aHidden[HLRBRep_Rg1Line] = aHLRToShape.Rg1LineHCompound();
3213 aHidden[HLRBRep_RgNLine] = aHLRToShape.RgNLineHCompound();
3219 Handle(HLRBRep_Algo) aHlrAlgo = new HLRBRep_Algo();
3220 aHlrAlgo->Add (aSh, aNbIsolines);
3221 aHlrAlgo->Projector (aProjector);
3225 HLRBRep_HLRToShape aHLRToShape (aHlrAlgo);
3226 aVisible[HLRBRep_Sharp] = aHLRToShape.VCompound();
3227 aVisible[HLRBRep_OutLine] = aHLRToShape.OutLineVCompound();
3228 aVisible[HLRBRep_Rg1Line] = aHLRToShape.Rg1LineVCompound();
3231 aVisible[HLRBRep_RgNLine] = aHLRToShape.RgNLineVCompound();
3233 aVisible[HLRBRep_IsoLine] = aHLRToShape.IsoLineVCompound();
3235 if (toShowHiddenEdges)
3237 aHidden[HLRBRep_Sharp] = aHLRToShape.HCompound();
3238 aHidden[HLRBRep_OutLine] = aHLRToShape.OutLineHCompound();
3239 aHidden[HLRBRep_Rg1Line] = aHLRToShape.Rg1LineHCompound();
3242 aHidden[HLRBRep_RgNLine] = aHLRToShape.RgNLineHCompound();
3244 aHidden[HLRBRep_IsoLine] = aHLRToShape.IsoLineHCompound();
3247 //aVisible[HLRBRep_Sharp] = aHLRToShape.CompoundOfEdges (HLRBRep_Sharp, Standard_True, Standard_True);
3248 //aVisible[HLRBRep_OutLine] = aHLRToShape.OutLineVCompound3d();
3251 TopoDS_Compound aCompRes, aCompVis, aCompHid;
3252 BRep_Builder aBuilder;
3253 aBuilder.MakeCompound (aCompVis);
3254 aBuilder.MakeCompound (aCompHid);
3255 aBuilder.MakeCompound (aCompRes);
3256 for (int aTypeIter = 0; aTypeIter < 6; ++aTypeIter)
3258 if (!aVisible[aTypeIter].IsNull())
3260 aBuilder.Add (aCompVis, aVisible[aTypeIter]);
3262 if (!aHidden[aTypeIter].IsNull())
3264 aBuilder.Add (aCompHid, aHidden[aTypeIter]);
3267 aBuilder.Add (aCompRes, aCompVis);
3268 aBuilder.Add (aCompRes, aCompHid);
3270 // create an AIS shape and display it
3271 if (!ViewerTest::GetAISContext().IsNull())
3273 Handle(AIS_ColoredShape) anObject = new AIS_ColoredShape (aCompRes);
3274 if (toShowHiddenEdges)
3276 Handle(Prs3d_LineAspect) aLineAspect = new Prs3d_LineAspect (Quantity_Color (Quantity_NOC_RED), Aspect_TOL_DASH, 1.0f);
3277 for (int aTypeIter = 0; aTypeIter < 6; ++aTypeIter)
3279 if (!aHidden[aTypeIter].IsNull())
3281 Handle(AIS_ColoredDrawer) aDrawer = anObject->CustomAspects (aHidden[aTypeIter]);
3282 aDrawer->SetLineAspect (aLineAspect);
3283 aDrawer->SetWireAspect (aLineAspect);
3284 aDrawer->SetFreeBoundaryAspect (aLineAspect);
3285 aDrawer->SetUnFreeBoundaryAspect (aLineAspect);
3289 ViewerTest::Display (aHlrName, anObject, true);
3292 DBRep::Set (aHlrName.ToCString(), aCompRes);
3296 // This class is a wrap for Graphic3d_ArrayOfPrimitives; it is used for
3297 // manipulating and displaying such an array with AIS context
3299 class MyPArrayObject : public AIS_InteractiveObject
3304 MyPArrayObject (const Handle(Graphic3d_ArrayOfPrimitives)& thePArray) : myPArray (thePArray) {}
3306 MyPArrayObject (Graphic3d_TypeOfPrimitiveArray thePrimType,
3307 const Handle(TColStd_HArray1OfAsciiString)& theDesc,
3308 const Handle(Graphic3d_AspectMarker3d)& theMarkerAspect)
3310 Init (thePrimType, theDesc, theMarkerAspect, Standard_False);
3313 //! Initialize the array from specified description.
3314 Standard_Boolean Init (Graphic3d_TypeOfPrimitiveArray thePrimType,
3315 const Handle(TColStd_HArray1OfAsciiString)& theDesc,
3316 const Handle(Graphic3d_AspectMarker3d)& theMarkerAspect,
3317 Standard_Boolean theToPatch);
3319 DEFINE_STANDARD_RTTI_INLINE(MyPArrayObject,AIS_InteractiveObject);
3321 virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE { return theMode == 0; }
3323 //! Sets color to this interactive object
3324 //! @param theColor the color to be set
3325 virtual void SetColor (const Quantity_Color& theColor) Standard_OVERRIDE;
3329 virtual void Compute (const Handle(PrsMgr_PresentationManager)& thePrsMgr,
3330 const Handle(Prs3d_Presentation)& thePrs,
3331 const Standard_Integer theMode) Standard_OVERRIDE;
3333 virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSel,
3334 const Standard_Integer theMode) Standard_OVERRIDE;
3336 bool CheckInputCommand (const TCollection_AsciiString theCommand,
3337 const Handle(TColStd_HArray1OfAsciiString)& theArgsArray,
3338 Standard_Integer &theArgIndex,
3339 Standard_Integer theArgCount,
3340 Standard_Integer theMaxArgs);
3342 //! Sets color for the shading aspect of the drawer used in this interactive object
3343 //! @param theColor the color to be set
3344 void setColorForShadingAspect(const Quantity_Color& theColor);
3346 //! Replaces shading aspect from myDrawer->Link() with the own shading aspect of myDrawer for this interactive object
3347 void replaceShadingAspect();
3351 Handle(Graphic3d_AspectMarker3d) myMarkerAspect;
3352 Handle(Graphic3d_ArrayOfPrimitives) myPArray;
3356 void MyPArrayObject::Compute (const Handle(PrsMgr_PresentationManager)& ,
3357 const Handle(Prs3d_Presentation)& thePrs,
3358 const Standard_Integer theMode)
3360 if (myPArray.IsNull() || theMode != 0)
3365 Handle(Graphic3d_Group) aGroup = thePrs->NewGroup();
3366 if (!myMarkerAspect.IsNull())
3368 aGroup->SetGroupPrimitivesAspect (myMarkerAspect);
3372 aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect());
3374 aGroup->AddPrimitiveArray (myPArray);
3377 Standard_Boolean MyPArrayObject::Init (Graphic3d_TypeOfPrimitiveArray thePrimType,
3378 const Handle(TColStd_HArray1OfAsciiString)& theDesc,
3379 const Handle(Graphic3d_AspectMarker3d)& theMarkerAspect,
3380 Standard_Boolean theToPatch)
3382 myMarkerAspect = theMarkerAspect;
3388 // Parsing array description
3389 Standard_Integer aVertexNum = 0, aBoundNum = 0, aEdgeNum = 0;
3390 Graphic3d_ArrayFlags anArrayFlags = Graphic3d_ArrayFlags_None;
3392 const Standard_Integer anArgsCount = theDesc->Length();
3393 TCollection_AsciiString aCommand;
3394 for (Standard_Integer anArgIndex = theDesc->Lower(); anArgIndex <= theDesc->Upper(); )
3396 aCommand = theDesc->Value (anArgIndex);
3397 aCommand.LowerCase();
3399 if (CheckInputCommand ("-deinterleaved", theDesc, anArgIndex, 0, anArgsCount))
3401 anArrayFlags |= Graphic3d_ArrayFlags_AttribsDeinterleaved;
3403 else if (CheckInputCommand ("-mutable", theDesc, anArgIndex, 0, anArgsCount))
3405 anArrayFlags |= Graphic3d_ArrayFlags_AttribsMutable;
3406 anArrayFlags |= Graphic3d_ArrayFlags_IndexesMutable;
3409 else if (CheckInputCommand ("v", theDesc, anArgIndex, 3, anArgsCount))
3411 // vertex has a normal or normal with color or texel
3412 if (CheckInputCommand ("n", theDesc, anArgIndex, 3, anArgsCount))
3414 anArrayFlags = anArrayFlags | Graphic3d_ArrayFlags_VertexNormal;
3417 // vertex has a color
3418 if (CheckInputCommand ("c", theDesc, anArgIndex, 3, anArgsCount))
3420 anArrayFlags = anArrayFlags | Graphic3d_ArrayFlags_VertexColor;
3423 // vertex has a texel
3424 if (CheckInputCommand ("t", theDesc, anArgIndex, 2, anArgsCount))
3426 anArrayFlags = anArrayFlags | Graphic3d_ArrayFlags_VertexTexel;
3432 else if (CheckInputCommand ("b", theDesc, anArgIndex, 1, anArgsCount))
3435 if (CheckInputCommand ("c", theDesc, anArgIndex, 3, anArgsCount))
3437 anArrayFlags = anArrayFlags | Graphic3d_ArrayFlags_BoundColor;
3443 else if (CheckInputCommand ("e", theDesc, anArgIndex, 1, anArgsCount))
3452 if (myPArray.IsNull())
3454 myPArray = Graphic3d_ArrayOfPrimitives::CreateArray (thePrimType, aVertexNum, aBoundNum, aEdgeNum, anArrayFlags);
3455 if (myPArray->HasVertexColors())
3457 myDrawer->SetupOwnShadingAspect();
3458 Graphic3d_MaterialAspect aMat (Graphic3d_NameOfMaterial_Plastified);
3459 aMat.SetSpecularColor (Quantity_NOC_BLACK);
3460 aMat.SetEmissiveColor (Quantity_NOC_BLACK);
3461 aMat.SetAmbientColor (Quantity_Color (Graphic3d_Vec3 (0.5f)));
3462 aMat.SetDiffuseColor (Quantity_Color (Graphic3d_Vec3 (0.5f)));
3463 myDrawer->ShadingAspect()->SetMaterial (aMat);
3464 myDrawer->ShadingAspect()->SetColor (Quantity_NOC_WHITE);
3469 if (myPArray->Type() != thePrimType
3470 || aVertexNum > myPArray->VertexNumberAllocated()
3471 || aEdgeNum > myPArray->EdgeNumberAllocated()
3472 || aBoundNum > myPArray->BoundNumberAllocated()
3473 || !myPArray->Attributes()->IsMutable()
3474 || (!myPArray->Indices().IsNull() && !myPArray->Indices()->IsMutable()))
3476 Message::SendFail ("Syntax error: array cannot be patched");
3477 return Standard_False;
3480 myPArray->Attributes()->NbElements = aVertexNum;
3481 if (Handle(Graphic3d_AttribBuffer) anAttribs = Handle(Graphic3d_AttribBuffer)::DownCast (myPArray->Attributes()))
3483 anAttribs->Invalidate (0, aVertexNum - 1);
3485 if (!myPArray->Indices().IsNull())
3487 myPArray->Indices()->NbElements = aEdgeNum;
3489 if (!myPArray->Bounds().IsNull())
3491 myPArray->Bounds()->NbBounds = aBoundNum;
3495 Standard_Integer aVertIndex = 0;
3496 for (Standard_Integer anArgIndex = theDesc->Lower(); anArgIndex <= theDesc->Upper(); )
3498 aCommand = theDesc->Value (anArgIndex);
3499 aCommand.LowerCase();
3500 if (!aCommand.IsAscii()
3501 || aCommand.IsEmpty())
3506 // skip beautifiers (syntax is not actually validated)
3507 if (aCommand == "-deinterleaved"
3508 || aCommand == "-mutable"
3509 || aCommand.Value (1) == '('
3510 || aCommand.Value (1) == ')'
3511 || aCommand.Value (1) == ',')
3516 else if (CheckInputCommand ("v", theDesc, anArgIndex, 3, anArgsCount))
3518 const Graphic3d_Vec3 aVert ((float )theDesc->Value (anArgIndex - 3).RealValue(),
3519 (float )theDesc->Value (anArgIndex - 2).RealValue(),
3520 (float )theDesc->Value (anArgIndex - 1).RealValue());
3521 if ((anArrayFlags & Graphic3d_ArrayFlags_AttribsDeinterleaved) != 0
3522 || (anArrayFlags & Graphic3d_ArrayFlags_AttribsMutable) != 0)
3525 myPArray->SetVertice (aVertIndex, aVert.x(), aVert.y(), aVert.z());
3529 aVertIndex = myPArray->AddVertex (aVert);
3532 // vertex has a normal or normal with color or texel
3533 if (CheckInputCommand ("n", theDesc, anArgIndex, 3, anArgsCount))
3535 const Graphic3d_Vec3 aNorm ((float )theDesc->Value (anArgIndex - 3).RealValue(),
3536 (float )theDesc->Value (anArgIndex - 2).RealValue(),
3537 (float )theDesc->Value (anArgIndex - 1).RealValue());
3538 myPArray->SetVertexNormal (aVertIndex, aNorm.x(), aNorm.y(), aNorm.z());
3541 if (CheckInputCommand ("c", theDesc, anArgIndex, 3, anArgsCount))
3543 const Graphic3d_Vec3d aCol (theDesc->Value (anArgIndex - 3).RealValue(),
3544 theDesc->Value (anArgIndex - 2).RealValue(),
3545 theDesc->Value (anArgIndex - 1).RealValue());
3546 myPArray->SetVertexColor (aVertIndex, aCol.r(), aCol.g(), aCol.b());
3548 if (CheckInputCommand ("t", theDesc, anArgIndex, 2, anArgsCount))
3550 const Graphic3d_Vec2 aTex ((float )theDesc->Value (anArgIndex - 2).RealValue(),
3551 (float )theDesc->Value (anArgIndex - 1).RealValue());
3552 myPArray->SetVertexTexel (aVertIndex, aTex.x(), aTex.y());
3556 else if (CheckInputCommand ("b", theDesc, anArgIndex, 1, anArgsCount))
3558 Standard_Integer aVertCount = theDesc->Value (anArgIndex - 1).IntegerValue();
3560 if (CheckInputCommand ("c", theDesc, anArgIndex, 3, anArgsCount))
3561 myPArray->AddBound (aVertCount,
3562 theDesc->Value (anArgIndex - 3).RealValue(),
3563 theDesc->Value (anArgIndex - 2).RealValue(),
3564 theDesc->Value (anArgIndex - 1).RealValue());
3567 myPArray->AddBound (aVertCount);
3570 else if (CheckInputCommand ("e", theDesc, anArgIndex, 1, anArgsCount))
3572 const Standard_Integer anEdge = theDesc->Value (anArgIndex - 1).IntegerValue();
3573 myPArray->AddEdge (anEdge);
3578 Message::SendFail() << "Syntax error: unknown argument '" << theDesc->Value(anArgIndex) << "'";
3579 return Standard_False;
3582 return Standard_True;
3585 //=======================================================================
3586 // function : SetColor
3588 //=======================================================================
3589 void MyPArrayObject::SetColor (const Quantity_Color& theColor)
3591 AIS_InteractiveObject::SetColor (theColor);
3592 setColorForShadingAspect (theColor);
3595 myMarkerAspect->SetColor (theColor);
3597 SynchronizeAspects();
3600 void MyPArrayObject::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
3601 const Standard_Integer theMode)
3604 || myPArray.IsNull())
3609 Handle(SelectMgr_EntityOwner) anOwner = new SelectMgr_EntityOwner (this);
3610 if (Handle(Graphic3d_ArrayOfTriangles) aTris = Handle(Graphic3d_ArrayOfTriangles)::DownCast (myPArray))
3612 Handle(Select3D_SensitivePrimitiveArray) aSensitive = new Select3D_SensitivePrimitiveArray (anOwner);
3613 aSensitive->InitTriangulation (myPArray->Attributes(), myPArray->Indices(), TopLoc_Location(), true);
3614 theSelection->Add (aSensitive);
3616 else if (Handle(Graphic3d_ArrayOfSegments) aSegs = Handle(Graphic3d_ArrayOfSegments)::DownCast (myPArray))
3618 if (aSegs->EdgeNumber() > 0)
3620 for (Standard_Integer aPntIter = 1; aPntIter <= aSegs->EdgeNumber(); aPntIter += 2)
3622 Handle(Select3D_SensitiveSegment) aSeg = new Select3D_SensitiveSegment (anOwner, aSegs->Vertice (aSegs->Edge (aPntIter)), aSegs->Vertice (aSegs->Edge (aPntIter + 1)));
3623 aSeg->SetSensitivityFactor (4);
3624 theSelection->Add (aSeg);
3629 for (Standard_Integer aPntIter = 1; aPntIter <= aSegs->VertexNumber(); aPntIter += 2)
3631 Handle(Select3D_SensitiveSegment) aSeg = new Select3D_SensitiveSegment (anOwner, aSegs->Vertice (aPntIter), aSegs->Vertice (aPntIter + 1));
3632 aSeg->SetSensitivityFactor (4);
3633 theSelection->Add (aSeg);
3639 Handle(Select3D_SensitivePrimitiveArray) aSensitive = new Select3D_SensitivePrimitiveArray (anOwner);
3640 aSensitive->SetSensitivityFactor (8);
3641 aSensitive->InitPoints (myPArray->Attributes(), myPArray->Indices(), TopLoc_Location(), true);
3642 theSelection->Add (aSensitive);
3646 bool MyPArrayObject::CheckInputCommand (const TCollection_AsciiString theCommand,
3647 const Handle(TColStd_HArray1OfAsciiString)& theArgsArray,
3648 Standard_Integer &theArgIndex,
3649 Standard_Integer theArgCount,
3650 Standard_Integer theMaxArgs)
3652 // check if there is more elements than expected
3653 if (theArgIndex >= theMaxArgs)
3656 TCollection_AsciiString aStrCommand = theArgsArray->Value (theArgIndex);
3657 aStrCommand.LowerCase();
3658 if (aStrCommand.Search(theCommand) != 1 ||
3659 theArgIndex + (theArgCount - 1) >= theMaxArgs)
3662 // go to the first data element
3665 // check data if it can be converted to numeric
3666 for (int aElement = 0; aElement < theArgCount; aElement++, theArgIndex++)
3668 aStrCommand = theArgsArray->Value (theArgIndex);
3669 if (!aStrCommand.IsRealValue (Standard_True))
3676 //=======================================================================
3677 // function : setColorForShadingAspect
3679 //=======================================================================
3680 void MyPArrayObject::setColorForShadingAspect (const Quantity_Color& theColor)
3682 if (myDrawer->SetupOwnShadingAspect())
3684 replaceShadingAspect();
3686 myDrawer->ShadingAspect()->SetColor (theColor);
3689 //=======================================================================
3690 // function : replaceShadingAspect
3692 //=======================================================================
3693 void MyPArrayObject::replaceShadingAspect()
3695 if (!myDrawer->Link())
3699 Graphic3d_MapOfAspectsToAspects anAspectReplacementMap;
3700 anAspectReplacementMap.Bind (myDrawer->Link()->ShadingAspect()->Aspect(), myDrawer->ShadingAspect()->Aspect());
3701 replaceAspects (anAspectReplacementMap);
3704 //=============================================================================
3705 //function : VDrawPArray
3706 //purpose : Draws primitives array from list of vertexes, bounds, edges
3707 //=============================================================================
3709 static int VDrawPArray (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
3711 Handle(AIS_InteractiveContext) aContextAIS = ViewerTest::GetAISContext();
3712 if (aContextAIS.IsNull())
3714 Message::SendFail ("Error: no active Viewer");
3719 Message::SendFail ("Syntax error: wrong number of arguments");
3723 // read the arguments
3724 Standard_Integer anArgIndex = 1;
3725 TCollection_AsciiString aName (argv[anArgIndex++]);
3726 TCollection_AsciiString anArrayType (argv[anArgIndex++]);
3727 anArrayType.LowerCase();
3728 Handle(MyPArrayObject) aPObject;
3729 if (anArrayType == "-shape")
3731 Standard_CString aShapeName = argv[anArgIndex++];
3732 TopoDS_Shape aShape = DBRep::Get (aShapeName);
3733 Handle(Graphic3d_ArrayOfPrimitives) aTris = StdPrs_ShadedShape::FillTriangles (aShape);
3734 if (aShape.IsNull())
3736 Message::SendFail() << "Syntax error: shape '" << aShapeName << "' is not found";
3739 else if (aTris.IsNull())
3741 Message::SendFail() << "Syntax error: shape '" << aShapeName << "' is not triangulated";
3745 aPObject = new MyPArrayObject (aTris);
3746 ViewerTest::Display (aName, aPObject);
3749 else if (anArrayType == "-patch"
3750 || anArrayType == "-modify"
3751 || anArrayType == "-edit")
3755 anArrayType = argv[anArgIndex++];
3756 anArrayType.LowerCase();
3759 if (GetMapOfAIS().IsBound2 (aName))
3761 aPObject = Handle(MyPArrayObject)::DownCast (GetMapOfAIS().Find2 (aName));
3763 if (aPObject.IsNull())
3765 Message::SendFail() << "Syntax error: object '" << aName << "' cannot be found";
3770 Standard_Boolean hasVertex = Standard_False;
3772 Graphic3d_TypeOfPrimitiveArray aPrimType = Graphic3d_TOPA_UNDEFINED;
3773 if (anArrayType == "points")
3775 aPrimType = Graphic3d_TOPA_POINTS;
3777 else if (anArrayType == "segments")
3779 aPrimType = Graphic3d_TOPA_SEGMENTS;
3781 else if (anArrayType == "polylines")
3783 aPrimType = Graphic3d_TOPA_POLYLINES;
3785 else if (anArrayType == "triangles")
3787 aPrimType = Graphic3d_TOPA_TRIANGLES;
3789 else if (anArrayType == "trianglefans")
3791 aPrimType = Graphic3d_TOPA_TRIANGLEFANS;
3793 else if (anArrayType == "trianglestrips")
3795 aPrimType = Graphic3d_TOPA_TRIANGLESTRIPS;
3797 else if (anArrayType == "quads")
3799 aPrimType = Graphic3d_TOPA_QUADRANGLES;
3801 else if (anArrayType == "quadstrips")
3803 aPrimType = Graphic3d_TOPA_QUADRANGLESTRIPS;
3805 else if (anArrayType == "polygons")
3807 aPrimType = Graphic3d_TOPA_POLYGONS;
3809 if (aPrimType == Graphic3d_TOPA_UNDEFINED)
3811 Message::SendFail ("Syntax error: unexpected type of primitives array");
3815 Standard_Integer aLowerArg = anArgIndex;
3816 Handle(TColStd_HArray1OfAsciiString) anArgsArray = new TColStd_HArray1OfAsciiString (0, argc - 3);
3817 for (; anArgIndex < argc; ++anArgIndex)
3819 TCollection_AsciiString aCommand (argv[anArgIndex]);
3820 aCommand.LowerCase();
3821 if (!aCommand.IsAscii())
3823 di << "Unexpected argument: #" << anArgIndex - 1 << " , "
3824 << "should be an array element: 'v', 'b', 'e' \n";
3828 if (aCommand == "v")
3830 hasVertex = Standard_True;
3833 anArgsArray->SetValue (anArgIndex - aLowerArg, aCommand);
3838 di << "You should pass any verticies in the list of array elements\n";
3842 Handle(Graphic3d_AspectMarker3d) anAspPoints;
3843 if (aPrimType == Graphic3d_TOPA_POINTS)
3845 anAspPoints = new Graphic3d_AspectMarker3d (Aspect_TOM_POINT, Quantity_NOC_YELLOW, 1.0f);
3848 // create primitives array object
3849 if (aPObject.IsNull())
3851 // register the object in map
3852 aPObject = new MyPArrayObject (aPrimType, anArgsArray, anAspPoints);
3853 VDisplayAISObject (aName, aPObject);
3857 aPObject->Init (aPrimType, anArgsArray, anAspPoints, Standard_True);
3858 ViewerTest::CurrentView()->Redraw();
3865 //! Auxiliary function for parsing translation vector - either 2D or 3D.
3866 static Standard_Integer parseTranslationVec (Standard_Integer theArgNb,
3867 const char** theArgVec,
3875 TCollection_AsciiString anX (theArgVec[0]);
3876 TCollection_AsciiString anY (theArgVec[1]);
3877 if (!anX.IsRealValue (Standard_True)
3878 || !anY.IsRealValue (Standard_True))
3883 theVec.SetX (anX.RealValue());
3884 theVec.SetY (anY.RealValue());
3887 TCollection_AsciiString anZ (theArgVec[2]);
3888 if (anZ.IsRealValue (Standard_True))
3890 theVec.SetZ (anZ.RealValue());
3898 //=======================================================================
3899 //function : VSetLocation
3900 //purpose : Change location of AIS interactive object
3901 //=======================================================================
3903 static Standard_Integer VSetLocation (Draw_Interpretor& theDI,
3904 Standard_Integer theArgNb,
3905 const char** theArgVec)
3907 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
3908 ViewerTest_AutoUpdater anUpdateTool (aContext, ViewerTest::CurrentView());
3909 if (aContext.IsNull())
3911 Message::SendFail ("Error: no active viewer");
3915 Standard_Boolean toPrintInfo = Standard_True;
3916 Handle(AIS_InteractiveObject) anObj;
3917 TCollection_AsciiString aCmdName (theArgVec[0]);
3918 aCmdName.LowerCase();
3919 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
3921 TCollection_AsciiString anArg = theArgVec[anArgIter];
3923 if (anUpdateTool.parseRedrawMode (anArg))
3927 else if (anObj.IsNull())
3929 const TCollection_AsciiString aName (theArgVec[anArgIter]);
3930 GetMapOfAIS().Find2 (aName, anObj);
3933 Message::SendFail() << "Error: object '" << aName << "' is not displayed";
3937 else if (anArg == "-reset")
3939 toPrintInfo = Standard_False;
3940 aContext->SetLocation (anObj, gp_Trsf());
3942 else if (anArg == "-copyfrom"
3943 || anArg == "-copy")
3945 if (anArgIter + 1 >= theArgNb)
3947 Message::SendFail() << "Syntax error at '" << anArg << "'";
3951 const TCollection_AsciiString aName2 (theArgVec[anArgIter + 1]);
3952 Handle(AIS_InteractiveObject) anObj2;
3953 GetMapOfAIS().Find2 (aName2, anObj2);
3954 if (anObj2.IsNull())
3956 Message::SendFail() << "Error: object '" << aName2 << "' is not displayed";
3961 aContext->SetLocation (anObj, anObj2->LocalTransformation());
3963 else if (anArg == "-rotate"
3964 || anArg == "-prerotate")
3966 toPrintInfo = Standard_False;
3967 if (anArgIter + 7 >= theArgNb)
3969 Message::SendFail() << "Syntax error at '" << anArg << "'";
3974 aTrsf.SetRotation (gp_Ax1 (gp_Pnt (Draw::Atof (theArgVec[anArgIter + 1]),
3975 Draw::Atof (theArgVec[anArgIter + 2]),
3976 Draw::Atof (theArgVec[anArgIter + 3])),
3977 gp_Vec (Draw::Atof (theArgVec[anArgIter + 4]),
3978 Draw::Atof (theArgVec[anArgIter + 5]),
3979 Draw::Atof (theArgVec[anArgIter + 6]))),
3980 Draw::Atof (theArgVec[anArgIter + 7]) * (M_PI / 180.0));
3983 if (anArg == "-prerotate")
3985 aTrsf = anObj->LocalTransformation() * aTrsf;
3989 aTrsf = aTrsf * anObj->LocalTransformation();
3991 aContext->SetLocation (anObj, aTrsf);
3993 else if (anArg == "-translate"
3994 || anArg == "-pretranslate")
3996 toPrintInfo = Standard_False;
3998 Standard_Integer aNbParsed = parseTranslationVec (theArgNb - anArgIter - 1, theArgVec + anArgIter + 1, aLocVec);
3999 anArgIter += aNbParsed;
4002 Message::SendFail() << "Syntax error at '" << anArg << "'";
4007 aTrsf.SetTranslationPart (aLocVec);
4008 if (anArg == "-pretranslate")
4010 aTrsf = anObj->LocalTransformation() * aTrsf;
4014 aTrsf = aTrsf * anObj->LocalTransformation();
4016 aContext->SetLocation (anObj, aTrsf);
4018 else if (anArg == "-scale"
4019 || anArg == "-prescale"
4020 || anArg == "-setscale")
4022 toPrintInfo = Standard_False;
4024 Standard_Real aScale = 1.0;
4025 Standard_Boolean toPrintScale = Standard_True;
4026 Standard_Boolean hasScaleLoc = Standard_False;
4027 if (anArgIter + 4 < theArgNb)
4029 TCollection_AsciiString aScaleArgs[4] =
4031 TCollection_AsciiString (theArgVec[anArgIter + 1]),
4032 TCollection_AsciiString (theArgVec[anArgIter + 2]),
4033 TCollection_AsciiString (theArgVec[anArgIter + 3]),
4034 TCollection_AsciiString (theArgVec[anArgIter + 4])
4036 Standard_Integer aScaleArgIter = 0;
4037 for (; aScaleArgIter < 4; ++aScaleArgIter)
4039 if (!aScaleArgs[aScaleArgIter].IsRealValue (Standard_True))
4044 if (aScaleArgIter == 4)
4046 aScaleLoc.SetCoord (aScaleArgs[0].RealValue(), aScaleArgs[1].RealValue(), aScaleArgs[2].RealValue());
4047 aScale = aScaleArgs[3].RealValue();
4049 toPrintScale = Standard_False;
4050 hasScaleLoc = Standard_True;
4052 else if (aScaleArgIter >= 1)
4054 aScale = aScaleArgs[0].RealValue();
4056 toPrintScale = Standard_False;
4059 else if (anArgIter + 1 < theArgNb)
4061 TCollection_AsciiString aScaleArg (theArgVec[anArgIter + 1]);
4062 if (aScaleArg.IsRealValue (Standard_True))
4064 aScale = aScaleArg.RealValue();
4066 toPrintScale = Standard_False;
4072 if (anArg == "-setscale"
4073 || anArg == "-prescale")
4075 Message::SendFail() << "Syntax error at '" << anArg << "'";
4080 Sprintf (aText, "%g ", anObj->LocalTransformation().ScaleFactor());
4085 if (anArg == "-setscale")
4087 gp_Trsf aTrsf = anObj->LocalTransformation();
4090 aTrsf.SetScale (aScaleLoc, aScale);
4094 aTrsf.SetScaleFactor (aScale);
4096 aContext->SetLocation (anObj, aTrsf);
4103 aTrsf.SetScale (aScaleLoc, aScale);
4107 aTrsf.SetScaleFactor (aScale);
4110 if (anArg == "-prescale")
4112 aTrsf = anObj->LocalTransformation() * aTrsf;
4116 aTrsf = aTrsf * anObj->LocalTransformation();
4118 aContext->SetLocation (anObj, aTrsf);
4121 else if (anArg == "-mirror"
4122 || anArg == "-premirror")
4124 toPrintInfo = Standard_False;
4125 if (anArgIter + 6 >= theArgNb)
4127 Message::SendFail() << "Syntax error at '" << anArg << "'";
4132 aTrsf.SetMirror (gp_Ax2 (gp_Pnt (Draw::Atof(theArgVec[theArgNb - 6]),
4133 Draw::Atof(theArgVec[theArgNb - 5]),
4134 Draw::Atof(theArgVec[theArgNb - 4])),
4135 gp_Vec (Draw::Atof(theArgVec[theArgNb - 3]),
4136 Draw::Atof(theArgVec[theArgNb - 2]),
4137 Draw::Atof(theArgVec[theArgNb - 1]))));
4139 if (anArg == "-premirror")
4141 aTrsf = anObj->LocalTransformation() * aTrsf;
4145 aTrsf = aTrsf * anObj->LocalTransformation();
4147 aContext->SetLocation (anObj, aTrsf);
4149 else if (anArg == "-setrotation"
4150 || anArg == "-rotation")
4152 toPrintInfo = Standard_False;
4153 if (anArgIter + 4 < theArgNb)
4155 TCollection_AsciiString aQuatArgs[4] =
4157 TCollection_AsciiString (theArgVec[anArgIter + 1]),
4158 TCollection_AsciiString (theArgVec[anArgIter + 2]),
4159 TCollection_AsciiString (theArgVec[anArgIter + 3]),
4160 TCollection_AsciiString (theArgVec[anArgIter + 4])
4162 Standard_Integer aQuatArgIter = 0;
4163 for (; aQuatArgIter < 4; ++aQuatArgIter)
4165 if (!aQuatArgs[aQuatArgIter].IsRealValue (Standard_True))
4171 if (aQuatArgIter == 4)
4174 const gp_Quaternion aQuat (aQuatArgs[0].RealValue(),
4175 aQuatArgs[1].RealValue(),
4176 aQuatArgs[2].RealValue(),
4177 aQuatArgs[3].RealValue());
4178 gp_Trsf aTrsf = anObj->LocalTransformation();
4179 aTrsf.SetRotationPart (aQuat);
4180 aContext->SetLocation (anObj, aTrsf);
4183 else if (anArg == "-setrotation")
4185 Message::SendFail() << "Syntax error at '" << anArg << "'";
4191 const gp_Quaternion aQuat = anObj->LocalTransformation().GetRotation();
4192 Sprintf (aText, "%g %g %g %g ", aQuat.X(), aQuat.Y(), aQuat.Z(), aQuat.W());
4195 else if (anArg == "-setlocation"
4196 || anArg == "-location")
4198 toPrintInfo = Standard_False;
4200 Standard_Integer aNbParsed = parseTranslationVec (theArgNb - anArgIter - 1, theArgVec + anArgIter + 1, aLocVec);
4201 anArgIter += aNbParsed;
4204 gp_Trsf aTrsf = anObj->LocalTransformation();
4205 aTrsf.SetTranslationPart (aLocVec);
4206 aContext->SetLocation (anObj, aTrsf);
4208 else if (anArg == "-setlocation")
4210 Message::SendFail() << "Syntax error at '" << anArg << "'";
4215 const gp_XYZ aLoc = anObj->LocalTransformation().TranslationPart();
4216 Sprintf (aText, "%g %g %g ", aLoc.X(), aLoc.Y(), aLoc.Z());
4219 else if (aCmdName == "vsetlocation")
4221 // compatibility with old syntax
4223 Standard_Integer aNbParsed = parseTranslationVec (theArgNb - anArgIter, theArgVec + anArgIter, aLocVec);
4226 Message::SendFail() << "Syntax error at '" << anArg << "'";
4229 anArgIter = anArgIter + aNbParsed - 1;
4232 aTrsf.SetTranslationPart (aLocVec);
4233 aContext->SetLocation (anObj, aTrsf);
4234 toPrintInfo = Standard_False;
4238 Message::SendFail() << "Error: unknown argument '" << anArg << "'";
4245 Message::SendFail ("Syntax error - wrong number of arguments");
4248 else if (!toPrintInfo)
4253 const gp_Trsf aTrsf = anObj->LocalTransformation();
4254 const gp_XYZ aLoc = aTrsf.TranslationPart();
4255 const gp_Quaternion aRot = aTrsf.GetRotation();
4257 Sprintf (aText, "Location: %g %g %g\n"
4258 "Rotation: %g %g %g %g\n"
4260 aLoc.X(), aLoc.Y(), aLoc.Z(),
4261 aRot.X(), aRot.Y(), aRot.Z(), aRot.W(),
4262 aTrsf.ScaleFactor());
4267 //! Find displayed object.
4268 static Handle(AIS_InteractiveObject) findConnectedObject (const TCollection_AsciiString& theName)
4270 Handle(AIS_InteractiveObject) aPrs;
4271 if (!GetMapOfAIS().Find2 (theName, aPrs))
4273 return Handle(AIS_InteractiveObject)();
4275 if (Handle(AIS_ConnectedInteractive) aConnected = Handle(AIS_ConnectedInteractive)::DownCast (aPrs))
4279 else if (Handle(AIS_MultipleConnectedInteractive) aMultiCon = Handle(AIS_MultipleConnectedInteractive)::DownCast (aPrs))
4284 // replace already displayed object with connected one
4285 TheAISContext()->Remove (aPrs, false);
4286 Handle(AIS_ConnectedInteractive) aConnected = new AIS_ConnectedInteractive();
4287 if (aPrs->HasDisplayMode())
4289 aConnected->SetDisplayMode (aPrs->DisplayMode());
4291 aConnected->Connect (aPrs, aPrs->LocalTransformationGeom());
4292 if (!aPrs->TransformPersistence().IsNull())
4294 aConnected->SetTransformPersistence (aPrs->TransformPersistence());
4296 ViewerTest::Display (theName, aConnected, false);
4300 //===============================================================================================
4301 //function : VConnect
4302 //purpose : Creates and displays AIS_ConnectedInteractive object from input object and location
4303 //===============================================================================================
4304 static Standard_Integer VConnect (Draw_Interpretor& /*di*/,
4305 Standard_Integer argc,
4308 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
4309 if (aContext.IsNull())
4311 Message::SendFail ("Error: no active viewer");
4316 Message::SendFail ("Syntax error: expect at least 5 arguments");
4321 Standard_Integer anArgIter = 1;
4322 const TCollection_AsciiString aName (argv[anArgIter++]);
4323 Handle(AIS_MultipleConnectedInteractive) aMultiConObject;
4324 TCollection_AsciiString aColorString (argv[argc-1]);
4325 Quantity_Color aColor;
4326 Standard_Boolean hasColor = Standard_False;
4327 if (aColorString.Search ("color=") != -1)
4329 hasColor = Standard_True;
4330 aColorString.Remove (1, 6);
4331 if (!Quantity_Color::ColorFromName (aColorString.ToCString(), aColor))
4333 Message::SendFail() << "Syntax error at " << aColorString;
4338 const Standard_Integer aNbShapes = hasColor ? (argc - 1) : argc;
4339 for (Standard_Integer i = 5; i < aNbShapes; ++i)
4341 TCollection_AsciiString anOriginObjectName (argv[i]);
4342 Handle(AIS_InteractiveObject) anObject;
4343 if (aName.IsEqual (anOriginObjectName))
4345 Message::SendFail ("Syntax error: equal names for connected objects");
4349 anObject = findConnectedObject (anOriginObjectName);
4350 if (anObject.IsNull())
4352 TopoDS_Shape aTDShape = DBRep::Get (anOriginObjectName);
4353 if (aTDShape.IsNull())
4355 Message::SendFail() << "Syntax error: object " << anOriginObjectName << " doesn't exist";
4358 Handle(AIS_Shape) aShapePrs = new AIS_Shape (aTDShape);
4359 Handle(AIS_ConnectedInteractive) aConnectedOrig = new AIS_ConnectedInteractive();
4360 aConnectedOrig->Connect (aShapePrs);
4361 anObject = aConnectedOrig;
4363 aContext->Load (anObject);
4364 anObject->SetColor (aColor);
4367 if (aMultiConObject.IsNull())
4369 aMultiConObject = new AIS_MultipleConnectedInteractive();
4372 aMultiConObject->Connect (anObject);
4374 if (aMultiConObject.IsNull())
4376 Message::SendFail ("Syntax error: can't connect input objects");
4380 // Create transformation
4382 aTrsf.SetTranslationPart (gp_Vec (Draw::Atof (argv[anArgIter + 0]),
4383 Draw::Atof (argv[anArgIter + 1]),
4384 Draw::Atof (argv[anArgIter + 2])));
4385 TopLoc_Location aLocation (aTrsf);
4388 aMultiConObject->SetLocalTransformation (aTrsf);
4390 ViewerTest::Display (aName, aMultiConObject, true);
4394 //===============================================================================================
4395 //function : VConnectTo
4396 //purpose : Creates and displays AIS_ConnectedInteractive object from input object and location
4397 //===============================================================================================
4398 static Standard_Integer VConnectTo (Draw_Interpretor& /*di*/,
4399 Standard_Integer argc,
4402 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
4403 ViewerTest_AutoUpdater anUpdateTool (aContext, ViewerTest::CurrentView());
4404 if (aContext.IsNull())
4406 Message::SendFail ("Error: no active viewer");
4409 if (argc != 6 && argc != 7)
4411 Message::SendFail ("Syntax error: expect at least 5 arguments");
4415 Standard_Integer anArgIter = 1;
4416 TCollection_AsciiString aName (argv[anArgIter++]);
4417 Handle(AIS_InteractiveObject) anOriginObject;
4419 TCollection_AsciiString anOriginObjectName(argv[5]);
4420 if (aName.IsEqual (anOriginObjectName))
4422 Message::SendFail ("Syntax error: equal names for connected objects");
4425 anOriginObject = findConnectedObject (anOriginObjectName);
4426 if (anOriginObject.IsNull())
4428 TopoDS_Shape aTDShape = DBRep::Get (anOriginObjectName);
4429 if (aTDShape.IsNull())
4431 Message::SendFail() << "Syntax error: object " << anOriginObjectName << " doesn't exist";
4435 Handle(AIS_Shape) aShapePrs = new AIS_Shape (aTDShape);
4436 Handle(AIS_ConnectedInteractive) aConnectedOrig = new AIS_ConnectedInteractive();
4437 aConnectedOrig->Connect (aShapePrs);
4439 anOriginObject = aConnectedOrig;
4440 GetMapOfAIS().Bind (aConnectedOrig, anOriginObjectName);
4443 // Create transformation
4445 aTrsf.SetTranslationPart (gp_Vec (Draw::Atof (argv[anArgIter + 0]),
4446 Draw::Atof (argv[anArgIter + 1]),
4447 Draw::Atof (argv[anArgIter + 2])));
4450 Handle(AIS_ConnectedInteractive) aConnected = new AIS_ConnectedInteractive();
4451 aConnected->Connect (anOriginObject, aTrsf);
4454 TCollection_AsciiString anArg = argv[6];
4456 if (anArg == "-nodisplay")
4458 // bind connected object without displaying it
4459 Handle(AIS_InteractiveObject) anObj;
4460 if (GetMapOfAIS().Find2 (aName, anObj))
4462 TheAISContext()->Remove (anObj, false);
4463 GetMapOfAIS().UnBind2 (aName);
4465 GetMapOfAIS().Bind (aConnected, aName);
4469 if (!anUpdateTool.parseRedrawMode (anArg))
4471 Message::SendFail() << "Syntax error: unknown argument '" << anArg << "'";
4476 ViewerTest::Display (aName, aConnected, false);
4480 //=======================================================================
4481 //function : VDisconnect
4483 //=======================================================================
4484 static Standard_Integer VDisconnect (Draw_Interpretor& di,
4485 Standard_Integer argc,
4488 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
4489 if (aContext.IsNull())
4491 Message::SendFail( "Error: no active viewer");
4497 Message::SendFail() << "Syntax error: wrong number of arguments.\nUsage: " << argv[0] << " name object";
4501 TCollection_AsciiString aName (argv[1]);
4502 TCollection_AsciiString anObject (argv[2]);
4503 Standard_Integer anObjectNumber = Draw::Atoi (argv[2]);
4506 ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
4507 Handle(AIS_MultipleConnectedInteractive) anAssembly;
4508 if (!aMap.IsBound2 (aName) )
4510 Message::SendFail ("Error: no active viewer");
4514 anAssembly = Handle(AIS_MultipleConnectedInteractive)::DownCast (aMap.Find2 (aName));
4515 if (anAssembly.IsNull())
4517 di << "Not an assembly\n";
4521 Handle(AIS_InteractiveObject) anIObj;
4522 if (!aMap.Find2 (anObject, anIObj))
4524 // try to interpret second argument as child number
4525 if (anObjectNumber > 0 && anObjectNumber <= anAssembly->Children().Size())
4527 Standard_Integer aCounter = 1;
4528 for (PrsMgr_ListOfPresentableObjectsIter anIter (anAssembly->Children()); anIter.More(); anIter.Next())
4530 if (aCounter == anObjectNumber)
4532 anIObj = Handle(AIS_InteractiveObject)::DownCast (anIter.Value());
4540 Message::SendFail ("Error: no active viewer");
4545 aContext->Disconnect (anAssembly, anIObj);
4546 aContext->UpdateCurrentViewer();
4550 //=======================================================================
4551 //function : VAddConnected
4553 //=======================================================================
4554 static Standard_Integer VAddConnected (Draw_Interpretor& ,
4555 Standard_Integer argc,
4558 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
4559 if (aContext.IsNull())
4561 Message::SendFail ("Error: no active viewer");
4567 Message::SendFail ("Syntax error: expect 5 arguments");
4571 const TCollection_AsciiString aName (argv[1]);
4572 const Standard_Real aX = Draw::Atof (argv[2]);
4573 const Standard_Real aY = Draw::Atof (argv[3]);
4574 const Standard_Real aZ = Draw::Atof (argv[4]);
4575 const TCollection_AsciiString anObjectName (argv[5]);
4578 ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
4579 Handle(AIS_MultipleConnectedInteractive) anAssembly;
4581 Handle(AIS_InteractiveObject) aPrs;
4582 aMap.Find2 (aName, aPrs);
4583 anAssembly = Handle(AIS_MultipleConnectedInteractive)::DownCast (aPrs);
4584 if (anAssembly.IsNull())
4586 Message::SendFail() << "Syntax error: '" << aName << "' is not an assembly";
4591 Handle(AIS_InteractiveObject) anIObj = findConnectedObject (anObjectName);
4592 if (anIObj.IsNull())
4594 Message::SendFail() << "Syntax error: '" << anObjectName << "' is not displayed";
4599 aTrsf.SetTranslation (gp_Vec (aX, aY, aZ));
4601 anAssembly->Connect (anIObj, aTrsf);
4602 TheAISContext()->Display (anAssembly, Standard_False);
4603 TheAISContext()->RecomputeSelectionOnly (anAssembly);
4604 aContext->UpdateCurrentViewer();
4608 //=======================================================================
4609 //function : VListConnected
4611 //=======================================================================
4612 static Standard_Integer VListConnected (Draw_Interpretor& /*di*/,
4613 Standard_Integer argc,
4616 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
4617 if (aContext.IsNull())
4619 Message::SendFail ("Error: no active viewer");
4625 Message::SendFail() << "Syntax error: wrong number of arguments.\nUsage: " << argv[0] << " name";
4629 TCollection_AsciiString aName (argv[1]);
4632 ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
4633 Handle(AIS_MultipleConnectedInteractive) anAssembly;
4634 if (!aMap.IsBound2 (aName) )
4636 Message::SendFail ("Error: no active viewer");
4640 anAssembly = Handle(AIS_MultipleConnectedInteractive)::DownCast (aMap.Find2 (aName));
4641 if (anAssembly.IsNull())
4643 Message::SendFail ("Syntax error: Not an assembly");
4647 std::cout << "Children of " << aName << ":\n";
4649 Standard_Integer aCounter = 1;
4650 for (PrsMgr_ListOfPresentableObjectsIter anIter (anAssembly->Children()); anIter.More(); anIter.Next())
4652 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anIter.Value());
4653 if (GetMapOfAIS().IsBound1 (anObj))
4655 TCollection_AsciiString aCuurrentName = GetMapOfAIS().Find1 (anObj);
4656 std::cout << aCounter << ") " << aCuurrentName << " (" << anIter.Value()->DynamicType()->Name() << ")";
4659 std::cout << aCounter << ") " << anIter.Value()->DynamicType()->Name();
4661 Handle(AIS_ConnectedInteractive) aConnected = Handle(AIS_ConnectedInteractive)::DownCast (anIter.Value());
4662 if (!aConnected.IsNull() && !aConnected->ConnectedTo().IsNull() && aMap.IsBound1 (aConnected->ConnectedTo()))
4664 std::cout << " connected to " << aMap.Find1 (aConnected->ConnectedTo());
4666 std::cout << std::endl;
4674 //=======================================================================
4677 //=======================================================================
4678 static Standard_Integer VChild (Draw_Interpretor& ,
4679 Standard_Integer theNbArgs,
4680 const char** theArgVec)
4682 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
4683 if (aContext.IsNull())
4685 Message::SendFail ("Error: no active viewer");
4690 Handle(AIS_InteractiveObject) aParent;
4691 bool hasActions = false;
4692 int toInheritTrsf = -1;
4693 ViewerTest_AutoUpdater anUpdateTool (aContext, ViewerTest::CurrentView());
4694 for (Standard_Integer anArgIter = 1; anArgIter < theNbArgs; ++anArgIter)
4696 TCollection_AsciiString anArg (theArgVec[anArgIter]);
4698 if (anUpdateTool.parseRedrawMode (anArg))
4702 else if (anArg == "-add")
4707 else if (anArg == "-remove")
4712 else if (anArg == "-inheritparenttrsf"
4713 || anArg == "-inheritparentloc"
4714 || anArg == "-inheritparentlocation"
4715 || anArg == "-inheritparent"
4716 || anArg == "-noinheritparenttrsf"
4717 || anArg == "-noinheritparentloc"
4718 || anArg == "-noinheritparentlocation"
4719 || anArg == "-noinheritparent"
4720 || anArg == "-ignoreparenttrsf"
4721 || anArg == "-ignoreparentloc"
4722 || anArg == "-ignoreparentlocation"
4723 || anArg == "-ignoreparent")
4726 if (anArgIter + 1 < theNbArgs
4727 && Draw::ParseOnOff(theArgVec[anArgIter + 1], aVal))
4731 if (anArg.StartsWith("-no")
4732 || anArg.StartsWith("-ignore"))
4736 toInheritTrsf = aVal ? 1 : 0;
4740 Handle(AIS_InteractiveObject) aChild;
4741 if (!GetMapOfAIS().Find2 (theArgVec[anArgIter], aChild))
4743 Message::SendFail() << "Syntax error: object '" << theArgVec[anArgIter] << "' is not found";
4747 if (aParent.IsNull())
4751 else if (toAdd == -1)
4753 Message::SendFail ("Syntax error: no action specified");
4761 if(toInheritTrsf == 0)
4762 aParent->AddChildWithCurrentTransformation(aChild);
4764 aParent->AddChild (aChild);
4768 if (toInheritTrsf == 0)
4769 aParent->RemoveChildWithRestoreTransformation(aChild);
4771 aParent->RemoveChild (aChild);
4777 Message::SendFail ("Syntax error: not enough arguments");
4783 //=======================================================================
4784 //function : VParent
4786 //=======================================================================
4787 static Standard_Integer VParent(Draw_Interpretor&,
4788 Standard_Integer theNbArgs,
4789 const char** theArgVec)
4791 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
4792 if (aContext.IsNull())
4794 Message::SendFail ("Error: no active viewer");
4800 Message::SendFail ("Syntax error: wrong number of arguments");
4804 TCollection_AsciiString aName(theArgVec[1]);
4805 Handle(AIS_InteractiveObject) aParent;
4806 if (!GetMapOfAIS().Find2(theArgVec[1], aParent))
4808 Message::SendFail() << "Syntax error: object '" << theArgVec[1] << "' is not found";
4812 ViewerTest_AutoUpdater anUpdateTool(aContext, ViewerTest::CurrentView());
4813 for (Standard_Integer anArgIter = 2; anArgIter < theNbArgs; ++anArgIter)
4815 TCollection_AsciiString anArg(theArgVec[anArgIter]);
4817 if (anArg == "-ignorevisu")
4818 aParent->SetPropagateVisualState(Standard_False);
4823 //===============================================================================================
4824 //function : VSetSelectionMode
4825 //purpose : vselmode
4826 //===============================================================================================
4827 static Standard_Integer VSetSelectionMode (Draw_Interpretor& /*di*/,
4828 Standard_Integer theNbArgs,
4829 const char** theArgv)
4832 Handle(AIS_InteractiveContext) anAISContext = ViewerTest::GetAISContext();
4833 if (anAISContext.IsNull())
4835 Message::SendFail ("Error: no active Viewer");
4839 NCollection_Sequence<TCollection_AsciiString> anObjNames;
4840 Standard_Integer aSelectionMode = -1;
4841 Standard_Boolean toTurnOn = Standard_True;
4842 AIS_SelectionModesConcurrency aSelModeConcurrency = AIS_SelectionModesConcurrency_GlobalOrLocal;
4843 for (Standard_Integer anArgIter = 1; anArgIter < theNbArgs; ++anArgIter)
4845 TCollection_AsciiString anArgCase (theArgv[anArgIter]);
4846 anArgCase.LowerCase();
4847 if (anArgCase == "-set"
4848 || anArgCase == "-replace"
4849 || anArgCase == "-single"
4850 || anArgCase == "-exclusive")
4852 aSelModeConcurrency = AIS_SelectionModesConcurrency_Single;
4854 else if (anArgCase == "-add"
4855 || anArgCase == "-combine"
4856 || anArgCase == "-combination"
4857 || anArgCase == "-multiple")
4859 aSelModeConcurrency = AIS_SelectionModesConcurrency_Multiple;
4861 else if (anArgCase == "-globalorlocal"
4862 || anArgCase == "-localorglobal")
4864 aSelModeConcurrency = AIS_SelectionModesConcurrency_GlobalOrLocal;
4868 anObjNames.Append (theArgv[anArgIter]);
4871 if (anObjNames.Size() < 2
4872 || !Draw::ParseOnOff (anObjNames.Last().ToCString(), toTurnOn))
4874 Message::SendFail ("Syntax error: wrong number of arguments");
4877 anObjNames.Remove (anObjNames.Upper());
4879 const TCollection_AsciiString aSelModeString = anObjNames.Last();
4880 anObjNames.Remove (anObjNames.Upper());
4881 TopAbs_ShapeEnum aShapeType = TopAbs_SHAPE;
4882 if (aSelModeString.IsIntegerValue())
4884 aSelectionMode = aSelModeString.IntegerValue();
4886 else if (TopAbs::ShapeTypeFromString (aSelModeString.ToCString(), aShapeType))
4888 aSelectionMode = AIS_Shape::SelectionMode (aShapeType);
4892 Message::SendFail() << "Syntax error: unknown selection mode '" << aSelModeString << "'";
4897 AIS_ListOfInteractive aTargetIOs;
4898 for (NCollection_Sequence<TCollection_AsciiString>::Iterator anObjIter (anObjNames); anObjIter.More(); anObjIter.Next())
4900 const TCollection_AsciiString& aNameIO = anObjIter.Value();
4901 Handle(AIS_InteractiveObject) anIO;
4902 GetMapOfAIS().Find2 (aNameIO, anIO);
4905 Message::SendFail() << "Syntax error: undefined presentable object " << aNameIO;
4908 aTargetIOs.Append (anIO);
4910 if (aTargetIOs.IsEmpty())
4912 anAISContext->DisplayedObjects (aTargetIOs);
4915 for (AIS_ListIteratorOfListOfInteractive aTargetIt (aTargetIOs); aTargetIt.More(); aTargetIt.Next())
4917 const Handle(AIS_InteractiveObject)& anIO = aTargetIt.Value();
4918 anAISContext->SetSelectionModeActive (anIO, aSelectionMode, toTurnOn, aSelModeConcurrency);
4923 //===============================================================================================
4924 //function : VSelectionNext
4926 //===============================================================================================
4927 static Standard_Integer VSelectionNext(Draw_Interpretor& /*theDI*/,
4928 Standard_Integer /*theArgsNb*/,
4929 const char** /*theArgVec*/)
4932 Handle(AIS_InteractiveContext) anAISContext = ViewerTest::GetAISContext();
4933 Handle(V3d_View) aView = ViewerTest::CurrentView();
4935 if (anAISContext.IsNull())
4937 Message::SendFail ("Error: no active viewer");
4941 anAISContext->HilightNextDetected (aView);
4945 //===============================================================================================
4946 //function : VSelectionPrevious
4948 //===============================================================================================
4949 static Standard_Integer VSelectionPrevious(Draw_Interpretor& /*theDI*/,
4950 Standard_Integer /*theArgsNb*/,
4951 const char** /*theArgVec*/)
4954 Handle(AIS_InteractiveContext) anAISContext = ViewerTest::GetAISContext();
4955 Handle(V3d_View) aView = ViewerTest::CurrentView();
4957 if (anAISContext.IsNull())
4959 Message::SendFail ("Error: no active viewer");
4963 anAISContext->HilightPreviousDetected (aView);
4967 //===========================================================================
4968 //function : VTriangle
4969 //Draw arg : vtriangle Name PointName PointName PointName
4970 //purpose : creates and displays Triangle
4971 //===========================================================================
4972 static Standard_Integer VTriangle (Draw_Interpretor& /*di*/,
4973 Standard_Integer argc,
4976 const Standard_Boolean isTri = TCollection_AsciiString (argv[0]) == "vtriangle";
4977 Handle(Graphic3d_ArrayOfPrimitives) aPrims;
4980 aPrims = new Graphic3d_ArrayOfTriangles (3);
4984 aPrims = new Graphic3d_ArrayOfSegments (2);
4987 if (argc != (2 + aPrims->VertexNumberAllocated()))
4989 Message::SendFail ("Syntax error: wrong number of arguments");
4994 for (Standard_Integer aPntIter = 0; aPntIter < aPrims->VertexNumberAllocated(); ++aPntIter)
4996 const TCollection_AsciiString aName (argv[2 + aPntIter]);
4997 if (Handle(AIS_Point) aPntPrs = Handle(AIS_Point)::DownCast (GetMapOfAIS().IsBound2 (aName) ? GetMapOfAIS().Find2 (aName) : NULL))
4999 aPnts[aPntIter] = aPntPrs->Component()->Pnt();
5003 TopoDS_Shape aShape = DBRep::Get (argv[2 + aPntIter]);
5005 || aShape.ShapeType() != TopAbs_VERTEX)
5007 Message::SendFail() << "Syntax error: argument " << aName << " must be a point";
5010 aPnts[aPntIter] = BRep_Tool::Pnt (TopoDS::Vertex (aShape));
5013 for (Standard_Integer aPnt2Iter = 0; aPnt2Iter < aPntIter; ++aPnt2Iter)
5015 if (aPnts[aPnt2Iter].IsEqual (aPnts[aPntIter], Precision::Confusion()))
5017 Message::SendFail ("Syntax error: points should not be equal");
5022 aPrims->AddVertex (aPnts[aPntIter]);
5025 Handle(AIS_InteractiveObject) aPrs = new MyPArrayObject (aPrims);
5028 aPrs->Attributes()->SetupOwnShadingAspect();
5029 aPrs->Attributes()->ShadingAspect()->Aspect()->SetColor (aPrs->Attributes()->LineAspect()->Aspect()->Color());
5031 ViewerTest::Display (argv[1], aPrs);
5035 //===========================================================================
5037 //purpose : creates and displays a torus or torus segment
5038 //===========================================================================
5039 static Standard_Integer VTorus (Draw_Interpretor& /*di*/,
5040 Standard_Integer theNbArgs,
5041 const char** theArgVec)
5043 if (ViewerTest::GetAISContext().IsNull())
5045 Message::SendFail ("Error: no active viewer");
5049 TCollection_AsciiString aName;
5050 Standard_Integer aNbSlices = 100, aNbStacks = 100;
5051 Standard_Real aMajorRad = -1.0, aMinorRad = -1.0;
5052 Standard_Real aPipeAngle = 360.0, aSegAngle1 = 0.0, aSegAngle2 = 360.0;
5053 Standard_Real anAngles[3] = { -1.0, -1.0, -1.0 };
5054 ViewerTest_AutoUpdater anUpdateTool (ViewerTest::GetAISContext(), ViewerTest::CurrentView());
5055 for (Standard_Integer anArgIter = 1; anArgIter < theNbArgs; ++anArgIter)
5057 TCollection_AsciiString anArg (theArgVec[anArgIter]);
5059 if (anUpdateTool.parseRedrawMode (anArg))
5063 else if (anArgIter + 1 < theNbArgs
5064 && (anArg == "-nbslices"
5065 || anArg == "-slices")
5066 && Draw::ParseInteger (theArgVec[anArgIter + 1], aNbSlices))
5070 else if (anArgIter + 1 < theNbArgs
5071 && (anArg == "-nbstacks"
5072 || anArg == "-stacks")
5073 && Draw::ParseInteger (theArgVec[anArgIter + 1], aNbStacks))
5077 else if (anArgIter + 1 < theNbArgs
5078 && (anArg == "-radius"
5079 || anArg == "-majorradius")
5080 && Draw::ParseReal (theArgVec[anArgIter + 1], aMajorRad))
5084 else if (anArgIter + 1 < theNbArgs
5085 && (anArg == "-piperadius"
5086 || anArg == "-minoradius")
5087 && Draw::ParseReal (theArgVec[anArgIter + 1], aMinorRad))
5091 else if (anArgIter + 1 < theNbArgs
5092 && (anArg == "-pipeangle"
5093 || anArg == "-angle")
5094 && Draw::ParseReal (theArgVec[anArgIter + 1], aPipeAngle))
5098 else if (anArgIter + 1 < theNbArgs
5099 && (anArg == "-segmentanglefrom"
5100 || anArg == "-seganglefrom"
5101 || anArg == "-segmentangle1"
5102 || anArg == "-segangle1")
5103 && Draw::ParseReal (theArgVec[anArgIter + 1], aSegAngle1))
5107 else if (anArgIter + 1 < theNbArgs
5108 && (anArg == "-segmentangleto"
5109 || anArg == "-segangleto"
5110 || anArg == "-segmentangle2"
5111 || anArg == "-segangle2")
5112 && Draw::ParseReal (theArgVec[anArgIter + 1], aSegAngle2))
5116 else if (aName.IsEmpty())
5118 aName = theArgVec[anArgIter];
5120 else if (aMajorRad < 0.0
5121 && Draw::ParseReal (theArgVec[anArgIter], aMajorRad))
5125 else if (aMinorRad < 0.0
5126 && Draw::ParseReal (theArgVec[anArgIter], aMinorRad))
5130 else if (anAngles[0] < 0.0
5131 && Draw::ParseReal (theArgVec[anArgIter], anAngles[0]))
5135 else if (anAngles[1] < 0.0
5136 && Draw::ParseReal (theArgVec[anArgIter], anAngles[1]))
5140 else if (anAngles[2] < 0.0
5141 && Draw::ParseReal (theArgVec[anArgIter], anAngles[2]))
5147 Message::SendFail() << "Syntax error at '" << theArgVec[anArgIter] << "'";
5152 if (anAngles[2] > 0.0)
5154 aSegAngle1 = anAngles[0];
5155 aSegAngle2 = anAngles[1];
5156 aPipeAngle = anAngles[2];
5158 else if (anAngles[1] > 0.0)
5160 aSegAngle1 = anAngles[0];
5161 aSegAngle2 = anAngles[1];
5163 else if (anAngles[0] > 0.0)
5165 aPipeAngle = anAngles[0];
5168 aSegAngle1 = aSegAngle1 * (M_PI / 180.0);
5169 aSegAngle2 = aSegAngle2 * (M_PI / 180.0);
5170 aPipeAngle = aPipeAngle * (M_PI / 180.0);
5172 if (aMajorRad <= 0 || aMinorRad <= 0 || aNbSlices <= 0 || aNbStacks <= 0
5173 || Abs(aSegAngle2 - aSegAngle1) <= Precision::Angular()
5174 || Abs(aPipeAngle) <= Precision::Angular())
5176 Message::SendFail ("Syntax error: wrong parameters");
5180 Handle(Graphic3d_ArrayOfTriangles) aTriangles = Prs3d_ToolTorus::Create (aMajorRad, aMinorRad, aSegAngle1, aSegAngle2, aPipeAngle, aNbSlices, aNbStacks, gp_Trsf());
5181 Handle(AIS_InteractiveObject) anIO = new MyPArrayObject (aTriangles);
5182 ViewerTest::Display (aName, anIO, false);
5186 //===========================================================================
5187 //function : VCylinder
5188 //purpose : creates and displays a cylinder
5189 //===========================================================================
5190 static Standard_Integer VCylinder (Draw_Interpretor& /*di*/,
5191 Standard_Integer theNbArgs,
5192 const char** theArgVec)
5194 if (ViewerTest::GetAISContext().IsNull())
5196 Message::SendFail ("Error: no active viewer");
5200 TCollection_AsciiString aName;
5201 Standard_Integer aNbSlices = 100, aNbStacks = 1;
5202 Standard_Real aBotRad = -1.0, aTopRad = -1.0, aHeight = -1.0;
5203 ViewerTest_AutoUpdater anUpdateTool (ViewerTest::GetAISContext(), ViewerTest::CurrentView());
5204 for (Standard_Integer anArgIter = 1; anArgIter < theNbArgs; ++anArgIter)
5206 TCollection_AsciiString anArg (theArgVec[anArgIter]);
5208 if (anUpdateTool.parseRedrawMode (anArg))
5212 else if (anArgIter + 1 < theNbArgs
5213 && (anArg == "-nbslices"
5214 || anArg == "-slices")
5215 && Draw::ParseInteger (theArgVec[anArgIter + 1], aNbSlices))
5219 else if (anArgIter + 1 < theNbArgs
5220 && (anArg == "-nbstacks"
5221 || anArg == "-stacks")
5222 && Draw::ParseInteger (theArgVec[anArgIter + 1], aNbStacks))
5226 else if (anArgIter + 1 < theNbArgs
5227 && anArg == "-radius"
5228 && Draw::ParseReal (theArgVec[anArgIter + 1], aBotRad))
5233 else if (anArgIter + 1 < theNbArgs
5234 && anArg == "-bottomradius"
5235 && Draw::ParseReal (theArgVec[anArgIter + 1], aBotRad))
5239 else if (anArgIter + 1 < theNbArgs
5240 && anArg == "-topradius"
5241 && Draw::ParseReal (theArgVec[anArgIter + 1], aTopRad))
5245 else if (anArgIter + 1 < theNbArgs
5246 && anArg == "-height"
5247 && Draw::ParseReal (theArgVec[anArgIter + 1], aHeight))
5251 else if (aName.IsEmpty())
5253 aName = theArgVec[anArgIter];
5255 else if (aBotRad < 0.0
5256 && Draw::ParseReal (theArgVec[anArgIter], aBotRad))
5260 else if (aTopRad < 0.0
5261 && Draw::ParseReal (theArgVec[anArgIter], aTopRad))
5265 else if (aHeight < 0.0
5266 && Draw::ParseReal (theArgVec[anArgIter], aHeight))
5272 Message::SendFail() << "Syntax error at '" << theArgVec[anArgIter] << "'";
5277 if (aBotRad < 0 || aTopRad < 0 || aHeight <= 0 || aNbSlices < 3)
5279 Message::SendFail ("Syntax error: wrong parameters");
5283 Handle(Graphic3d_ArrayOfTriangles) aTriangles = Prs3d_ToolCylinder::Create (aBotRad, aTopRad, aHeight, aNbSlices, aNbStacks, gp_Trsf());
5284 Handle(AIS_InteractiveObject) anIO = new MyPArrayObject (aTriangles);
5285 ViewerTest::Display (aName, anIO, false);
5289 //===========================================================================
5290 //function : VSphere
5291 //purpose : creates and displays a sphere
5292 //===========================================================================
5293 static Standard_Integer VSphere (Draw_Interpretor& /*di*/,
5294 Standard_Integer theNbArgs,
5295 const char** theArgVec)
5297 if (ViewerTest::GetAISContext().IsNull())
5299 Message::SendFail ("Error: no active viewer");
5303 TCollection_AsciiString aName;
5304 Standard_Integer aNbSlices = 100, aNbStacks = 100;
5305 Standard_Real aRad = -1.0;
5306 ViewerTest_AutoUpdater anUpdateTool (ViewerTest::GetAISContext(), ViewerTest::CurrentView());
5307 for (Standard_Integer anArgIter = 1; anArgIter < theNbArgs; ++anArgIter)
5309 TCollection_AsciiString anArg (theArgVec[anArgIter]);
5311 if (anUpdateTool.parseRedrawMode (anArg))
5315 else if (anArgIter + 1 < theNbArgs
5316 && (anArg == "-nbslices"
5317 || anArg == "-slices")
5318 && Draw::ParseInteger (theArgVec[anArgIter + 1], aNbSlices))
5322 else if (anArgIter + 1 < theNbArgs
5323 && (anArg == "-nbstacks"
5324 || anArg == "-stacks")
5325 && Draw::ParseInteger (theArgVec[anArgIter + 1], aNbStacks))
5329 else if (anArgIter + 1 < theNbArgs
5330 && anArg == "-radius"
5331 && Draw::ParseReal (theArgVec[anArgIter + 1], aRad))
5335 else if (aName.IsEmpty())
5337 aName = theArgVec[anArgIter];
5340 && Draw::ParseReal (theArgVec[anArgIter], aRad))
5346 Message::SendFail() << "Syntax error at '" << theArgVec[anArgIter] << "'";
5351 if (aRad <= 0 || aNbSlices <= 0 || aNbStacks <= 0)
5353 Message::SendFail ("Syntax error: wrong parameters");
5357 Handle(Graphic3d_ArrayOfTriangles) aTriangles = Prs3d_ToolSphere::Create (aRad, aNbSlices, aNbStacks, gp_Trsf());
5358 Handle(AIS_InteractiveObject) anIO = new MyPArrayObject (aTriangles);
5359 ViewerTest::Display (aName, anIO, false);
5363 //=======================================================================
5364 //function : VObjZLayer
5365 //purpose : Set or get z layer id for presentable object
5366 //=======================================================================
5368 static Standard_Integer VObjZLayer (Draw_Interpretor& di,
5369 Standard_Integer argc,
5372 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
5373 if (aContext.IsNull())
5375 Message::SendFail ("Error: no active viewer");
5380 TCollection_AsciiString aOperation;
5382 aOperation = TCollection_AsciiString (argv [1]);
5384 // check for correct arguments
5385 if (!(argc == 4 && aOperation.IsEqual ("set")) &&
5386 !(argc == 3 && aOperation.IsEqual ("get")))
5388 di << "Usage : " << argv[0] << " set/get object [layerid]\n";
5389 di << " set - set layer id for interactive object, layerid - z layer id\n";
5390 di << " get - get layer id of interactive object\n";
5391 di << " argument layerid should be passed for set operation only\n";
5396 TCollection_AsciiString aName (argv[2]);
5397 Handle(AIS_InteractiveObject) anInterObj;
5398 GetMapOfAIS().Find2 (aName, anInterObj);
5399 if (anInterObj.IsNull())
5401 Message::SendFail() << "Syntax error: object '" << aName << "' is not displayed";
5405 // process operation
5406 if (aOperation.IsEqual ("set"))
5408 Standard_Integer aLayerId = Draw::Atoi (argv [3]);
5409 aContext->SetZLayer (anInterObj, aLayerId);
5411 else if (aOperation.IsEqual ("get"))
5413 di << "Z layer id: " << aContext->GetZLayer (anInterObj);
5419 //=======================================================================
5420 //function : VPolygonOffset
5421 //purpose : Set or get polygon offset parameters
5422 //=======================================================================
5423 static Standard_Integer VPolygonOffset(Draw_Interpretor& /*di*/,
5424 Standard_Integer argc,
5427 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
5428 if (aContext.IsNull())
5430 Message::SendFail ("Error: no active viewer");
5434 if (argc > 2 && argc != 5)
5436 Message::SendFail() << "Syntax error: wrong number of arguments.\n"
5437 "Usage: " << argv[0] << " [object [mode factor units]] - sets/gets polygon offset parameters for an object,"
5438 "without arguments prints the default values";
5443 Handle(AIS_InteractiveObject) anInterObj;
5446 TCollection_AsciiString aName (argv[1]);
5447 if (!GetMapOfAIS().Find2 (aName, anInterObj)
5448 || anInterObj.IsNull())
5450 Message::SendFail() << "Syntax error: object '" << aName << "' is not displayed";
5455 Standard_Integer aMode;
5456 Standard_ShortReal aFactor, aUnits;
5459 aMode = Draw::Atoi(argv[2]);
5460 aFactor = (Standard_ShortReal) Draw::Atof(argv[3]);
5461 aUnits = (Standard_ShortReal) Draw::Atof(argv[4]);
5463 anInterObj->SetPolygonOffsets(aMode, aFactor, aUnits);
5464 aContext->UpdateCurrentViewer();
5469 if (anInterObj->HasPolygonOffsets())
5471 anInterObj->PolygonOffsets(aMode, aFactor, aUnits);
5472 std::cout << "Current polygon offset parameters for " << argv[1] << ":" << std::endl;
5473 std::cout << "\tMode: " << aMode << std::endl;
5474 std::cout << "\tFactor: " << aFactor << std::endl;
5475 std::cout << "\tUnits: " << aUnits << std::endl;
5480 std::cout << "Specific polygon offset parameters are not set for " << argv[1] << std::endl;
5484 std::cout << "Default polygon offset parameters:" << std::endl;
5485 aContext->DefaultDrawer()->ShadingAspect()->Aspect()->PolygonOffsets(aMode, aFactor, aUnits);
5486 std::cout << "\tMode: " << aMode << std::endl;
5487 std::cout << "\tFactor: " << aFactor << std::endl;
5488 std::cout << "\tUnits: " << aUnits << std::endl;
5493 // This class is used for testing markers.
5494 class ViewerTest_MarkersArrayObject : public AIS_InteractiveObject
5499 ViewerTest_MarkersArrayObject (const gp_XYZ& theStartPoint,
5500 const Standard_Integer& thePointsOnSide,
5501 Handle(Graphic3d_AspectMarker3d) theMarkerAspect = NULL)
5503 myStartPoint = theStartPoint;
5504 myPointsOnSide = thePointsOnSide;
5505 myMarkerAspect = theMarkerAspect;
5508 DEFINE_STANDARD_RTTI_INLINE(ViewerTest_MarkersArrayObject,AIS_InteractiveObject);
5512 virtual void Compute (const Handle(PrsMgr_PresentationManager)& thePrsMgr,
5513 const Handle(Prs3d_Presentation)& thePrs,
5514 const Standard_Integer theMode) Standard_OVERRIDE;
5516 virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSel,
5517 const Standard_Integer theMode) Standard_OVERRIDE;
5521 gp_XYZ myStartPoint;
5522 Standard_Integer myPointsOnSide;
5523 Handle(Graphic3d_AspectMarker3d) myMarkerAspect;
5527 void ViewerTest_MarkersArrayObject::Compute (const Handle(PrsMgr_PresentationManager)& ,
5528 const Handle(Prs3d_Presentation)& aPresentation,
5529 const Standard_Integer )
5531 Handle(Graphic3d_ArrayOfPrimitives) anArray = new Graphic3d_ArrayOfPoints ((Standard_Integer )Pow (myPointsOnSide, 3), myPointsOnSide != 1);
5532 if (myPointsOnSide == 1)
5534 anArray->AddVertex (myStartPoint);
5538 for (Standard_Real i = 1; i <= myPointsOnSide; i++)
5540 for (Standard_Real j = 1; j <= myPointsOnSide; j++)
5542 for (Standard_Real k = 1; k <= myPointsOnSide; k++)
5544 anArray->AddVertex (myStartPoint.X() + i, myStartPoint.Y() + j, myStartPoint.Z() + k);
5545 anArray->SetVertexColor (anArray->VertexNumber(),
5548 k / myPointsOnSide);
5554 aPresentation->Clear();
5555 if (!myMarkerAspect.IsNull())
5557 aPresentation->CurrentGroup()->SetGroupPrimitivesAspect (myMarkerAspect);
5559 aPresentation->CurrentGroup()->AddPrimitiveArray (anArray);
5562 void ViewerTest_MarkersArrayObject::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection,
5563 const Standard_Integer /*theMode*/)
5565 Handle(SelectMgr_EntityOwner) anEntityOwner = new SelectMgr_EntityOwner (this);
5567 if (myPointsOnSide == 1)
5569 gp_Pnt aPoint (myStartPoint);
5570 Handle(Select3D_SensitivePoint) aSensetivePoint = new Select3D_SensitivePoint (anEntityOwner, aPoint);
5571 theSelection->Add (aSensetivePoint);
5575 for (Standard_Real i = 1; i <= myPointsOnSide; i++)
5577 for (Standard_Real j = 1; j <= myPointsOnSide; j++)
5579 for (Standard_Real k = 1; k <= myPointsOnSide; k++)
5581 gp_Pnt aPoint (myStartPoint.X() + i, myStartPoint.Y() + j, myStartPoint.Z() + k);
5582 Handle(Select3D_SensitivePoint) aSensetivePoint = new Select3D_SensitivePoint (anEntityOwner, aPoint);
5583 theSelection->Add (aSensetivePoint);
5589 //=======================================================================
5590 //function : VMarkersTest
5591 //purpose : Draws an array of markers for testing purposes.
5592 //=======================================================================
5593 static Standard_Integer VMarkersTest (Draw_Interpretor&,
5594 Standard_Integer theArgNb,
5595 const char** theArgVec)
5597 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
5598 if (aContext.IsNull())
5600 Message::SendFail ("Error: no active viewer");
5606 Message::SendFail ("Syntax error: wrong number of arguments");
5610 Standard_Integer anArgIter = 1;
5612 TCollection_AsciiString aName (theArgVec[anArgIter++]);
5613 TCollection_AsciiString aFileName;
5614 gp_XYZ aPnt (Atof (theArgVec[anArgIter]),
5615 Atof (theArgVec[anArgIter + 1]),
5616 Atof (theArgVec[anArgIter + 2]));
5619 Standard_Integer aPointsOnSide = 10;
5620 Standard_Integer aMarkerType = -1;
5621 Standard_Real aScale = 1.0;
5622 for (; anArgIter < theArgNb; ++anArgIter)
5624 const TCollection_AsciiString anArg (theArgVec[anArgIter]);
5625 if (anArg.Search ("PointsOnSide=") > -1)
5627 aPointsOnSide = anArg.Token ("=", 2).IntegerValue();
5629 else if (anArg.Search ("MarkerType=") > -1)
5631 aMarkerType = anArg.Token ("=", 2).IntegerValue();
5633 else if (anArg.Search ("Scale=") > -1)
5635 aScale = anArg.Token ("=", 2).RealValue();
5637 else if (anArg.Search ("FileName=") > -1)
5639 aFileName = anArg.Token ("=", 2);
5643 Message::SendFail() << "Syntax error: wrong argument '" << anArg << "'";
5648 Handle(Graphic3d_AspectMarker3d) anAspect;
5649 Handle(Image_AlienPixMap) anImage;
5650 Quantity_Color aColor (Quantity_NOC_GREEN1);
5651 if ((aMarkerType == Aspect_TOM_USERDEFINED || aMarkerType < 0)
5652 && !aFileName.IsEmpty())
5654 anImage = new Image_AlienPixMap();
5655 if (!anImage->Load (aFileName))
5657 Message::SendFail() << "Error: could not load image from file '" << aFileName << "'!";
5660 if (anImage->Format() == Image_Format_Gray)
5662 anImage->SetFormat (Image_Format_Alpha);
5664 else if (anImage->Format() == Image_Format_GrayF)
5666 anImage->SetFormat (Image_Format_AlphaF);
5668 anAspect = new Graphic3d_AspectMarker3d (anImage);
5672 anAspect = new Graphic3d_AspectMarker3d (aMarkerType >= 0 ? (Aspect_TypeOfMarker )aMarkerType : Aspect_TOM_POINT, aColor, aScale);
5675 Handle(ViewerTest_MarkersArrayObject) aMarkersArray = new ViewerTest_MarkersArrayObject (aPnt, aPointsOnSide, anAspect);
5676 VDisplayAISObject (aName, aMarkersArray);
5681 //=======================================================================
5682 //function : TextToBrep
5683 //purpose : Tool for conversion text to occt-shapes
5684 //=======================================================================
5685 static int TextToBRep (Draw_Interpretor& /*theDI*/,
5686 Standard_Integer theArgNb,
5687 const char** theArgVec)
5692 Message::SendFail() << "Error: " << theArgVec[0] << " - invalid syntax";
5696 Standard_Integer anArgIt = 1;
5697 Standard_CString aName = theArgVec[anArgIt++];
5698 Standard_CString aText = theArgVec[anArgIt++];
5700 Font_BRepFont aFont;
5701 TCollection_AsciiString aFontName ("Courier");
5702 Standard_Real aTextHeight = 16.0;
5703 Font_FontAspect aFontAspect = Font_FA_Regular;
5704 Standard_Boolean anIsCompositeCurve = Standard_False;
5705 gp_Ax3 aPenAx3 (gp::XOY());
5706 gp_Dir aNormal (0.0, 0.0, 1.0);
5707 gp_Dir aDirection (1.0, 0.0, 0.0);
5710 Graphic3d_HorizontalTextAlignment aHJustification = Graphic3d_HTA_LEFT;
5711 Graphic3d_VerticalTextAlignment aVJustification = Graphic3d_VTA_BOTTOM;
5712 Font_StrictLevel aStrictLevel = Font_StrictLevel_Any;
5713 for (; anArgIt < theArgNb; ++anArgIt)
5715 TCollection_AsciiString aParam (theArgVec[anArgIt]);
5718 if (aParam == "-pos"
5719 || aParam == "-position")
5721 if (anArgIt + 3 >= theArgNb)
5723 Message::SendFail() << "Error: wrong number of values for parameter '" << aParam << "'";
5727 aPenLoc.SetX (Draw::Atof(theArgVec[++anArgIt]));
5728 aPenLoc.SetY (Draw::Atof(theArgVec[++anArgIt]));
5729 aPenLoc.SetZ (Draw::Atof(theArgVec[++anArgIt]));
5731 else if (aParam == "-halign")
5733 if (++anArgIt >= theArgNb)
5735 Message::SendFail() << "Error: wrong number of values for parameter '" << aParam << "'";
5739 TCollection_AsciiString aType (theArgVec[anArgIt]);
5741 if (aType == "left")
5743 aHJustification = Graphic3d_HTA_LEFT;
5745 else if (aType == "center")
5747 aHJustification = Graphic3d_HTA_CENTER;
5749 else if (aType == "right")
5751 aHJustification = Graphic3d_HTA_RIGHT;
5755 Message::SendFail() << "Error: wrong syntax at '" << aParam << "'";
5759 else if (aParam == "-valign")
5761 if (++anArgIt >= theArgNb)
5763 Message::SendFail() << "Error: wrong number of values for parameter '" << aParam << "'";
5767 TCollection_AsciiString aType (theArgVec[anArgIt]);
5771 aVJustification = Graphic3d_VTA_TOP;
5773 else if (aType == "center")
5775 aVJustification = Graphic3d_VTA_CENTER;
5777 else if (aType == "bottom")
5779 aVJustification = Graphic3d_VTA_BOTTOM;
5781 else if (aType == "topfirstline")
5783 aVJustification = Graphic3d_VTA_TOPFIRSTLINE;
5787 Message::SendFail() << "Error: wrong syntax at '" << aParam << "'";
5791 else if (aParam == "-height")
5793 if (++anArgIt >= theArgNb)
5795 Message::SendFail() << "Error: wrong number of values for parameter '" << aParam << "'";
5799 aTextHeight = Draw::Atof(theArgVec[anArgIt]);
5801 else if (aParam == "-aspect")
5803 if (++anArgIt >= theArgNb)
5805 Message::SendFail() << "Error: wrong number of values for parameter '" << aParam << "'";
5809 TCollection_AsciiString anOption (theArgVec[anArgIt]);
5810 anOption.LowerCase();
5811 if (!parseFontStyle (anOption, aFontAspect))
5813 Message::SendFail() << "Error: unknown font aspect '" << anOption << "'";
5817 else if (aParam == "-font")
5819 if (++anArgIt >= theArgNb)
5821 Message::SendFail() << "Error: wrong number of values for parameter '" << aParam << "'";
5825 aFontName = theArgVec[anArgIt];
5827 else if (aParam == "-strict")
5829 anArgIt += parseFontStrictLevel (theArgNb - anArgIt - 1,
5830 theArgVec + anArgIt + 1,
5833 else if (aParam == "-composite")
5835 if (++anArgIt >= theArgNb)
5837 Message::SendFail() << "Error: wrong number of values for parameter '" << aParam << "'";
5841 Draw::ParseOnOff (theArgVec[anArgIt], anIsCompositeCurve);
5843 else if (aParam == "-plane")
5845 if (anArgIt + 6 >= theArgNb)
5847 Message::SendFail() << "Error: wrong number of values for parameter '" << aParam << "'";
5851 Standard_Real aX = Draw::Atof (theArgVec[++anArgIt]);
5852 Standard_Real aY = Draw::Atof (theArgVec[++anArgIt]);
5853 Standard_Real aZ = Draw::Atof (theArgVec[++anArgIt]);
5854 aNormal.SetCoord (aX, aY, aZ);
5856 aX = Draw::Atof (theArgVec[++anArgIt]);
5857 aY = Draw::Atof (theArgVec[++anArgIt]);
5858 aZ = Draw::Atof (theArgVec[++anArgIt]);
5859 aDirection.SetCoord (aX, aY, aZ);
5863 Message::SendFail() << "Warning! Unknown argument '" << aParam << "'";
5867 aFont.SetCompositeCurveMode (anIsCompositeCurve);
5868 if (!aFont.FindAndInit (aFontName.ToCString(), aFontAspect, aTextHeight, aStrictLevel))
5870 Message::SendFail ("Error: unable to load Font");
5874 aPenAx3 = gp_Ax3 (aPenLoc, aNormal, aDirection);
5876 Font_BRepTextBuilder aBuilder;
5877 DBRep::Set (aName, aBuilder.Perform (aFont, aText, aPenAx3, aHJustification, aVJustification));
5881 //=======================================================================
5883 //purpose : Font management
5884 //=======================================================================
5885 struct FontComparator
5887 bool operator() (const Handle(Font_SystemFont)& theFontA,
5888 const Handle(Font_SystemFont)& theFontB)
5890 return theFontA->FontKey().IsLess (theFontB->FontKey());
5894 static int VFont (Draw_Interpretor& theDI,
5895 Standard_Integer theArgNb,
5896 const char** theArgVec)
5898 Handle(Font_FontMgr) aMgr = Font_FontMgr::GetInstance();
5899 bool toPrintList = theArgNb < 2, toPrintNames = false;
5900 Font_StrictLevel aStrictLevel = Font_StrictLevel_Any;
5901 for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter)
5903 const TCollection_AsciiString anArg (theArgVec[anArgIter]);
5904 TCollection_AsciiString anArgCase (anArg);
5905 anArgCase.LowerCase();
5906 if (anArgCase == "-strict")
5908 anArgIter += parseFontStrictLevel (theArgNb - anArgIter - 1,
5909 theArgVec + anArgIter + 1,
5912 else if (anArgCase == "-clear")
5914 aMgr->ClearFontDataBase();
5916 else if (anArgCase == "-init")
5918 aMgr->InitFontDataBase();
5920 else if (anArgCase == "-list")
5924 else if (anArgCase == "-names")
5927 toPrintNames = true;
5929 else if (anArgIter + 1 < theArgNb
5930 && (anArgCase == "-find"
5931 || anArgCase == "-findinfo"
5932 || anArgCase == "-findall"
5933 || anArgCase == "find"))
5935 const TCollection_AsciiString aFontName (theArgVec[++anArgIter]);
5936 Font_FontAspect aFontAspect = Font_FA_Undefined;
5937 if (++anArgIter < theArgNb)
5939 anArgCase = theArgVec[anArgIter];
5940 anArgCase.LowerCase();
5941 if (!parseFontStyle (anArgCase, aFontAspect))
5947 const bool toFindAll = (anArgCase == "-findall");
5948 const bool toPrintInfo = (anArgCase == "-findinfo");
5949 TCollection_AsciiString aResult;
5951 || aFontName.Search ("*") != -1)
5953 const Font_NListOfSystemFont aFonts = aMgr->GetAvailableFonts();
5954 std::vector<Handle(Font_SystemFont)> aFontsSorted;
5955 aFontsSorted.reserve (aFonts.Size());
5956 for (Font_NListOfSystemFont::Iterator aFontIter (aFonts); aFontIter.More(); aFontIter.Next())
5958 aFontsSorted.push_back (aFontIter.Value());
5960 std::stable_sort (aFontsSorted.begin(), aFontsSorted.end(), FontComparator());
5961 for (std::vector<Handle(Font_SystemFont)>::iterator aFontIter = aFontsSorted.begin(); aFontIter != aFontsSorted.end(); ++aFontIter)
5963 const Handle(Font_SystemFont)& aFont = *aFontIter;
5964 const TCollection_AsciiString aCheck = TCollection_AsciiString ("string match -nocase \"") + aFontName + "\" \"" + aFont->FontName() + "\"";
5965 if (theDI.Eval (aCheck.ToCString()) == 0
5966 && *theDI.Result() != '1')
5973 if (!aResult.IsEmpty())
5978 aResult += toPrintInfo ? aFont->ToString() : aFont->FontName();
5985 else if (Handle(Font_SystemFont) aFont = aMgr->FindFont (aFontName, aStrictLevel, aFontAspect))
5987 aResult = toPrintInfo ? aFont->ToString() : aFont->FontName();
5990 if (!aResult.IsEmpty())
5996 Message::SendFail() << "Error: font '" << aFontName << "' is not found";
5999 else if (anArgIter + 1 < theArgNb
6000 && (anArgCase == "-add"
6001 || anArgCase == "add"
6002 || anArgCase == "-register"
6003 || anArgCase == "register"))
6006 Standard_CString aFontPath = theArgVec[anArgIter++];
6007 TCollection_AsciiString aFontName;
6008 Font_FontAspect aFontAspect = Font_FA_Undefined;
6009 Standard_Integer isSingelStroke = -1;
6010 for (; anArgIter < theArgNb; ++anArgIter)
6012 anArgCase = theArgVec[anArgIter];
6013 anArgCase.LowerCase();
6014 if (aFontAspect == Font_FontAspect_UNDEFINED
6015 && parseFontStyle (anArgCase, aFontAspect))
6019 else if (anArgCase == "singlestroke"
6020 || anArgCase == "singleline"
6021 || anArgCase == "oneline")
6025 else if (aFontName.IsEmpty())
6027 aFontName = theArgVec[anArgIter];
6036 Handle(Font_SystemFont) aFont = aMgr->CheckFont (aFontPath);
6039 Message::SendFail() << "Error: font '" << aFontPath << "' is not found!";
6043 if (aFontAspect != Font_FontAspect_UNDEFINED
6044 || !aFontName.IsEmpty())
6046 TCollection_AsciiString aName = aFont->FontName();
6047 if (!aFontName.IsEmpty())
6051 Handle(Font_SystemFont) aFont2 = new Font_SystemFont (aName);
6052 if (aFontAspect != Font_FontAspect_UNDEFINED)
6054 aFont2->SetFontPath (aFontAspect, aFontPath, 0);
6058 for (int anAspectIter = 0; anAspectIter < Font_FontAspect_NB; ++anAspectIter)
6060 aFont2->SetFontPath ((Font_FontAspect )anAspectIter,
6061 aFont->FontPath ((Font_FontAspect )anAspectIter),
6062 aFont->FontFaceId ((Font_FontAspect )anAspectIter));
6067 if (isSingelStroke != -1)
6069 aFont->SetSingleStrokeFont (isSingelStroke == 1);
6072 aMgr->RegisterFont (aFont, Standard_True);
6073 theDI << aFont->ToString();
6075 else if (anArgCase == "-aliases")
6077 TCollection_AsciiString anAliasName;
6078 TColStd_SequenceOfHAsciiString aNames;
6079 if (anArgIter + 1 < theArgNb
6080 && *theArgVec[anArgIter + 1] != '-')
6082 anAliasName = theArgVec[++anArgIter];
6084 if (!anAliasName.IsEmpty())
6086 aMgr->GetFontAliases (aNames, anAliasName);
6090 aMgr->GetAllAliases (aNames);
6092 for (TColStd_SequenceOfHAsciiString::Iterator aNameIter (aNames); aNameIter.More(); aNameIter.Next())
6094 theDI << "{" << aNameIter.Value()->String() << "} ";
6097 else if (anArgIter + 2 < theArgNb
6098 && anArgCase == "-addalias")
6100 TCollection_AsciiString anAliasName(theArgVec[++anArgIter]);
6101 TCollection_AsciiString aFontName (theArgVec[++anArgIter]);
6102 aMgr->AddFontAlias (anAliasName, aFontName);
6104 else if (anArgIter + 2 < theArgNb
6105 && anArgCase == "-removealias")
6107 TCollection_AsciiString anAliasName(theArgVec[++anArgIter]);
6108 TCollection_AsciiString aFontName (theArgVec[++anArgIter]);
6109 aMgr->RemoveFontAlias (anAliasName, aFontName);
6111 else if (anArgIter + 1 < theArgNb
6112 && anArgCase == "-clearalias")
6114 TCollection_AsciiString anAliasName(theArgVec[++anArgIter]);
6115 aMgr->RemoveFontAlias (anAliasName, "");
6117 else if (anArgCase == "-clearaliases")
6119 aMgr->RemoveFontAlias ("", "");
6121 else if (anArgCase == "-verbose"
6122 || anArgCase == "-trace")
6124 bool toEnable = true;
6125 if (anArgIter + 1 < theArgNb
6126 && Draw::ParseOnOff (theArgVec[anArgIter + 1], toEnable))
6130 aMgr->SetTraceAliases (toEnable);
6132 else if (anArgCase == "-unicodefallback"
6133 || anArgCase == "-fallback"
6134 || anArgCase == "-touseunicodesubsetfallback")
6136 bool toEnable = true;
6137 if (anArgIter + 1 < theArgNb
6138 && Draw::ParseOnOff (theArgVec[anArgIter + 1], toEnable))
6142 Font_FontMgr::ToUseUnicodeSubsetFallback() = toEnable;
6146 Message::SendFail() << "Warning! Unknown argument '" << anArg << "'";
6152 // just print the list of available fonts
6153 Standard_Boolean isFirst = Standard_True;
6154 const Font_NListOfSystemFont aFonts = aMgr->GetAvailableFonts();
6155 std::vector<Handle(Font_SystemFont)> aFontsSorted;
6156 aFontsSorted.reserve (aFonts.Size());
6157 for (Font_NListOfSystemFont::Iterator aFontIter (aFonts); aFontIter.More(); aFontIter.Next())
6159 aFontsSorted.push_back (aFontIter.Value());
6161 std::stable_sort (aFontsSorted.begin(), aFontsSorted.end(), FontComparator());
6162 for (std::vector<Handle(Font_SystemFont)>::iterator aFontIter = aFontsSorted.begin(); aFontIter != aFontsSorted.end(); ++aFontIter)
6164 const Handle(Font_SystemFont)& aFont = *aFontIter;
6172 theDI << "\"" << aFont->FontName() << "\"";
6180 theDI << aFont->ToString();
6182 isFirst = Standard_False;
6190 //=======================================================================
6191 //function : VVertexMode
6192 //purpose : Switches vertex display mode for AIS_Shape or displays the current value
6193 //=======================================================================
6195 static int VVertexMode (Draw_Interpretor& theDI,
6196 Standard_Integer theArgNum,
6197 const char** theArgs)
6199 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
6200 if (aContext.IsNull())
6202 Message::SendFail ("Error: no active viewer");
6206 // No arguments --> print the current default vertex draw mode
6209 Prs3d_VertexDrawMode aCurrMode = aContext->DefaultDrawer()->VertexDrawMode();
6210 theDI << "Default vertex draw mode: " << (aCurrMode == Prs3d_VDM_Isolated ? "'isolated'" : "'all'") << "\n";
6214 // -set argument --> change the default vertex draw mode and the mode for all displayed or given object(s)
6215 TCollection_AsciiString aParam (theArgs[1]);
6216 if (aParam == "-set")
6220 Message::SendFail ("Error: '-set' option not followed by the mode and optional object name(s)\n"
6221 "Type 'help vvertexmode' for usage hints");
6225 TCollection_AsciiString aModeStr (theArgs[2]);
6226 Prs3d_VertexDrawMode aNewMode =
6227 aModeStr == "isolated" ? Prs3d_VDM_Isolated :
6228 (aModeStr == "all" ? Prs3d_VDM_All :
6229 Prs3d_VDM_Inherited);
6231 Standard_Boolean aRedrawNeeded = Standard_False;
6232 AIS_ListOfInteractive anObjs;
6234 // No object(s) specified -> use all displayed
6237 theDI << "Setting the default vertex draw mode and updating all displayed objects...\n";
6238 aContext->DisplayedObjects (anObjs);
6239 aContext->DefaultDrawer()->SetVertexDrawMode (aNewMode);
6240 aRedrawNeeded = Standard_True;
6243 Handle(AIS_InteractiveObject) anObject;
6244 for (Standard_Integer aCount = 3; aCount < theArgNum; aCount++)
6246 TCollection_AsciiString aName (theArgs[aCount]);
6247 if (!GetMapOfAIS().Find2 (aName, anObject))
6249 theDI << "Warning: wrong object name ignored - " << theArgs[0] << "\n";
6252 anObjs.Append (anObject);
6255 for (AIS_ListIteratorOfListOfInteractive anIt (anObjs); anIt.More(); anIt.Next())
6257 anObject = anIt.Value();
6258 anObject->Attributes()->SetVertexDrawMode (aNewMode);
6259 aContext->Redisplay (anObject, Standard_False);
6260 aRedrawNeeded = Standard_True;
6264 ViewerTest::CurrentView()->Redraw();
6269 Handle(AIS_InteractiveObject) anObject;
6271 || !GetMapOfAIS().Find2 (aParam, anObject))
6273 Message::SendFail ("Syntax error: invalid number of arguments");
6277 // One argument (object name) --> print the current vertex draw mode for the object
6278 Prs3d_VertexDrawMode aCurrMode = anObject->Attributes()->VertexDrawMode();
6279 theDI << "Object's vertex draw mode: " << (aCurrMode == Prs3d_VDM_Isolated ? "'isolated'" : "'all'") << "\n";
6283 //=======================================================================
6284 //function : VPointCloud
6285 //purpose : Create interactive object for arbitrary set of points.
6286 //=======================================================================
6287 static Standard_Integer VPointCloud (Draw_Interpretor& theDI,
6288 Standard_Integer theArgNum,
6289 const char** theArgs)
6291 Handle(AIS_InteractiveContext) anAISContext = ViewerTest::GetAISContext();
6292 if (anAISContext.IsNull())
6294 Message::SendFail ("Error: no active view!");
6298 // command to execute
6301 CloudForShape, // generate point cloud for shape
6302 CloudSphere, // generate point cloud for generic sphere
6306 // count number of non-optional command arguments
6307 Command aCmd = Unknow;
6308 Standard_Integer aCmdArgs = 0;
6309 for (Standard_Integer anArgIter = 1; anArgIter < theArgNum; ++anArgIter)
6311 Standard_CString anArg = theArgs[anArgIter];
6312 TCollection_AsciiString aFlag (anArg);
6314 if (aFlag.IsRealValue (Standard_True) || aFlag.Search ("-") != 1)
6321 case 2 : aCmd = CloudForShape; break;
6322 case 7 : aCmd = CloudSphere; break;
6324 Message::SendFail ("Syntax error: wrong number of arguments! See usage:");
6325 theDI.PrintHelp (theArgs[0]);
6330 Standard_Boolean toRandColors = Standard_False;
6331 Standard_Boolean hasNormals = Standard_True;
6332 Standard_Boolean isSetArgNorm = Standard_False;
6333 Standard_Boolean hasUV = Standard_False;
6334 for (Standard_Integer anArgIter = 1; anArgIter < theArgNum; ++anArgIter)
6336 Standard_CString anArg = theArgs[anArgIter];
6337 TCollection_AsciiString aFlag (anArg);
6339 if (aFlag == "-randcolors"
6340 || aFlag == "-randcolor")
6342 if (isSetArgNorm && hasNormals)
6344 Message::SendFail ("Syntax error: normals can not be enabled with colors at the same time");
6347 toRandColors = Standard_True;
6348 hasNormals = Standard_False;
6350 else if (aFlag == "-normals"
6351 || aFlag == "-normal")
6355 Message::SendFail ("Syntax error: normals can not be enabled with colors at the same time");
6358 isSetArgNorm = Standard_True;
6359 hasNormals = Standard_True;
6361 else if (aFlag == "-nonormals"
6362 || aFlag == "-nonormal")
6364 isSetArgNorm = Standard_True;
6365 hasNormals = Standard_False;
6367 else if (aFlag == "-uv"
6368 || aFlag == "-texels")
6370 hasUV = Standard_True;
6374 Standard_CString aName = theArgs[1];
6375 Graphic3d_ArrayFlags aFlags = Graphic3d_ArrayFlags_None;
6378 aFlags |= Graphic3d_ArrayFlags_VertexNormal;
6382 aFlags |= Graphic3d_ArrayFlags_VertexColor;
6386 aFlags |= Graphic3d_ArrayFlags_VertexTexel;
6389 // generate arbitrary set of points
6390 Handle(Graphic3d_ArrayOfPoints) anArrayPoints;
6391 if (aCmd == CloudForShape)
6393 Standard_CString aShapeName = theArgs[2];
6394 TopoDS_Shape aShape = DBRep::Get (aShapeName);
6396 if (aShape.IsNull())
6398 Message::SendFail() << "Error: no shape with name '" << aShapeName << "' found";
6402 // calculate number of points
6403 TopLoc_Location aLocation;
6404 Standard_Integer aNbPoints = 0;
6405 for (TopExp_Explorer aFaceIt (aShape, TopAbs_FACE); aFaceIt.More(); aFaceIt.Next())
6407 const TopoDS_Face& aFace = TopoDS::Face (aFaceIt.Current());
6408 Handle(Poly_Triangulation) aTriangulation = BRep_Tool::Triangulation (aFace, aLocation);
6409 if (!aTriangulation.IsNull())
6411 aNbPoints += aTriangulation->NbNodes();
6416 Message::SendFail ("Error: shape should be triangulated");
6420 anArrayPoints = new Graphic3d_ArrayOfPoints (aNbPoints, aFlags);
6421 for (TopExp_Explorer aFaceIt (aShape, TopAbs_FACE); aFaceIt.More(); aFaceIt.Next())
6423 const TopoDS_Face& aFace = TopoDS::Face (aFaceIt.Current());
6424 Handle(Poly_Triangulation) aTriangulation = BRep_Tool::Triangulation (aFace, aLocation);
6425 if (aTriangulation.IsNull())
6430 const gp_Trsf& aTrsf = aLocation.Transformation();
6432 // extract normals from nodes
6433 TColgp_Array1OfDir aNormals (1, hasNormals ? aTriangulation->NbNodes() : 1);
6436 Poly_Connect aPolyConnect (aTriangulation);
6437 StdPrs_ToolTriangulatedShape::Normal (aFace, aPolyConnect, aNormals);
6440 for (Standard_Integer aNodeIter = 1; aNodeIter <= aTriangulation->NbNodes(); ++aNodeIter)
6442 gp_Pnt aPoint = aTriangulation->Node (aNodeIter);
6443 if (!aLocation.IsIdentity())
6445 aPoint.Transform (aTrsf);
6448 aNormals (aNodeIter).Transform (aTrsf);
6452 // add vertex into array of points
6453 const Standard_Integer anIndexOfPoint = anArrayPoints->AddVertex (aPoint);
6456 Quantity_Color aColor (360.0 * Standard_Real(anIndexOfPoint) / Standard_Real(aNbPoints),
6457 1.0, 0.5, Quantity_TOC_HLS);
6458 anArrayPoints->SetVertexColor (anIndexOfPoint, aColor);
6463 anArrayPoints->SetVertexNormal (anIndexOfPoint, aNormals (aNodeIter));
6466 && aTriangulation->HasUVNodes())
6468 anArrayPoints->SetVertexTexel (anIndexOfPoint, aTriangulation->UVNode (aNodeIter));
6473 else if (aCmd == CloudSphere)
6475 Standard_Real aCenterX = Draw::Atof (theArgs[2]);
6476 Standard_Real aCenterY = Draw::Atof (theArgs[3]);
6477 Standard_Real aCenterZ = Draw::Atof (theArgs[4]);
6478 Standard_Real aRadius = Draw::Atof (theArgs[5]);
6479 Standard_Integer aNbPoints = Draw::Atoi (theArgs[6]);
6481 TCollection_AsciiString aDistribution = TCollection_AsciiString(theArgs[7]);
6482 aDistribution.LowerCase();
6483 if ( aDistribution != "surface" && aDistribution != "volume" )
6485 Message::SendFail ("Syntax error: wrong arguments. See usage:");
6486 theDI.PrintHelp (theArgs[0]);
6489 Standard_Boolean isSurface = aDistribution == "surface";
6491 gp_Pnt aCenter(aCenterX, aCenterY, aCenterZ);
6493 anArrayPoints = new Graphic3d_ArrayOfPoints (aNbPoints, aFlags);
6494 for (Standard_Integer aPntIt = 0; aPntIt < aNbPoints; ++aPntIt)
6496 Standard_Real anAlpha = (Standard_Real (rand() % 2000) / 1000.0) * M_PI;
6497 Standard_Real aBeta = (Standard_Real (rand() % 2000) / 1000.0) * M_PI;
6498 Standard_Real aDistance = isSurface ?
6499 aRadius : (Standard_Real (rand() % aNbPoints) / aNbPoints) * aRadius;
6501 gp_Dir aDir (Cos (anAlpha) * Sin (aBeta),
6503 Cos (anAlpha) * Cos (aBeta));
6504 gp_Pnt aPoint = aCenter.Translated (aDir.XYZ() * aDistance);
6506 const Standard_Integer anIndexOfPoint = anArrayPoints->AddVertex (aPoint);
6509 Quantity_Color aColor (360.0 * Standard_Real (anIndexOfPoint) / Standard_Real (aNbPoints),
6510 1.0, 0.5, Quantity_TOC_HLS);
6511 anArrayPoints->SetVertexColor (anIndexOfPoint, aColor);
6516 anArrayPoints->SetVertexNormal (anIndexOfPoint, aDir);
6520 anArrayPoints->SetVertexTexel (anIndexOfPoint, gp_Pnt2d (anAlpha / 2.0 * M_PI,
6521 aBeta / 2.0 * M_PI));
6526 // set array of points in point cloud object
6527 Handle(AIS_PointCloud) aPointCloud = new AIS_PointCloud();
6528 aPointCloud->SetPoints (anArrayPoints);
6529 VDisplayAISObject (aName, aPointCloud);
6533 //=======================================================================
6534 //function : VPriority
6535 //purpose : Prints or sets the display priority for an object
6536 //=======================================================================
6538 static int VPriority (Draw_Interpretor& theDI,
6539 Standard_Integer theArgNum,
6540 const char** theArgs)
6542 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
6543 ViewerTest_AutoUpdater anUpdateTool (aContext, ViewerTest::CurrentView());
6544 if (aContext.IsNull())
6546 Message::SendFail ("Error: no active viewer");
6550 TCollection_AsciiString aLastArg (theArgs[theArgNum - 1]);
6551 Standard_Integer aPriority = -1;
6552 Standard_Integer aNbArgs = theArgNum;
6553 if (aLastArg.IsIntegerValue())
6555 aPriority = aLastArg.IntegerValue();
6557 if (aPriority < 0 || aPriority > 10)
6559 Message::SendFail() << "Syntax error: the specified display priority value '" << aLastArg
6560 << "' is outside the valid range [0..10]";
6566 anUpdateTool.Invalidate();
6571 Message::SendFail ("Syntax error: wrong number of arguments! See usage:");
6572 theDI.PrintHelp (theArgs[0]);
6576 for (Standard_Integer anArgIter = 1; anArgIter < aNbArgs; ++anArgIter)
6578 if (anUpdateTool.parseRedrawMode (theArgs[anArgIter]))
6583 TCollection_AsciiString aName (theArgs[anArgIter]);
6584 Handle(AIS_InteractiveObject) anIObj;
6585 GetMapOfAIS().Find2 (aName, anIObj);
6586 if (anIObj.IsNull())
6588 Message::SendFail() << "Error: the object '" << theArgs[1] << "' is not displayed";
6594 theDI << aContext->DisplayPriority (anIObj) << " ";
6598 aContext->SetDisplayPriority (anIObj, aPriority);
6604 //! Auxiliary class for command vnormals.
6605 class MyShapeWithNormals : public AIS_Shape
6607 DEFINE_STANDARD_RTTI_INLINE(MyShapeWithNormals, AIS_Shape);
6610 Standard_Real NormalLength;
6611 Standard_Integer NbAlongU;
6612 Standard_Integer NbAlongV;
6613 Standard_Boolean ToUseMesh;
6614 Standard_Boolean ToOrient;
6618 //! Main constructor.
6619 MyShapeWithNormals (const TopoDS_Shape& theShape)
6620 : AIS_Shape (theShape),
6624 ToUseMesh (Standard_False),
6625 ToOrient (Standard_False) {}
6629 //! Compute presentation.
6630 virtual void Compute (const Handle(PrsMgr_PresentationManager)& thePrsMgr,
6631 const Handle(Prs3d_Presentation)& thePrs,
6632 const Standard_Integer theMode) Standard_OVERRIDE
6634 AIS_Shape::Compute (thePrsMgr, thePrs, theMode);
6636 NCollection_DataMap<TopoDS_Face, NCollection_Vector<std::pair<gp_Pnt, gp_Pnt> > > aNormalMap;
6639 DBRep_DrawableShape::addMeshNormals (aNormalMap, myshape, NormalLength);
6643 DBRep_DrawableShape::addSurfaceNormals (aNormalMap, myshape, NormalLength, NbAlongU, NbAlongV);
6646 Handle(Graphic3d_Group) aPrsGroup = thePrs->NewGroup();
6647 aPrsGroup->SetGroupPrimitivesAspect (myDrawer->ArrowAspect()->Aspect());
6649 const Standard_Real aArrowAngle = myDrawer->ArrowAspect()->Angle();
6650 const Standard_Real aArrowLength = myDrawer->ArrowAspect()->Length();
6651 for (NCollection_DataMap<TopoDS_Face, NCollection_Vector<std::pair<gp_Pnt, gp_Pnt> > >::Iterator aFaceIt (aNormalMap);
6652 aFaceIt.More(); aFaceIt.Next())
6654 const Standard_Boolean toReverse = ToOrient && aFaceIt.Key().Orientation() == TopAbs_REVERSED;
6655 Handle(Graphic3d_ArrayOfSegments) aSegments = new Graphic3d_ArrayOfSegments (2 * aFaceIt.Value().Size());
6656 for (NCollection_Vector<std::pair<gp_Pnt, gp_Pnt> >::Iterator aPntIt (aFaceIt.Value()); aPntIt.More(); aPntIt.Next())
6658 std::pair<gp_Pnt, gp_Pnt> aPair = aPntIt.Value();
6661 const gp_Vec aDir = aPair.first.XYZ() - aPair.second.XYZ();
6662 aPair.second = aPair.first.XYZ() + aDir.XYZ();
6665 aSegments->AddVertex (aPair.first);
6666 aSegments->AddVertex (aPair.second);
6667 Prs3d_Arrow::Draw (aPrsGroup, aPair.second, gp_Vec(aPair.first, aPair.second), aArrowAngle, aArrowLength);
6670 aPrsGroup->AddPrimitiveArray (aSegments);
6676 //=======================================================================
6677 //function : VNormals
6678 //purpose : Displays/Hides normals calculated on shape geometry or retrieved from triangulation
6679 //=======================================================================
6680 static int VNormals (Draw_Interpretor& theDI,
6681 Standard_Integer theArgNum,
6682 const char** theArgs)
6684 Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
6685 if (aContext.IsNull())
6687 Message::SendFail ("Error: no active viewer");
6690 else if (theArgNum < 2)
6692 Message::SendFail ("Syntax error: wrong number of arguments. See usage:");
6693 theDI.PrintHelp (theArgs[0]);
6697 Standard_Integer anArgIter = 1;
6698 Standard_CString aShapeName = theArgs[anArgIter++];
6699 TopoDS_Shape aShape = DBRep::Get (aShapeName);
6700 Standard_Boolean isOn = Standard_True;
6701 if (aShape.IsNull())
6703 Message::SendFail() << "Error: shape with name '" << aShapeName << "' is not found";
6707 ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
6708 Handle(MyShapeWithNormals) aShapePrs;
6709 if (aMap.IsBound2 (aShapeName))
6711 aShapePrs = Handle(MyShapeWithNormals)::DownCast (aMap.Find2 (aShapeName));
6714 Standard_Boolean isUseMesh = Standard_False;
6715 Standard_Real aLength = 10.0;
6716 Standard_Integer aNbAlongU = 1, aNbAlongV = 1;
6717 Standard_Boolean isOriented = Standard_False;
6718 for (; anArgIter < theArgNum; ++anArgIter)
6720 TCollection_AsciiString aParam (theArgs[anArgIter]);
6723 && Draw::ParseOnOff (aParam.ToCString(), isOn))
6727 else if (aParam == "-usemesh"
6728 || aParam == "-mesh")
6730 isUseMesh = Standard_True;
6732 else if (aParam == "-length"
6733 || aParam == "-len")
6736 aLength = anArgIter < theArgNum ? Draw::Atof (theArgs[anArgIter]) : 0.0;
6737 if (Abs (aLength) <= gp::Resolution())
6739 Message::SendFail ("Syntax error: length should not be zero");
6743 else if (aParam == "-orient"
6744 || aParam == "-oriented")
6746 isOriented = Standard_True;
6747 if (anArgIter + 1 < theArgNum
6748 && Draw::ParseOnOff (theArgs[anArgIter + 1], isOriented))
6753 else if (aParam == "-nbalongu"
6754 || aParam == "-nbu")
6757 aNbAlongU = anArgIter < theArgNum ? Draw::Atoi (theArgs[anArgIter]) : 0;
6760 Message::SendFail ("Syntax error: NbAlongU should be >=1");
6764 else if (aParam == "-nbalongv"
6765 || aParam == "-nbv")
6768 aNbAlongV = anArgIter < theArgNum ? Draw::Atoi (theArgs[anArgIter]) : 0;
6771 Message::SendFail ("Syntax error: NbAlongV should be >=1");
6775 else if (aParam == "-nbalong"
6776 || aParam == "-nbuv")
6779 aNbAlongU = anArgIter < theArgNum ? Draw::Atoi (theArgs[anArgIter]) : 0;
6780 aNbAlongV = aNbAlongU;
6783 Message::SendFail ("Syntax error: NbAlong should be >=1");
6789 Message::SendFail() << "Syntax error: unknown argument '" << aParam << "'";
6796 if (aShapePrs.IsNull())
6798 aShapePrs = new MyShapeWithNormals (aShape);
6800 aShapePrs->ToUseMesh = isUseMesh;
6801 aShapePrs->ToOrient = isOriented;
6802 aShapePrs->NormalLength = aLength;
6803 aShapePrs->NbAlongU = aNbAlongU;
6804 aShapePrs->NbAlongV = aNbAlongV;
6805 VDisplayAISObject (aShapeName, aShapePrs);
6807 else if (!aShapePrs.IsNull())
6809 VDisplayAISObject (aShapeName, new AIS_Shape (aShape));
6815 //=======================================================================
6816 //function : ObjectsCommands
6818 //=======================================================================
6820 void ViewerTest::ObjectCommands(Draw_Interpretor& theCommands)
6822 const char *group ="AISObjects";
6824 theCommands.Add ("vtrihedron",
6825 "vtrihedron : vtrihedron name"
6826 "\n\t\t: [-dispMode {wireframe|shading} ]"
6827 "\n\t\t: [-origin x y z ]"
6828 "\n\t\t: [-zaxis u v w -xaxis u v w ]"
6829 "\n\t\t: [-drawAxes {X|Y|Z|XY|YZ|XZ|XYZ}]"
6830 "\n\t\t: [-hideLabels {on|off}]"
6831 "\n\t\t: [-hideArrows {on|off}]"
6832 "\n\t\t: [-label {XAxis|YAxis|ZAxis} value]"
6833 "\n\t\t: [-attribute {XAxisLength|YAxisLength|ZAxisLength"
6834 "\n\t\t: |TubeRadiusPercent|ConeRadiusPercent"
6835 "\n\t\t: |ConeLengthPercent|OriginRadiusPercent"
6836 "\n\t\t: |ShadingNumberOfFacettes} value]"
6837 "\n\t\t: [-color {Origin|XAxis|YAxis|ZAxis|XOYAxis|YOZAxis"
6838 "\n\t\t: |XOZAxis|Whole} {r g b | colorName}]"
6839 "\n\t\t: [-textColor [XAxis|YAxis|ZAxis] {r g b | colorName}]"
6840 "\n\t\t: [-arrowColor [XAxis|YAxis|ZAxis] {r g b | colorName}]"
6841 "\n\t\t: [-priority {Origin|XAxis|YAxis|ZAxis|XArrow"
6842 "\n\t\t: |YArrow|ZArrow|XOYAxis|YOZAxis"
6843 "\n\t\t: |XOZAxis|Whole} value]"
6845 "\n\t\t: Creates a new *AIS_Trihedron* object or changes parameters of "
6846 "\n\t\t: existing trihedron. If no argument is set,"
6847 "\n\t\t: the default trihedron (0XYZ) is created."
6848 "\n\t\t: -dispMode mode of visualization: wf - wireframe,"
6849 "\n\t\t: sh - shading."
6850 "\n\t\t: Default value is wireframe."
6851 "\n\t\t: -origin allows to set trihedron location."
6852 "\n\t\t: -zaxis/-xaxis allows to set trihedron X and Z"
6853 "\n\t\t: directions. The directions should"
6854 "\n\t\t: be orthogonal. Y direction is calculated."
6855 "\n\t\t: -drawAxes allows to set what axes are drawn in the"
6856 "\n\t\t: trihedron, default state is XYZ"
6857 "\n\t\t: -hideLabels allows to show/hide trihedron labels"
6858 "\n\t\t: -hideArrows allows to show/hide trihedron arrows"
6859 "\n\t\t: -label allows to change default X/Y/Z titles of axes"
6860 "\n\t\t: -attribute sets parameters of trihedron"
6861 "\n\t\t: -color sets color properties of parts of trihedron"
6862 "\n\t\t: -textColor sets color properties of trihedron labels"
6863 "\n\t\t: -arrowColor sets color properties of trihedron arrows"
6864 "\n\t\t: -priority allows to change default selection priority"
6865 "\n\t\t: of trihedron components",
6866 __FILE__,VTrihedron,group);
6868 theCommands.Add("vtri2d",
6870 "\n\t\t: Creates a plane with a 2D trihedron from an interactively selected face.",
6871 __FILE__,VTrihedron2D ,group);
6873 theCommands.Add("vplanetri",
6875 "\n\t\t: Create a plane from a trihedron selection. If no arguments are set, the default",
6876 __FILE__,VPlaneTrihedron ,group);
6878 theCommands.Add("vsize",
6879 "vsize : vsize [name(Default=Current)] [size(Default=100)] "
6880 "\n\t\t: Changes the size of a named or selected trihedron."
6881 "\n\t\t: If the name is not defined: it affects the selected trihedrons otherwise nothing is done."
6882 "\n\t\t: If the value is not defined: it is set to 100 by default.",
6883 __FILE__,VSize,group);
6885 theCommands.Add("vaxis",
6886 "vaxis name [Xa] [Ya] [Za] [Xb] [Yb] [Zb]"
6887 "\n\t\t: Creates an axis. If the values are not defined, an axis is created by interactive selection of two vertices or one edge",
6888 __FILE__,VAxisBuilder,group);
6890 theCommands.Add("vaxispara",
6892 "\n\t\t: Creates an axis by interactive selection of an edge and a vertex.",
6893 __FILE__,VAxisBuilder,group);
6895 theCommands.Add("vaxisortho",
6897 "\n\t\t: Creates an axis by interactive selection of an edge and a vertex. The axis will be orthogonal to the selected edge.",
6898 __FILE__,VAxisBuilder,group);
6900 theCommands.Add("vpoint",
6901 "vpoint name [X Y [Z]] [-2d] [-nosel]"
6902 "\n\t\t: Creates a point from coordinates."
6903 "\n\t\t: If the values are not defined, a point is created from selected vertex or edge (center)."
6904 "\n\t\t: -2d defines on-screen 2D point from top-left window corner"
6905 "\n\t\t: -nosel creates non-selectable presentation",
6906 __FILE__,VPointBuilder,group);
6908 theCommands.Add("vplane",
6909 "vplane PlaneName [AxisName/PlaneName/PointName] [PointName/PointName/PointName] [Nothing/Nothing/PointName] [TypeOfSensitivity {0|1}]"
6910 "\n\t\t: Creates a plane from named or interactively selected entities."
6911 "\n\t\t: TypeOfSensitivity:"
6912 "\n\t\t: 0 - Interior"
6913 "\n\t\t: 1 - Boundary",
6914 __FILE__,VPlaneBuilder,group);
6916 theCommands.Add ("vchangeplane", "vchangeplane usage: \n"
6917 " vchangeplane <plane_name>"
6918 " [x=center_x y=center_y z=center_z]"
6919 " [dx=dir_x dy=dir_y dz=dir_z]"
6920 " [sx=size_x sy=size_y]"
6923 " - changes parameters of the plane:\n"
6924 " - x y z - center\n"
6925 " - dx dy dz - normal\n"
6926 " - sx sy - plane sizes\n"
6927 " - noupdate - do not update/redisplay the plane in context\n"
6928 " Please enter coordinates in format \"param=value\" in arbitrary order.",
6929 __FILE__, VChangePlane, group);
6931 theCommands.Add("vplanepara",
6932 "vplanepara PlaneName "
6933 "\n\t\t: Creates a plane from interactively selected vertex and face.",
6934 __FILE__,VPlaneBuilder,group);
6936 theCommands.Add("vplaneortho",
6937 "vplaneortho PlaneName "
6938 "\n\t\t: Creates a plane from interactive selected face and coplanar edge. ",
6939 __FILE__,VPlaneBuilder,group);
6941 theCommands.Add("vline",
6942 "vline LineName [Xa/PointName] [Ya/PointName] [Za] [Xb] [Yb] [Zb] "
6943 "\n\t\t: Creates a line from coordinates, named or interactively selected vertices. ",
6944 __FILE__,VLineBuilder,group);
6946 theCommands.Add("vcircle",
6947 "vcircle CircleName [PointName PointName PointName IsFilled]\n\t\t\t\t\t[PlaneName PointName Radius IsFilled]"
6948 "\n\t\t: Creates a circle from named or interactively selected entities."
6949 "\n\t\t: Parameter IsFilled is defined as 0 or 1.",
6950 __FILE__,VCircleBuilder,group);
6952 theCommands.Add ("vdrawtext",
6953 "vdrawtext name text"
6954 "\n\t\t: [-pos X=0 Y=0 Z=0]"
6955 "\n\t\t: [-color {R G B|name}=yellow]"
6956 "\n\t\t: [-halign {left|center|right}=left]"
6957 "\n\t\t: [-valign {top|center|bottom|topfirstline}=bottom}]"
6958 "\n\t\t: [-angle angle=0]"
6959 "\n\t\t: [-zoom {0|1}=0]"
6960 "\n\t\t: [-height height=16]"
6961 "\n\t\t: [-wrapping width=40]"
6962 "\n\t\t: [-aspect {regular|bold|italic|boldItalic}=regular]"
6963 "\n\t\t: [-font font=Times]"
6965 "\n\t\t: [-perspos {X Y Z}=0 0 0], where"
6966 "\n\t\t X and Y define the coordinate origin in 2d space relative to the view window"
6967 "\n\t\t Example: X=0 Y=0 is center, X=1 Y=1 is upper right corner etc..."
6968 "\n\t\t Z coordinate defines the gap from border of view window (except center position)."
6969 "\n\t\t: [-disptype {blend|decal|shadow|subtitle|dimension|normal}=normal}"
6970 "\n\t\t: [-subcolor {R G B|name}=white]"
6971 "\n\t\t: [-noupdate]"
6972 "\n\t\t: [-plane NormX NormY NormZ DirX DirY DirZ]"
6973 "\n\t\t: [-flipping]"
6974 "\n\t\t: [-ownanchor {0|1}=1]"
6975 "\n\t\t: Display text label at specified position.",
6976 __FILE__, VDrawText, group);
6978 theCommands.Add("vdrawsphere",
6979 "vdrawsphere: vdrawsphere shapeName Fineness [X=0.0 Y=0.0 Z=0.0] [Radius=100.0] [ToShowEdges=0] [ToPrintInfo=1]\n",
6980 __FILE__,VDrawSphere,group);
6982 theCommands.Add ("vlocation",
6984 "\n\t\t: [-reset] [-copyFrom otherName]"
6985 "\n\t\t: [-translate X Y [Z]] [-rotate x y z dx dy dz angle] [-scale [X Y Z] scale]"
6986 "\n\t\t: [-pretranslate X Y [Z]] [-prerotate x y z dx dy dz angle] [-prescale [X Y Z] scale]"
6987 "\n\t\t: [-mirror x y z dx dy dz] [-premirror x y z dx dy dz]"
6988 "\n\t\t: [-setLocation X Y [Z]] [-setRotation QX QY QZ QW] [-setScale [X Y Z] scale]"
6989 "\n\t\t: Object local transformation management:"
6990 "\n\t\t: -reset resets transformation to identity"
6991 "\n\t\t: -translate applies translation vector"
6992 "\n\t\t: -rotate applies rotation around axis"
6993 "\n\t\t: -scale applies scale factor with optional anchor"
6994 "\n\t\t: -mirror applies mirror transformation"
6995 "\n\t\t: -pretranslate pre-multiplies translation vector"
6996 "\n\t\t: -prerotate pre-multiplies rotation around axis"
6997 "\n\t\t: -prescale pre-multiplies scale transformation"
6998 "\n\t\t: -premirror pre-multiplies mirror transformation"
6999 "\n\t\t: -setLocation overrides translation part"
7000 "\n\t\t: -setRotation overrides rotation part with specified quaternion"
7001 "\n\t\t: -setScale overrides scale factor",
7002 __FILE__, VSetLocation, group);
7003 theCommands.Add ("vsetlocation",
7004 "alias for vlocation",
7005 __FILE__, VSetLocation, group);
7006 theCommands.Add ("vchild",
7007 "vchild parent [-add] [-remove] [-ignoreParentTrsf {0|1}] child1 [child2] [...]"
7008 "\n\t\t: Command for testing low-level presentation connections."
7009 "\n\t\t: vconnect command should be used instead.",
7010 __FILE__, VChild, group);
7011 theCommands.Add("vparent",
7012 "vparent parent [-ignoreVisu]"
7013 "\n\t\t: Command for testing object properties as parent in the hierarchy."
7014 "\n\t\t: Arguments:"
7015 "\n\t\t: -ignoreVisu do not propagate the visual state (display/erase/color) to children objects",
7016 __FILE__, VParent, group);
7017 theCommands.Add ("vcomputehlr",
7018 "vcomputehlr shapeInput hlrResult [-algoType {algo|polyAlgo}=polyAlgo]"
7019 "\n\t\t: [eyeX eyeY eyeZ dirX dirY dirZ upX upY upZ]"
7020 "\n\t\t: [-showTangentEdges {on|off}=off] [-nbIsolines N=0] [-showHiddenEdges {on|off}=off]"
7021 "\n\t\t: Arguments:"
7022 "\n\t\t: shapeInput - name of the initial shape"
7023 "\n\t\t: hlrResult - result HLR object from initial shape"
7024 "\n\t\t: eye, dir are eye position and look direction"
7025 "\n\t\t: up is the look up direction vector"
7026 "\n\t\t: -algoType HLR algorithm to use"
7027 "\n\t\t: -showTangentEdges include tangent edges"
7028 "\n\t\t: -nbIsolines include isolines"
7029 "\n\t\t: -showHiddenEdges include hidden edges"
7030 "\n\t\t: Use vtop to see projected HLR shape.",
7031 __FILE__, VComputeHLR, group);
7033 theCommands.Add("vdrawparray",
7034 "vdrawparray name TypeOfArray={points|segments|polylines|triangles"
7035 "\n\t\t: |trianglefans|trianglestrips|quads|quadstrips|polygons}"
7036 "\n\t\t: [-deinterleaved|-mutable]"
7037 "\n\t\t: [vertex={'v' x y z [normal={'n' nx ny nz}] [color={'c' r g b}] [texel={'t' tx ty}]]"
7038 "\n\t\t: [bound= {'b' nbVertices [bound_color={'c' r g b}]]"
7039 "\n\t\t: [edge= {'e' vertexId]"
7040 "\n\t\t: [-shape shapeName] [-patch]"
7041 "\n\t\t: Commands create an Interactive Object for specified Primitive Array definition (Graphic3d_ArrayOfPrimitives)"
7042 "\n\t\t: with the main purpose is covering various combinations by tests",
7043 __FILE__,VDrawPArray,group);
7045 theCommands.Add("vconnect",
7046 "vconnect name Xo Yo Zo object1 object2 ... [color=NAME]"
7047 "\n\t\t: Creates and displays AIS_ConnectedInteractive object from input object and location.",
7048 __FILE__, VConnect, group);
7050 theCommands.Add("vconnectto",
7051 "vconnectto : instance_name Xo Yo Zo object [-nodisplay|-noupdate|-update]"
7052 " Makes an instance 'instance_name' of 'object' with position (Xo Yo Zo)."
7053 "\n\t\t: -nodisplay - only creates interactive object, but not displays it",
7054 __FILE__, VConnectTo,group);
7056 theCommands.Add("vdisconnect",
7057 "vdisconnect assembly_name (object_name | object_number | 'all')"
7058 " Disconnects all objects from assembly or disconnects object by name or number (use vlistconnected to enumerate assembly children).",
7059 __FILE__,VDisconnect,group);
7061 theCommands.Add("vaddconnected",
7062 "vaddconnected assembly_name object_name"
7063 "Adds object to assembly.",
7064 __FILE__,VAddConnected,group);
7066 theCommands.Add("vlistconnected",
7067 "vlistconnected assembly_name"
7068 "Lists objects in assembly.",
7069 __FILE__,VListConnected,group);
7072 theCommands.Add("vselmode",
7073 "vselmode [object] selectionMode {on|off}"
7074 "\n\t\t: [{-add|-set|-globalOrLocal}=-globalOrLocal]"
7075 "\n\t\t: Switches selection mode for the specified object or for all objects in context."
7076 "\n\t\t: Selection mode is either an integer number specific to Interactive Object,"
7077 "\n\t\t: or sub-shape type in case of AIS_Shape:"
7078 "\n\t\t: Shape, Vertex, Edge, Wire, Face, Shell, Solid, CompSolid, Compound"
7079 "\n\t\t: The integer mode 0 (Shape in case of AIS_Shape) is reserved for selecting object as whole."
7080 "\n\t\t: Additional options:"
7081 "\n\t\t: -add already activated selection modes will be left activated"
7082 "\n\t\t: -set already activated selection modes will be deactivated"
7083 "\n\t\t: -globalOrLocal (default) if new mode is Global selection mode,"
7084 "\n\t\t: then active local selection modes will be deactivated"
7085 "\n\t\t: and the samthen active local selection modes will be deactivated",
7086 __FILE__, VSetSelectionMode, group);
7088 theCommands.Add("vselnext",
7089 "vselnext : hilight next detected",
7090 __FILE__, VSelectionNext, group);
7092 theCommands.Add("vselprev",
7093 "vselnext : hilight previous detected",
7094 __FILE__, VSelectionPrevious, group);
7096 theCommands.Add("vtriangle",
7097 "vtriangle Name PointName PointName PointName"
7098 "\n\t\t: Creates and displays a filled triangle from named points.",
7099 __FILE__, VTriangle,group);
7101 theCommands.Add("vsegment",
7102 "vsegment Name PointName PointName"
7103 "\n\t\t: Creates and displays a segment from named points.",
7104 __FILE__, VTriangle,group);
7106 theCommands.Add ("vtorus",
7107 "vtorus name [R1 R2 [Angle1=0 Angle2=360] [Angle=360]]"
7108 "\n\t\t: [-radius R1] [-pipeRadius R2]"
7109 "\n\t\t: [-pipeAngle Angle=360] [-segmentAngle1 Angle1=0 -segmentAngle2 Angle2=360]"
7110 "\n\t\t: [-nbSlices Number=100] [-nbStacks Number=100] [-noupdate]"
7111 "\n\t\t: Creates and displays a torus or torus segment."
7112 "\n\t\t: Parameters of the torus :"
7113 "\n\t\t: - R1 distance from the center of the pipe to the center of the torus"
7114 "\n\t\t: - R2 radius of the pipe"
7115 "\n\t\t: - Angle1 first angle to create a torus ring segment"
7116 "\n\t\t: - Angle2 second angle to create a torus ring segment"
7117 "\n\t\t: - Angle angle to create a torus pipe segment",
7118 __FILE__, VTorus, group);
7120 theCommands.Add ("vcylinder",
7121 "vcylinder name [R1 R2 Height] [-height H] [-radius R] [-bottomRadius R1 -topRadius R2]"
7122 "\n\t\t: [-nbSlices Number=100] [-noupdate]"
7123 "\n\t\t: Creates and displays a cylinder."
7124 "\n\t\t: Parameters of the cylinder :"
7125 "\n\t\t: - R1 cylinder bottom radius"
7126 "\n\t\t: - R2 cylinder top radius"
7127 "\n\t\t: - Height cylinder height",
7128 __FILE__, VCylinder, group);
7130 theCommands.Add ("vsphere",
7131 "vsphere name [-radius] R"
7132 "\n\t\t: [-nbSlices Number=100] [-nbStacks Number=100] [-noupdate]"
7133 "\n\t\t: Creates and displays a sphere.",
7134 __FILE__, VSphere, group);
7136 theCommands.Add("vobjzlayer",
7137 "vobjzlayer : set/get object [layerid] - set or get z layer id for the interactive object",
7138 __FILE__, VObjZLayer, group);
7140 theCommands.Add("vpolygonoffset",
7141 "vpolygonoffset : [object [mode factor units]] - sets/gets polygon offset parameters for an object, without arguments prints the default values",
7142 __FILE__, VPolygonOffset, group);
7144 theCommands.Add ("vmarkerstest",
7145 "vmarkerstest: name X Y Z [PointsOnSide=10] [MarkerType=0] [Scale=1.0] [FileName=ImageFile]\n",
7146 __FILE__, VMarkersTest, group);
7148 theCommands.Add ("text2brep",
7149 "text2brep: name text"
7150 "\n\t\t: [-pos X=0 Y=0 Z=0]"
7151 "\n\t\t: [-halign {left|center|right}=left]"
7152 "\n\t\t: [-valign {top|center|bottom|topfirstline}=bottom}]"
7153 "\n\t\t: [-height height=16]"
7154 "\n\t\t: [-aspect {regular|bold|italic|boldItalic}=regular]"
7155 "\n\t\t: [-font font=Courier] [-strict {strict|aliases|any}=any]"
7156 "\n\t\t: [-composite {on|off}=off]"
7157 "\n\t\t: [-plane NormX NormY NormZ DirX DirY DirZ]",
7158 __FILE__, TextToBRep, group);
7159 theCommands.Add ("vfont",
7160 "vfont [-add pathToFont [fontName] [regular,bold,italic,boldItalic=undefined] [singleStroke]]"
7161 "\n\t\t: [-strict {any|aliases|strict}] [-find fontName [regular,bold,italic,boldItalic=undefined]] [-verbose {on|off}]"
7162 "\n\t\t: [-findAll fontNameMask] [-findInfo fontName]"
7163 "\n\t\t: [-unicodeFallback {on|off}]"
7164 "\n\t\t: [-clear] [-init] [-list] [-names]"
7165 "\n\t\t: [-aliases [aliasName]] [-addAlias Alias FontName] [-removeAlias Alias FontName] [-clearAlias Alias] [-clearAliases]"
7166 "\n\t\t: Work with font registry - register font, list available fonts, find font."
7167 "\n\t\t: -findAll is same as -find, but can print more than one font when mask is passed."
7168 "\n\t\t: -findInfo is same as -find, but prints complete font information instead of family name.",
7169 __FILE__, VFont, group);
7171 theCommands.Add ("vvertexmode",
7172 "vvertexmode [name | -set {isolated | all | inherited} [name1 name2 ...]]\n"
7173 "vvertexmode - prints the default vertex draw mode\n"
7174 "vvertexmode name - prints the vertex draw mode of the given object\n"
7175 "vvertexmode -set {isolated | all | inherited} - sets the default vertex draw mode and updates the mode for all displayed objects\n"
7176 "vvertexmode -set {isolated | all | inherited} name1 name2 ... - sets the vertex draw mode for the specified object(s)\n",
7177 __FILE__, VVertexMode, group);
7179 theCommands.Add ("vpointcloud",
7180 "vpointcloud name shape [-randColor] [-normals] [-noNormals] [-uv]"
7181 "\n\t\t: Create an interactive object for arbitrary set of points"
7182 "\n\t\t: from triangulated shape."
7184 "vpointcloud name x y z r npts {surface|volume}\n"
7185 " ... [-randColor] [-normals] [-noNormals] [-uv]"
7186 "\n\t\t: Create arbitrary set of points (npts) randomly distributed"
7187 "\n\t\t: on spheric surface or within spheric volume (x y z r)."
7189 "\n\t\t: Additional options:"
7190 "\n\t\t: -randColor - generate random color per point"
7191 "\n\t\t: -normals - generate normal per point (default)"
7192 "\n\t\t: -noNormals - do not generate normal per point"
7194 __FILE__, VPointCloud, group);
7196 theCommands.Add("vpriority",
7197 "vpriority [-noupdate|-update] name [value]\n\t\t prints or sets the display priority for an object",
7201 theCommands.Add ("vnormals",
7203 "vnormals Shape [{on|off}=on] [-length {10}] [-nbAlongU {1}] [-nbAlongV {1}] [-nbAlong {1}]"
7204 "\n\t\t: [-useMesh] [-oriented {0}1}=0]"
7205 "\n\t\t: Displays/Hides normals calculated on shape geometry or retrieved from triangulation",
7206 __FILE__, VNormals, group);