// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include <ViewerTest.hxx>
-#include <string.h>
-
#include <Quantity_NameOfColor.hxx>
#include <Draw_Interpretor.hxx>
#include <Draw.hxx>
#include <AIS_Shape.hxx>
#include <AIS_DisplayMode.hxx>
+#include <AIS_PointCloud.hxx>
#include <TColStd_MapOfInteger.hxx>
#include <AIS_MapOfInteractive.hxx>
+#include <ViewerTest_AutoUpdater.hxx>
#include <ViewerTest_DoubleMapOfInteractiveAndName.hxx>
#include <ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName.hxx>
#include <ViewerTest_EventManager.hxx>
#include <StdPrs_ShadedShape.hxx>
#include <TopoDS_Wire.hxx>
-#include <AIS_ConnectedShape.hxx>
#include <AIS_MultipleConnectedInteractive.hxx>
-#include <AIS_MultipleConnectedShape.hxx>
+#include <AIS_ConnectedInteractive.hxx>
#include <TopLoc_Location.hxx>
#include <TColStd_ListOfInteger.hxx>
#include <TColStd_ListIteratorOfListOfInteger.hxx>
#include <Image_AlienPixMap.hxx>
#include <TColStd_HArray1OfAsciiString.hxx>
-#ifdef HAVE_STRINGS_H
-#include <strings.h>
-#endif
-
-#ifdef WNT
-#define _CRT_SECURE_NO_DEPRECATE
-#pragma warning (disable:4996)
+#ifdef _WIN32
+# define _CRT_SECURE_NO_DEPRECATE
+# pragma warning (disable:4996)
#endif
extern ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS();
//purpose : Change location of AIS interactive object
//=======================================================================
-static Standard_Integer VSetLocation (Draw_Interpretor& di,
- Standard_Integer argc,
- const char ** argv)
+static Standard_Integer VSetLocation (Draw_Interpretor& /*di*/,
+ Standard_Integer theArgNb,
+ const char** theArgVec)
{
Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
+ ViewerTest_AutoUpdater anUpdateTool (aContext, ViewerTest::CurrentView());
if (aContext.IsNull())
{
- di << argv[0] << "ERROR : use 'vinit' command before " << "\n";
+ std::cout << "Error: no active view!\n";
return 1;
}
- if (argc != 5)
+ TCollection_AsciiString aName;
+ gp_Vec aLocVec;
+ Standard_Boolean isSetLoc = Standard_False;
+
+ Standard_Integer anArgIter = 1;
+ for (; anArgIter < theArgNb; ++anArgIter)
{
- di << "ERROR : Usage : " << argv[0] << " name x y z; new location" << "\n";
- return 1;
+ Standard_CString anArg = theArgVec[anArgIter];
+ if (anUpdateTool.parseRedrawMode (theArgVec[anArgIter]))
+ {
+ continue;
+ }
+ else if (aName.IsEmpty())
+ {
+ aName = anArg;
+ }
+ else if (!isSetLoc)
+ {
+ isSetLoc = Standard_True;
+ if (anArgIter + 1 >= theArgNb)
+ {
+ std::cout << "Error: syntax error at '" << anArg << "'\n";
+ return 1;
+ }
+ aLocVec.SetX (Draw::Atof (theArgVec[anArgIter++]));
+ aLocVec.SetY (Draw::Atof (theArgVec[anArgIter]));
+ if (anArgIter + 1 < theArgNb)
+ {
+ aLocVec.SetZ (Draw::Atof (theArgVec[++anArgIter]));
+ }
+ }
+ else
+ {
+ std::cout << "Error: unknown argument '" << anArg << "'\n";
+ return 1;
+ }
}
- TCollection_AsciiString aName (argv[1]);
- Standard_Real aX = Draw::Atof (argv[2]);
- Standard_Real aY = Draw::Atof (argv[3]);
- Standard_Real aZ = Draw::Atof (argv[4]);
-
// find object
- ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
+ const ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
Handle(AIS_InteractiveObject) anIObj;
- if (!aMap.IsBound2 (aName))
+ if (aMap.IsBound2 (aName))
{
- di << "Use 'vdisplay' before" << "\n";
- return 1;
+ anIObj = Handle(AIS_InteractiveObject)::DownCast (aMap.Find2 (aName));
}
- else
+ if (anIObj.IsNull())
{
- anIObj = Handle(AIS_InteractiveObject)::DownCast (aMap.Find2 (aName));
-
- // not an AIS_InteractiveObject
- if (anIObj.IsNull())
- {
- di << argv[1] << " : Not an AIS interactive object" << "\n";
- return 1;
- }
-
- gp_Trsf aTrsf;
- aTrsf.SetTranslation (gp_Vec (aX, aY, aZ));
- TopLoc_Location aLocation (aTrsf);
- aContext->SetLocation (anIObj, aLocation);
- aContext->UpdateCurrentViewer();
+ std::cout << "Error: object '" << aName << "' is not displayed!\n";
+ return 1;
}
+ gp_Trsf aTrsf;
+ aTrsf.SetTranslation (aLocVec);
+ TopLoc_Location aLocation (aTrsf);
+ aContext->SetLocation (anIObj, aLocation);
return 0;
}
//===============================================================================================
//function : VConnect
//purpose : Creates and displays AIS_ConnectedInteractive object from input object and location
-//Draw arg : vconnect name Xo Yo Zo Xu Xv Xw Zu Zv Zw object1 object2 ... [color=NAME]
+//Draw arg : vconnect name Xo Yo Zo object1 object2 ... [color=NAME]
//===============================================================================================
-static Standard_Integer VConnect(Draw_Interpretor& /*di*/,
- Standard_Integer argc,
- const char ** argv)
+static Standard_Integer VConnect (Draw_Interpretor& /*di*/,
+ Standard_Integer argc,
+ const char ** argv)
{
// Check the viewer
Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
return 1; // TCL_ERROR
}
// Check argumnets
- if (argc < 12)
+ if (argc < 6)
{
- std::cout << "vconnect error: expect at least 11 arguments\n";
+ std::cout << "vconnect error: expect at least 5 arguments\n";
return 1; // TCL_ERROR
}
// Get values
Standard_Integer anArgIter = 1;
TCollection_AsciiString aName (argv[anArgIter++]);
- Handle(AIS_InteractiveObject) anOriginObject;
+ Handle(AIS_MultipleConnectedInteractive) anOriginObject;
TCollection_AsciiString aColorString (argv[argc-1]);
Standard_CString aColorName = "";
Standard_Boolean hasColor = Standard_False;
}
Handle(AIS_InteractiveObject) anObject;
- // AIS_ConnectedInteractive
- if (argc == 12 || (argc == 13 && hasColor))
+ // AIS_MultipleConnectedInteractive
+ const Standard_Integer aNbShapes = hasColor ? (argc - 1) : argc;
+ for (Standard_Integer i = 5; i < aNbShapes; ++i)
{
- TCollection_AsciiString anOriginObjectName(argv[11]);
+ TCollection_AsciiString anOriginObjectName (argv[i]);
if (aName.IsEqual (anOriginObjectName))
{
- std::cout << "vconnect error: equal names for connected objects\n";
- return 1; // TCL_ERROR
+ std::cout << "vconnect error: equal names for connected objects\n";
+ continue;
}
if (GetMapOfAIS().IsBound2 (anOriginObjectName))
{
Handle(Standard_Transient) anObj = GetMapOfAIS().Find2 (anOriginObjectName);
- anOriginObject = Handle(AIS_InteractiveObject)::DownCast(anObj);
- if (anOriginObject.IsNull())
+ anObject = Handle(AIS_InteractiveObject)::DownCast(anObj);
+ if (anObject.IsNull())
{
std::cout << "Object " << anOriginObjectName << " is used for non AIS viewer\n";
- return 1; // TCL_ERROR
+ continue;
}
}
else
if (aTDShape.IsNull())
{
std::cout << "vconnect error: object " << anOriginObjectName << " doesn't exist\n";
- return 1; // TCL_ERROR
- }
- anOriginObject = new AIS_Shape (aTDShape);
- if (hasColor)
- {
- anOriginObject->SetColor (ViewerTest::GetColorFromName (aColorName));
- }
- }
- }
- // AIS_MultipleConnectedInteractive
- else
- {
- const Standard_Integer aNbShapes = hasColor ? (argc - 1) : argc;
- for (Standard_Integer i = 11; i < aNbShapes; ++i)
- {
- TCollection_AsciiString anOriginObjectName (argv[i]);
- if (aName.IsEqual (anOriginObjectName))
- {
- std::cout << "vconnect error: equal names for connected objects\n";
continue;
}
- if (GetMapOfAIS().IsBound2 (anOriginObjectName))
- {
- Handle(Standard_Transient) anObj = GetMapOfAIS().Find2 (anOriginObjectName);
- anObject = Handle(AIS_InteractiveObject)::DownCast(anObj);
- if (anObject.IsNull())
- {
- std::cout << "Object " << anOriginObjectName << " is used for non AIS viewer\n";
- continue;
- }
- }
- else
- {
- Standard_CString aName = anOriginObjectName.ToCString();
- TopoDS_Shape aTDShape = DBRep::Get (aName);
- if (aTDShape.IsNull())
- {
- std::cout << "vconnect error: object " << anOriginObjectName << " doesn't exist\n";
- continue;
- }
- anObject = new AIS_Shape (aTDShape);
- anObject->SetColor (ViewerTest::GetColorFromName (aColorName));
- }
- if (anOriginObject.IsNull())
- {
- anOriginObject = new AIS_MultipleConnectedInteractive();
- Handle(AIS_MultipleConnectedInteractive)::DownCast(anOriginObject)->Connect (anObject);
- }
- else
- {
- Handle(AIS_MultipleConnectedInteractive)::DownCast(anOriginObject)->Connect (anObject);
- }
+ anObject = new AIS_Shape (aTDShape);
+ anObject->SetColor (ViewerTest::GetColorFromName (aColorName));
}
+
if (anOriginObject.IsNull())
{
- std::cout << "vconect error : can't connect input objects\n";
- return 1; // TCL_ERROR
+ anOriginObject = new AIS_MultipleConnectedInteractive();
}
+
+ anOriginObject->Connect (anObject);
+ }
+ if (anOriginObject.IsNull())
+ {
+ std::cout << "vconect error : can't connect input objects\n";
+ return 1; // TCL_ERROR
}
// Get location data
Standard_Real aXo = Draw::Atof (argv[anArgIter++]);
Standard_Real aYo = Draw::Atof (argv[anArgIter++]);
Standard_Real aZo = Draw::Atof (argv[anArgIter++]);
- Standard_Real aXu = Draw::Atof (argv[anArgIter++]);
- Standard_Real aXv = Draw::Atof (argv[anArgIter++]);
- Standard_Real aXw = Draw::Atof (argv[anArgIter++]);
- Standard_Real aZu = Draw::Atof (argv[anArgIter++]);
- Standard_Real aZv = Draw::Atof (argv[anArgIter++]);
- Standard_Real aZw = Draw::Atof (argv[anArgIter++]);
// Create transformation
- gp_Pnt aPoint(aXo, aYo, aZo);
- gp_Dir anXDir(aXu, aXv, aXw), aZDir(aZu, aZv, aZw);
- if(!anXDir.IsNormal(aZDir, Precision::Angular()))
- {
- std::cout << "vconnect error : XDir expects to be normal to ZDir\n";
- return 1; // TCL_ERROR
- }
- gp_Ax3 anAx3(aPoint, aZDir, anXDir);
+ gp_Vec aTranslation (aXo, aYo, aZo);
+
gp_Trsf aTrsf;
- aTrsf.SetTransformation(anAx3);
- TopLoc_Location aLocation(aTrsf);
+ aTrsf.SetTranslationPart (aTranslation);
+ TopLoc_Location aLocation (aTrsf);
- // Create connected object
- Handle(AIS_ConnectedInteractive) aConnected = new AIS_ConnectedInteractive();
- Handle(AIS_MultipleConnectedInteractive) anOrigin = Handle(AIS_MultipleConnectedInteractive)::DownCast(anOriginObject);
- if (anOrigin.IsNull())
- {
- aConnected->Connect (anOriginObject, aLocation);
- }
- else
- {
- aConnected->Connect (anOrigin, aLocation);
- }
+ anOriginObject->SetLocalTransformation (aTrsf);
// Check if there is another object with given name
// and remove it from context
}
// Bind connected object to its name
- GetMapOfAIS().Bind (aConnected, aName);
+ GetMapOfAIS().Bind (anOriginObject, aName);
// Display connected object
- TheAISContext()->Display (aConnected);
+ TheAISContext()->Display (anOriginObject);
return 0;
}
//===============================================================================================
-//function : VConnectShape
-//purpose : Creates and displays AIS_ConnectedShape from input shape and location
-//Draw arg : vconnectsh name Xo Yo Zo Xu Xv Xw Zu Zv Zw shape1 shape2 ... [color=NAME]
+//function : VConnectTo
+//purpose : Creates and displays AIS_ConnectedInteractive object from input object and location
+//Draw arg : vconnectto name Xo Yo Zo object
//===============================================================================================
-static Standard_Integer VConnectShape(Draw_Interpretor& /*di*/,
- Standard_Integer argc,
- const char ** argv)
+static Standard_Integer VConnectTo (Draw_Interpretor& /*di*/,
+ Standard_Integer argc,
+ const char ** argv)
{
// Check the viewer
Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
if (aContext.IsNull())
{
- std::cout << "vconnectsh error : call vinit before\n";
+ std::cout << "vconnect error : call vinit before\n";
return 1; // TCL_ERROR
}
- // Check argumnets
- if (argc < 12)
+ // Check argumnets
+ if (argc != 6)
{
- std::cout << "vconnectsh error: expect at least 11 arguments\n";
+ std::cout << "vconnect error: expect at least 5 arguments\n";
return 1; // TCL_ERROR
}
// Get values
Standard_Integer anArgIter = 1;
TCollection_AsciiString aName (argv[anArgIter++]);
- Handle(AIS_InteractiveObject) anOriginShape;
- TCollection_AsciiString aColorString(argv[argc-1]);
- Standard_CString aColorName = "";
- Standard_Boolean hasColor = Standard_False;
- if (aColorString.Search ("color=") != -1)
+ Handle(AIS_InteractiveObject) anOriginObject;
+
+ TCollection_AsciiString anOriginObjectName(argv[5]);
+ if (aName.IsEqual (anOriginObjectName))
{
- hasColor = Standard_True;
- aColorString.Remove (1, 6);
- aColorName = aColorString.ToCString();
+ std::cout << "vconnect error: equal names for connected objects\n";
+ return 1; // TCL_ERROR
}
- Handle(AIS_Shape) aShape;
-
- // AIS_ConnectedShape
- if (argc == 12 || (argc == 13 && hasColor))
+ if (GetMapOfAIS().IsBound2 (anOriginObjectName))
{
- TCollection_AsciiString anOriginShapeName (argv[11]);
- if (aName.IsEqual (anOriginShapeName))
+ Handle(Standard_Transient) anObj = GetMapOfAIS().Find2 (anOriginObjectName);
+ anOriginObject = Handle(AIS_InteractiveObject)::DownCast(anObj);
+ if (anOriginObject.IsNull())
{
- std::cout << "vconnectsh error: equal names for connected shapes\n";
+ std::cout << "Object " << anOriginObjectName << " is used for non AIS viewer\n";
return 1; // TCL_ERROR
}
- if (GetMapOfAIS().IsBound2 (anOriginShapeName))
- {
- Handle(Standard_Transient) anObj = GetMapOfAIS().Find2 (anOriginShapeName);
- anOriginShape = Handle(AIS_Shape)::DownCast(anObj);
- if (anOriginShape.IsNull())
- {
- std::cout << "Shape " << anOriginShapeName << " is used for non AIS viewer\n!";
- return 1; // TCL_ERROR
- }
- }
- else
- {
- Standard_CString aName = anOriginShapeName.ToCString();
- TopoDS_Shape aTDShape = DBRep::Get (aName);
- if (aTDShape.IsNull())
- {
- std::cout << "vconnectsh error: object " << anOriginShapeName << " doesn't exist\n";
- return 1; // TCL_ERROR
- }
- anOriginShape = new AIS_Shape (aTDShape);
- if (hasColor)
- {
- anOriginShape->SetColor (ViewerTest::GetColorFromName (aColorName));
- }
- }
}
- // AIS_MultipleConnectedShape
else
{
- const Standard_Integer aNbShapes = hasColor ? (argc - 1) : argc;
- for (Standard_Integer i = 11; i < aNbShapes; ++i)
+ Standard_CString aName = anOriginObjectName.ToCString();
+ TopoDS_Shape aTDShape = DBRep::Get (aName);
+ if (aTDShape.IsNull())
{
- TCollection_AsciiString anOriginShapeName (argv[i]);
- if (aName.IsEqual (anOriginShapeName))
- {
- std::cout << "vconnectsh error: equal names for connected shapes\n";
- continue;
- }
- if (GetMapOfAIS().IsBound2 (anOriginShapeName))
- {
- Handle(Standard_Transient) anObj = GetMapOfAIS().Find2 (anOriginShapeName);
- aShape = Handle(AIS_Shape)::DownCast(anObj);
- if (aShape.IsNull())
- {
- std::cout << "Shape " << anOriginShapeName << " is used for non AIS viewer\n";
- continue;
- }
- }
- else
- {
- Standard_CString aName = anOriginShapeName.ToCString();
- TopoDS_Shape aTDShape = DBRep::Get (aName);
- if (aTDShape.IsNull())
- {
- std::cout << "vconnectsh error: object " << anOriginShapeName << " doesn't exist\n";
- continue;
- }
- aShape = new AIS_Shape (aTDShape);
- if (hasColor)
- {
- aShape->SetColor (ViewerTest::GetColorFromName (aColorName));
- }
- }
- if (anOriginShape.IsNull())
- {
- anOriginShape = new AIS_MultipleConnectedShape (aShape->Shape());
- Handle(AIS_MultipleConnectedShape)::DownCast(anOriginShape)->Connect (aShape);
- }
- else
- {
- Handle(AIS_MultipleConnectedShape)::DownCast(anOriginShape)->Connect (aShape);
- }
- }
- if (anOriginShape.IsNull())
- {
- std::cout << "vconectsh error : can't connect input objects\n";
+ std::cout << "vconnect error: object " << anOriginObjectName << " doesn't exist\n";
return 1; // TCL_ERROR
}
+ anOriginObject = new AIS_Shape (aTDShape);
}
-
- // Get location data
+
+ // Get location data
Standard_Real aXo = Draw::Atof (argv[anArgIter++]);
Standard_Real aYo = Draw::Atof (argv[anArgIter++]);
Standard_Real aZo = Draw::Atof (argv[anArgIter++]);
- Standard_Real aXu = Draw::Atof (argv[anArgIter++]);
- Standard_Real aXv = Draw::Atof (argv[anArgIter++]);
- Standard_Real aXw = Draw::Atof (argv[anArgIter++]);
- Standard_Real aZu = Draw::Atof (argv[anArgIter++]);
- Standard_Real aZv = Draw::Atof (argv[anArgIter++]);
- Standard_Real aZw = Draw::Atof (argv[anArgIter++]);
// Create transformation
- gp_Pnt aPoint(aXo, aYo, aZo);
- gp_Dir anXDir(aXu, aXv, aXw), aZDir(aZu, aZv, aZw);
- if(!anXDir.IsNormal(aZDir, Precision::Angular()))
- {
- std::cout << "vconnectsh error : XDir expects to be normal to ZDir\n";
- return 1; // TCL_ERROR
- }
- gp_Ax3 anAx3(aPoint, aZDir, anXDir);
- gp_Trsf aTrsf;
- aTrsf.SetTransformation(anAx3);
- TopLoc_Location aLocation(aTrsf);
+ gp_Vec aTranslation (aXo, aYo, aZo);
- // Create connected shape
+ gp_Trsf aTrsf;
+ aTrsf.SetTranslationPart (aTranslation);
+
Handle(AIS_ConnectedInteractive) aConnected;
- Handle(AIS_Shape) anOrigin = Handle(AIS_Shape)::DownCast(anOriginShape);
- if (!anOrigin.IsNull())
- {
- aConnected = new AIS_ConnectedShape (anOrigin);
- aConnected->Connect (anOrigin, aLocation);
- }
- else
- {
- aConnected = new AIS_ConnectedInteractive();
- aConnected->Connect (anOriginShape, aLocation);
- }
+
+ aConnected = new AIS_ConnectedInteractive();
+
+ aConnected->Connect (anOriginObject, aTrsf);
// Check if there is another object with given name
// and remove it from context
GetMapOfAIS().UnBind2(aName);
}
- // Bind connected shape to its name
+ // Bind connected object to its name
GetMapOfAIS().Bind (aConnected, aName);
- // Display connected shape
+ // Display connected object
TheAISContext()->Display (aConnected);
return 0;
}
+//=======================================================================
+//function : VDisconnect
+//purpose :
+//=======================================================================
+static Standard_Integer VDisconnect (Draw_Interpretor& di,
+ Standard_Integer argc,
+ const char ** argv)
+{
+ Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
+ if (aContext.IsNull())
+ {
+ std::cout << argv[0] << "ERROR : use 'vinit' command before " << "\n";
+ return 1;
+ }
+
+ if (argc != 3)
+ {
+ std::cout << "ERROR : Usage : " << argv[0] << " name object" << "\n";
+ return 1;
+ }
+
+ TCollection_AsciiString aName (argv[1]);
+ TCollection_AsciiString anObject (argv[2]);
+ Standard_Integer anObjectNumber = Draw::Atoi (argv[2]);
+
+ // find objects
+ ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
+ Handle(AIS_MultipleConnectedInteractive) anAssembly;
+ if (!aMap.IsBound2 (aName) )
+ {
+ std::cout << "Use 'vdisplay' before" << "\n";
+ return 1;
+ }
+
+ anAssembly = Handle(AIS_MultipleConnectedInteractive)::DownCast (aMap.Find2 (aName));
+ if (anAssembly.IsNull())
+ {
+ di << "Not an assembly" << "\n";
+ return 1;
+ }
+
+ Handle(AIS_InteractiveObject) anIObj;
+ if (!aMap.IsBound2 (anObject))
+ {
+ // try to interpret second argument as child number
+ if (anObjectNumber > 0 && anObjectNumber <= anAssembly->Children().Size())
+ {
+ Standard_Integer aCounter = 1;
+ for (PrsMgr_ListOfPresentableObjectsIter anIter (anAssembly->Children()); anIter.More(); anIter.Next())
+ {
+ if (aCounter == anObjectNumber)
+ {
+ anIObj = Handle(AIS_InteractiveObject)::DownCast (anIter.Value());
+ break;
+ }
+ ++aCounter;
+ }
+ }
+ else
+ {
+ std::cout << "Use 'vdisplay' before" << "\n";
+ return 1;
+ }
+ }
+
+ // if object was found by name
+ if (anIObj.IsNull())
+ {
+ anIObj = Handle(AIS_InteractiveObject)::DownCast (aMap.Find2 (anObject));
+ }
+
+ anAssembly->Disconnect (anIObj);
+ aContext->UpdateCurrentViewer();
+
+ return 0;
+}
+
+//=======================================================================
+//function : VAddConnected
+//purpose :
+//=======================================================================
+static Standard_Integer VAddConnected (Draw_Interpretor& di,
+ Standard_Integer argc,
+ const char ** argv)
+{
+ Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
+ if (aContext.IsNull())
+ {
+ std::cout << argv[0] << "error : use 'vinit' command before " << "\n";
+ return 1;
+ }
+
+ if (argc != 6)
+ {
+ std::cout << argv[0] << " error: expect 5 arguments\n";
+ return 1;
+ }
+
+ TCollection_AsciiString aName (argv[1]);
+ TCollection_AsciiString anObject (argv[5]);
+ Standard_Real aX = Draw::Atof (argv[2]);
+ Standard_Real aY = Draw::Atof (argv[3]);
+ Standard_Real aZ = Draw::Atof (argv[4]);
+
+ // find object
+ ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
+ Handle(AIS_MultipleConnectedInteractive) anAssembly;
+ if (!aMap.IsBound2 (aName) )
+ {
+ std::cout << "Use 'vdisplay' before" << "\n";
+ return 1;
+ }
+
+ anAssembly = Handle(AIS_MultipleConnectedInteractive)::DownCast (aMap.Find2 (aName));
+ if (anAssembly.IsNull())
+ {
+ di << "Not an assembly" << "\n";
+ return 1;
+ }
+
+ Handle(AIS_InteractiveObject) anIObj;
+ if (!aMap.IsBound2 (anObject))
+ {
+ std::cout << "Use 'vdisplay' before" << "\n";
+ return 1;
+ }
+
+ anIObj = Handle(AIS_InteractiveObject)::DownCast (aMap.Find2 (anObject));
+
+ gp_Trsf aTrsf;
+ aTrsf.SetTranslation (gp_Vec (aX, aY, aZ));
+
+ anAssembly->Connect (anIObj, aTrsf);
+ TheAISContext()->Display (anAssembly);
+ TheAISContext()->RecomputeSelectionOnly (anAssembly);
+ aContext->UpdateCurrentViewer();
+
+ return 0;
+}
+
+//=======================================================================
+//function : VListConnected
+//purpose :
+//=======================================================================
+static Standard_Integer VListConnected (Draw_Interpretor& /*di*/,
+ Standard_Integer argc,
+ const char ** argv)
+{
+ Handle(AIS_InteractiveContext) aContext = ViewerTest::GetAISContext();
+ if (aContext.IsNull())
+ {
+ std::cout << argv[0] << "ERROR : use 'vinit' command before " << "\n";
+ return 1;
+ }
+
+ if (argc != 2)
+ {
+ std::cout << "ERROR : Usage : " << argv[0] << " name" << "\n";
+ return 1;
+ }
+
+ TCollection_AsciiString aName (argv[1]);
+
+ // find object
+ ViewerTest_DoubleMapOfInteractiveAndName& aMap = GetMapOfAIS();
+ Handle(AIS_MultipleConnectedInteractive) anAssembly;
+ if (!aMap.IsBound2 (aName) )
+ {
+ std::cout << "Use 'vdisplay' before" << "\n";
+ return 1;
+ }
+
+ anAssembly = Handle(AIS_MultipleConnectedInteractive)::DownCast (aMap.Find2 (aName));
+ if (anAssembly.IsNull())
+ {
+ std::cout << "Not an assembly" << "\n";
+ return 1;
+ }
+
+ std::cout << "Children of " << aName << ":\n";
+
+ Standard_Integer aCounter = 1;
+ for (PrsMgr_ListOfPresentableObjectsIter anIter (anAssembly->Children()); anIter.More(); anIter.Next())
+ {
+ if (GetMapOfAIS().IsBound1 (anIter.Value()))
+ {
+ TCollection_AsciiString aName = GetMapOfAIS().Find1 (anIter.Value());
+ std::cout << aCounter << ") " << aName << " (" << anIter.Value()->DynamicType()->Name() << ")";
+ }
+
+ std::cout << aCounter << ") " << anIter.Value()->DynamicType()->Name();
+
+ Handle(AIS_ConnectedInteractive) aConnected = Handle(AIS_ConnectedInteractive)::DownCast (anIter.Value());
+ if (!aConnected.IsNull() && !aConnected->ConnectedTo().IsNull() && aMap.IsBound1 (aConnected->ConnectedTo()))
+ {
+ std::cout << " connected to " << aMap.Find1 (aConnected->ConnectedTo());
+ }
+ std::cout << std::endl;
+
+ ++aCounter;
+ }
+
+ return 0;
+}
+
namespace
{
//! Checks if theMode is already turned on for theObj.
return 0;
}
+//=======================================================================
+//function : VPointCloud
+//purpose : Create interactive object for arbitary set of points.
+//=======================================================================
+static Standard_Integer VPointCloud (Draw_Interpretor& theDI,
+ Standard_Integer theArgNum,
+ const char** theArgs)
+{
+ Handle(AIS_InteractiveContext) anAISContext = ViewerTest::GetAISContext();
+ if (anAISContext.IsNull())
+ {
+ std::cerr << "Error: no active view!\n";
+ return 1;
+ }
+
+ // command to execute
+ enum Command
+ {
+ CloudForShape, // generate point cloud for shape
+ CloudSphere, // generate point cloud for generic sphere
+ Unknow
+ };
+
+ // count number of non-optional command arguments
+ Command aCmd = Unknow;
+ Standard_Integer aCmdArgs = 0;
+ for (Standard_Integer anArgIter = 1; anArgIter < theArgNum; ++anArgIter)
+ {
+ Standard_CString anArg = theArgs[anArgIter];
+ TCollection_AsciiString aFlag (anArg);
+ aFlag.LowerCase();
+ if (aFlag.IsRealValue() || aFlag.Search ("-") != 1)
+ {
+ aCmdArgs++;
+ }
+ }
+ switch (aCmdArgs)
+ {
+ case 2 : aCmd = CloudForShape; break;
+ case 7 : aCmd = CloudSphere; break;
+ default :
+ std::cout << "Error: wrong number of arguments! See usage:\n";
+ theDI.PrintHelp (theArgs[0]);
+ return 1;
+ }
+
+ // parse options
+ Standard_Boolean toRandColors = Standard_False;
+ Standard_Boolean hasNormals = Standard_True;
+ Standard_Boolean isSetArgNorm = Standard_False;
+ for (Standard_Integer anArgIter = 1; anArgIter < theArgNum; ++anArgIter)
+ {
+ Standard_CString anArg = theArgs[anArgIter];
+ TCollection_AsciiString aFlag (anArg);
+ aFlag.LowerCase();
+ if (aFlag == "-randcolors"
+ || aFlag == "-randcolor")
+ {
+ if (isSetArgNorm && hasNormals)
+ {
+ std::cout << "Error: wrong syntax - normals can not be enabled with colors at the same time\n";
+ return 1;
+ }
+ toRandColors = Standard_True;
+ hasNormals = Standard_False;
+ }
+ else if (aFlag == "-normals"
+ || aFlag == "-normal")
+ {
+ if (toRandColors)
+ {
+ std::cout << "Error: wrong syntax - normals can not be enabled with colors at the same time\n";
+ return 1;
+ }
+ isSetArgNorm = Standard_True;
+ hasNormals = Standard_True;
+ }
+ else if (aFlag == "-nonormals"
+ || aFlag == "-nonormal")
+ {
+ isSetArgNorm = Standard_True;
+ hasNormals = Standard_False;
+ }
+ }
+
+ Standard_CString aName = theArgs[1];
+
+ // generate arbitrary set of points
+ Handle(Graphic3d_ArrayOfPoints) anArrayPoints;
+ if (aCmd == CloudForShape)
+ {
+ Standard_CString aShapeName = theArgs[2];
+ TopoDS_Shape aShape = DBRep::Get (aShapeName);
+
+ if (aShape.IsNull())
+ {
+ std::cout << "Error: no shape with name '" << aShapeName << "' found\n";
+ return 1;
+ }
+
+ // calculate number of points
+ TopLoc_Location aLocation;
+ Standard_Integer aNbPoints = 0;
+ for (TopExp_Explorer aFaceIt (aShape, TopAbs_FACE); aFaceIt.More(); aFaceIt.Next())
+ {
+ const TopoDS_Face& aFace = TopoDS::Face (aFaceIt.Current());
+ Handle(Poly_Triangulation) aTriangulation = StdPrs_ToolShadedShape::Triangulation (aFace, aLocation);
+ if (!aTriangulation.IsNull())
+ {
+ aNbPoints += aTriangulation->NbNodes();
+ }
+ }
+ if (aNbPoints < 3)
+ {
+ std::cout << "Error: shape should be triangulated!\n";
+ return 1;
+ }
+
+ anArrayPoints = new Graphic3d_ArrayOfPoints (aNbPoints, toRandColors, hasNormals);
+ for (TopExp_Explorer aFaceIt (aShape, TopAbs_FACE); aFaceIt.More(); aFaceIt.Next())
+ {
+ const TopoDS_Face& aFace = TopoDS::Face (aFaceIt.Current());
+ Handle(Poly_Triangulation) aTriangulation = StdPrs_ToolShadedShape::Triangulation (aFace, aLocation);
+ if (aTriangulation.IsNull())
+ {
+ continue;
+ }
+
+ const TColgp_Array1OfPnt& aNodes = aTriangulation->Nodes();
+ const gp_Trsf& aTrsf = aLocation.Transformation();
+
+ // extract normals from nodes
+ TColgp_Array1OfDir aNormals (aNodes.Lower(), hasNormals ? aNodes.Upper() : aNodes.Lower());
+ if (hasNormals)
+ {
+ Poly_Connect aPolyConnect (aTriangulation);
+ StdPrs_ToolShadedShape::Normal (aFace, aPolyConnect, aNormals);
+ }
+
+ for (Standard_Integer aNodeIter = aNodes.Lower(); aNodeIter <= aNodes.Upper(); ++aNodeIter)
+ {
+ gp_Pnt aPoint = aNodes (aNodeIter);
+ if (!aLocation.IsIdentity())
+ {
+ aPoint.Transform (aTrsf);
+ if (hasNormals)
+ {
+ aNormals (aNodeIter).Transform (aTrsf);
+ }
+ }
+
+ // add vertex into array of points
+ const Standard_Integer anIndexOfPoint = anArrayPoints->AddVertex (aPoint);
+ if (toRandColors)
+ {
+ Quantity_Color aColor (360.0 * Standard_Real(anIndexOfPoint) / Standard_Real(aNbPoints),
+ 1.0, 0.5, Quantity_TOC_HLS);
+ anArrayPoints->SetVertexColor (anIndexOfPoint, aColor);
+ }
+
+ if (hasNormals)
+ {
+ anArrayPoints->SetVertexNormal (anIndexOfPoint, aNormals (aNodeIter));
+ }
+ }
+ }
+ }
+ else if (aCmd == CloudSphere)
+ {
+ Standard_Real aCenterX = Draw::Atof (theArgs[2]);
+ Standard_Real aCenterY = Draw::Atof (theArgs[3]);
+ Standard_Real aCenterZ = Draw::Atof (theArgs[4]);
+ Standard_Real aRadius = Draw::Atof (theArgs[5]);
+ Standard_Integer aNbPoints = Draw::Atoi (theArgs[6]);
+
+ TCollection_AsciiString aDistribution = TCollection_AsciiString(theArgs[7]);
+ aDistribution.LowerCase();
+ if ( aDistribution != "surface" && aDistribution != "volume" )
+ {
+ std::cout << "Error: wrong arguments! See usage:\n";
+ theDI.PrintHelp (theArgs[0]);
+ return 1;
+ }
+ Standard_Boolean isSurface = aDistribution == "surface";
+
+ gp_Pnt aCenter(aCenterX, aCenterY, aCenterZ);
+
+ anArrayPoints = new Graphic3d_ArrayOfPoints (aNbPoints, toRandColors, hasNormals);
+ for (Standard_Integer aPntIt = 0; aPntIt < aNbPoints; ++aPntIt)
+ {
+ Standard_Real anAlpha = (Standard_Real (rand() % 2000) / 1000.0) * M_PI;
+ Standard_Real aBeta = (Standard_Real (rand() % 2000) / 1000.0) * M_PI;
+ Standard_Real aDistance = isSurface ?
+ aRadius : (Standard_Real (rand() % aNbPoints) / aNbPoints) * aRadius;
+
+ gp_Dir aDir (Cos (anAlpha) * Sin (aBeta),
+ Sin (anAlpha),
+ Cos (anAlpha) * Cos (aBeta));
+ gp_Pnt aPoint = aCenter.Translated (aDir.XYZ() * aDistance);
+
+ const Standard_Integer anIndexOfPoint = anArrayPoints->AddVertex (aPoint);
+ if (toRandColors)
+ {
+ Quantity_Color aColor (360.0 * Standard_Real (anIndexOfPoint) / Standard_Real (aNbPoints),
+ 1.0, 0.5, Quantity_TOC_HLS);
+ anArrayPoints->SetVertexColor (anIndexOfPoint, aColor);
+ }
+
+ if (hasNormals)
+ {
+ anArrayPoints->SetVertexNormal (anIndexOfPoint, aDir);
+ }
+ }
+ }
+
+ // set array of points in point cloud object
+ Handle(AIS_PointCloud) aPointCloud = new AIS_PointCloud();
+ aPointCloud->SetPoints (anArrayPoints);
+ VDisplayAISObject (aName, aPointCloud);
+ return 0;
+}
+
//=======================================================================
//function : ObjectsCommands
//purpose :
__FILE__,VDrawSphere,group);
theCommands.Add ("vsetlocation",
- "vsetlocation : name x y z; set new location for an interactive object",
+ "vsetlocation [-noupdate|-update] name x y z"
+ "\n\t\t: Set new location for an interactive object.",
__FILE__, VSetLocation, group);
theCommands.Add (
__FILE__,VDrawPArray,group);
theCommands.Add("vconnect",
- "vconnect : name Xo Yo Zo Xu Xv Xw Zu Zv Zw object1 object2 ... [color=NAME]",
+ "vconnect : assembly_name Xo Yo Zo object1 object2 ..."
+ " Makes an assembly of object instances located in point (Xo Yo Zo).",
__FILE__, VConnect, group);
- theCommands.Add("vconnectsh",
- "vconnectsh : name Xo Yo Zo Xu Xv Xw Zu Zv Zw shape1 shape2 ... [color=NAME]",
- __FILE__, VConnectShape, group);
+ theCommands.Add("vconnectto",
+ "vconnectto : instance_name Xo Yo Zo object"
+ " Makes an instance 'instance_name' of 'object' with position (Xo Yo Zo).",
+ __FILE__, VConnectTo,group);
+
+ theCommands.Add("vdisconnect",
+ "vdisconnect assembly_name (object_name | object_number | 'all')"
+ " Disconnects all objects from assembly or disconnects object by name or number (use vlistconnected to enumerate assembly children).",
+ __FILE__,VDisconnect,group);
+
+ theCommands.Add("vaddconnected",
+ "vaddconnected assembly_name object_name"
+ "Adds object to assembly.",
+ __FILE__,VAddConnected,group);
+
+ theCommands.Add("vlistconnected",
+ "vlistconnected assembly_name"
+ "Lists objects in assembly.",
+ __FILE__,VListConnected,group);
+
theCommands.Add("vselmode",
"vselmode : [object] mode_number is_turned_on=(1|0)\n"
"vvertexmode -set {isolated | all | inherited} - sets the default vertex draw mode and updates the mode for all displayed objects\n"
"vvertexmode -set {isolated | all | inherited} name1 name2 ... - sets the vertex draw mode for the specified object(s)\n",
__FILE__, VVertexMode, group);
+
+ theCommands.Add ("vpointcloud",
+ "vpointcloud name shape [-randColor] [-normals] [-noNormals]"
+ "\n\t\t: Create an interactive object for arbitary set of points"
+ "\n\t\t: from triangulated shape."
+ "\n"
+ "vpointcloud name x y z r npts {surface|volume}\n"
+ " ... [-randColor] [-normals] [-noNormals]"
+ "\n\t\t: Create arbitrary set of points (npts) randomly distributed"
+ "\n\t\t: on spheric surface or within spheric volume (x y z r)."
+ "\n\t\t:"
+ "\n\t\t: Additional options:"
+ "\n\t\t: -randColor - generate random color per point"
+ "\n\t\t: -normals - generate normal per point (default)"
+ "\n\t\t: -noNormals - do not generate normal per point"
+ "\n",
+ __FILE__, VPointCloud, group);
}