+ else if (aFunction->GetType() == SKETCHER3D_COMMAND) {
+ Kernel_Utils::Localizer loc;
+
+ TCollection_AsciiString aCommand = aCI.GetCommand();
+ // "3DSketcher:CMD[:CMD[:CMD...]]"
+
+ // Split the command string to separate CMDs
+ int icmd = 2;
+ TColStd_SequenceOfAsciiString aSequence;
+ if (aCommand.Length()) {
+ TCollection_AsciiString aToken = aCommand.Token(":", icmd);
+ while (aToken.Length() > 0) {
+ aSequence.Append(aToken);
+ aToken = aCommand.Token(":", ++icmd);
+ }
+ }
+
+ int nbEdges = 0;
+ bool isFirstPointSet = false;
+ gp_XYZ p = gp::Origin().XYZ();
+ BRepBuilderAPI_MakeVertex MV0 (p);
+ TopoDS_Vertex V = TopoDS::Vertex(MV0.Shape());
+
+ gp_XYZ p0 = p;
+ TopoDS_Vertex V0 = V;
+
+ bool doClose = false;
+ BRepBuilderAPI_MakeWire MW;
+
+ int nbCMDs = aSequence.Length();
+ for (icmd = 1; icmd <= nbCMDs; icmd++) {
+ TCollection_AsciiString aCMD = aSequence.Value(icmd);
+
+ // Split the CMD into string values
+ TColStd_SequenceOfAsciiString aStrVals;
+ int ival = 1;
+ TCollection_AsciiString aToken = aCMD.Token(" ", ival);
+ while (aToken.Length() > 0) {
+ aStrVals.Append(aToken);
+ aToken = aCMD.Token(" ", ++ival);
+ }
+
+ // "TT x y z" : Create segment by point at X & Y or set the first point
+ // "T dx dy dz" : Create segment by point with DX & DY
+ //
+ // "OXY angleX angle2 length" : Create segment by two angles and length
+ // "OYZ angleY angle2 length" : Create segment by two angles and length
+ // "OXZ angleX angle2 length" : Create segment by two angles and length
+ //
+ // "WW" : Close Wire (to finish)
+
+ switch (aStrVals.Value(1).Value(1))
+ {
+ case 'T':
+ {
+ if (aStrVals.Length() != 4)
+ Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command.");
+
+ gp_XYZ vp;
+ vp.SetX(aStrVals.Value(2).RealValue());
+ vp.SetY(aStrVals.Value(3).RealValue());
+ vp.SetZ(aStrVals.Value(4).RealValue());
+
+ if (aStrVals.Value(1) == "TT") { // absolute coordinates
+ if (!isFirstPointSet) {
+ p = vp;
+ BRepBuilderAPI_MakeVertex MV (p);
+ V = TopoDS::Vertex(MV.Shape());
+
+ p0 = p;
+ V0 = V;
+
+ isFirstPointSet = true;
+ }
+ else {
+ if ((vp - p).SquareModulus() > Precision::Confusion()) {
+ BRepBuilderAPI_MakeVertex MV (vp);
+ TopoDS_Vertex VV = TopoDS::Vertex(MV.Shape());
+ BRepBuilderAPI_MakeEdge ME (V, VV);
+ MW.Add(ME);
+ nbEdges++;
+
+ p = vp;
+ V = VV;
+ }
+ }
+ }
+ else if (aStrVals.Value(1) == "T") { // relative coordinates
+ if (vp.SquareModulus() > Precision::Confusion()) {
+ vp = p + vp;
+
+ BRepBuilderAPI_MakeVertex MV (vp);
+ TopoDS_Vertex VV = TopoDS::Vertex(MV.Shape());
+ BRepBuilderAPI_MakeEdge ME (V, VV);
+ MW.Add(ME);
+ nbEdges++;
+
+ p = vp;
+ V = VV;
+ }
+ }
+ else
+ Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command.");
+ }
+ break;
+ case 'O':
+ {
+ if (aStrVals.Length() != 4)
+ Standard_ConstructionError::Raise("3D Sketcher error: Bad format of command.");
+
+ char type = aStrVals.Value(1).Value(4);
+ char mode = aStrVals.Value(1).Value(5);
+
+ double anAngle = aStrVals.Value(2).RealValue() * M_PI/180.0;
+ double anAngle2 = aStrVals.Value(3).RealValue() * M_PI/180.0;
+ double aLength = aStrVals.Value(4).RealValue();
+
+ double aHeight = aLength * sin(anAngle2);
+ if (type == 'C')
+ {
+ aHeight = aStrVals.Value(3).RealValue();
+ anAngle2 = 0.0;
+ }