Salome HOME
ConnectorPlugin to export shapes to GEOM
authorsbh <sergey.belash@opencascade.com>
Mon, 22 Dec 2014 13:57:54 +0000 (16:57 +0300)
committersbh <sergey.belash@opencascade.com>
Mon, 22 Dec 2014 13:57:54 +0000 (16:57 +0300)
CMakeLists.txt
env_Salome.bat
msvc10_env.bat
src/Config/Config_Common.cpp
src/Config/Config_WidgetAPI.cpp
src/Config/plugins.xml
src/ConnectorPlugin/CMakeLists.txt [new file with mode: 0644]
src/ConnectorPlugin/ConnectorPlugin.py [new file with mode: 0644]
src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py [new file with mode: 0644]
src/ConnectorPlugin/ExtrusionToMesh.py [new file with mode: 0644]
src/ConnectorPlugin/plugin-Connector.xml [new file with mode: 0644]

index 1d1120f84a40d7c0abae8c6ef2db6be0075ab990..ede88ffa09ce6e2d7aed432ad68b6900ffb11a9b 100644 (file)
@@ -60,6 +60,8 @@ ADD_SUBDIRECTORY (src/XGUI)
 ADD_SUBDIRECTORY (src/GeomApp)
 ADD_SUBDIRECTORY (src/ExchangePlugin)
 ADD_SUBDIRECTORY (src/GeomValidators)
+ADD_SUBDIRECTORY (src/ConnectorPlugin)
+
 
 IF(${HAVE_SALOME})
        ADD_SUBDIRECTORY (src/NewGeom)
index ffad9939b00fed2da1f8575426baac8882dc0011..ca536a79758326adca659951c46e9dcb837bdf85 100644 (file)
@@ -90,7 +90,7 @@ IF "%ARCH%" == "Win64" (
 
 @SET NEW_GEOM_CONFIG_FILE=%ROOT_DIR%\install\plugins
 @SET PATH=%ROOT_DIR%\install\plugins;%ROOT_DIR%\install\bin;%PATH%
-@SET PYTHONPATH=%ROOT_DIR%\install\swig;%PYTHONPATH%
+@SET PYTHONPATH=%ROOT_DIR%\install\swig;%ROOT_DIR%\install\plugins;%PYTHONPATH%
 
 @SET LightAppConfig=%ROOT_DIR%\install\share\salome\resources\newgeom;%GUI_ROOT_DIR%\share\salome\resources\gui
 @SET NewGeomResources=%ROOT_DIR%\install\resources
index af025a994176940fb1f8cb967675c043393e3c23..5822d74684ba99233c2f0178300f2b4c5faf481b 100644 (file)
@@ -81,7 +81,7 @@ set PATH=%CMAKEDIR%\bin;%PATH%
 @REM -------------------------
 @REM QT
 @SET QTDIR=%PDIR%\qt-4.8.4
-@ECHO -- Creating qt.conf... 
+@ECHO -- Creating qt.conf... in %QTDIR%
 @ECHO [Paths] > %QTDIR%/bin/qt.conf
 @ECHO Prefix = %QTDIR:\=/% >> %QTDIR%/bin/qt.conf
 @SET PATH=%QTDIR%\bin;%PATH%
index e0837036eb71d200a1a40581e3a98ad3854dfcba..634a4337ff73b7c0eb0c92d9eedf9581eece9798 100644 (file)
@@ -20,6 +20,8 @@
 \r
 bool isElementNode(xmlNodePtr theNode)\r
 {\r
+  if (!theNode)\r
+    return false;\r
   return theNode->type == XML_ELEMENT_NODE;\r
 }\r
 \r
index 994a46f99c9a300205331c5c5d1c85389e964535..bcf543bd17e21d93e81cfa832545a3672d594d8c 100644 (file)
@@ -47,10 +47,10 @@ bool Config_WidgetAPI::toChildWidget()
 {
   if (myCurrentNode && hasChild(myCurrentNode)) {
     myCurrentNode = myCurrentNode->children;
-    while (!isElementNode(myCurrentNode)) {
+    while (myCurrentNode && !isElementNode(myCurrentNode)) {
       myCurrentNode = myCurrentNode->next;
     }
-    return true;
+    return myCurrentNode != NULL;
   }
   return false;
 }
index c763eb5bc6dd8dbf903917f96fa80c54292b9b7f..00f45dba9e9c5d1a49d53e88c56292926a490c36 100644 (file)
@@ -6,6 +6,7 @@
   <plugin library="ConstructionPlugin" configuration="plugin-Construction.xml"/>
   <plugin library="FeaturesPlugin" configuration="plugin-Features.xml"/>
   <plugin library="ExchangePlugin" configuration="plugin-Exchange.xml"/>
+  <plugin script="ConnectorPlugin" configuration="plugin-Connector.xml"/>
   <plugin library="SketchSolver"/>
   <plugin library="GeomValidators"/>
   <plugin library="DFBrowser" internal="true"/>
diff --git a/src/ConnectorPlugin/CMakeLists.txt b/src/ConnectorPlugin/CMakeLists.txt
new file mode 100644 (file)
index 0000000..9aafdea
--- /dev/null
@@ -0,0 +1,14 @@
+INCLUDE(Common)
+
+SET(PYTHON_FILES
+    ConnectorPlugin.py
+    ConnectorPlugin_ExportFeature.py
+)
+
+SET(XML_RESSOURCES
+  plugin-Connector.xml
+)
+
+ADD_CUSTOM_TARGET(ConnectorPlugin SOURCES ${PYTHON_FILES} ${XML_RESSOURCES})
+
+INSTALL(FILES ${PYTHON_FILES} ${XML_RESSOURCES} DESTINATION plugins)
diff --git a/src/ConnectorPlugin/ConnectorPlugin.py b/src/ConnectorPlugin/ConnectorPlugin.py
new file mode 100644 (file)
index 0000000..b532bbd
--- /dev/null
@@ -0,0 +1,25 @@
+"""
+Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+"""
+
+import ModelAPI
+
+from ConnectorPlugin_ExportFeature import ExportFeature
+
+
+class ConnectorPlugin(ModelAPI.ModelAPI_Plugin):
+
+    def __init__(self):
+        ModelAPI.ModelAPI_Plugin.__init__(self)
+        pass
+
+    def createFeature(self, theFeatureID):
+        if theFeatureID == ExportFeature.ID():
+            return ExportFeature().__disown__()
+        else:
+            print "ConnectorPlugin: No such feature %s" % theFeatureID
+
+plugin = ConnectorPlugin()
+aSession = ModelAPI.ModelAPI_Session.get()
+print "Module loaded. Session", aSession
+aSession.registerPlugin(plugin)
diff --git a/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py b/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py
new file mode 100644 (file)
index 0000000..953b31c
--- /dev/null
@@ -0,0 +1,67 @@
+"""
+Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+"""
+
+import ModelAPI
+import salome
+from salome.geom import geomBuilder
+
+
+class ExportFeature(ModelAPI.ModelAPI_Feature):
+
+    "Feature to create a box by drawing a sketch and extruding it"
+
+    def __init__(self):
+        ModelAPI.ModelAPI_Feature.__init__(self)
+
+    @staticmethod
+    def ID():
+        return "ExportToGEOM"
+
+    def getKind(self):
+        return ExportFeature.ID()
+
+    # This feature is action: has no property pannel and executes immideately
+    def isAction(self):
+        return True
+
+    def initAttributes(self):
+        # This feature has no attributes, but should perfore some actions on initialization
+        aSession = ModelAPI.ModelAPI_Session.get()
+        aPart = aSession.activeDocument()
+        # Get all bodies
+        kResultBodyType = "ResultBody"
+        aPartSize = aPart.size(kResultBodyType)
+        if aPartSize == 0:
+            print "No results in the active document"
+            return
+
+        aResultList = [aPart.object(kResultBodyType, idx) for idx in xrange(aPartSize)]
+        for idx, aResult in enumerate(aResultList):
+            aBodyResult = modelAPI_ResultBody(aResult)
+            if not aBodyResult:
+                continue
+            aShape = aBodyResult.shape()
+            aDump = aShape.getShapeStream()
+            # Load shape to SALOME Geom
+            geompy = geomBuilder.New(salome.myStudy)
+            aBrep = geompy.RestoreShape(aDump)
+            geompy.addToStudy(aBrep, "NewGeomShape_{0}".format(idx))
+
+    def execute(self):
+        # Nothing to execute: all logic would be in the initAttributes
+        pass
+
+# TEST
+"""
+if __name__=='__main__':
+  session = ModelAPI.ModelAPI_Session.get()
+  part = session.activeDocument()
+  session.startOperation()
+  feature = part.addFeature('Box')
+  feature.real('box_width').setValue(10)
+  feature.real('box_length').setValue(10)
+  feature.real('box_height').setValue(10)
+  feature.execute()
+  session.finishOperation()
+"""
diff --git a/src/ConnectorPlugin/ExtrusionToMesh.py b/src/ConnectorPlugin/ExtrusionToMesh.py
new file mode 100644 (file)
index 0000000..7eb0a68
--- /dev/null
@@ -0,0 +1,92 @@
+#=========================================================================
+# Creation of the circular Sketch, then Extrusion (cylinder), 
+# then export to the old GEOM and usage of SMESH for meshing.
+# Based on SALOME 7.4.0 and NewGEOM version: master 18Dec2014.
+#=========================================================================
+from ModelAPI import *
+from GeomDataAPI import *
+from GeomAlgoAPI import *
+from GeomAPI import *
+
+aSession = ModelAPI_Session.get()
+aDocument = aSession.moduleDocument()
+
+# Create a part for extrusion
+aSession.startOperation()
+aPartFeature = aDocument.addFeature("Part")
+aSession.finishOperation()
+
+aPartResult = modelAPI_ResultPart(aPartFeature.firstResult())
+aPart = aPartResult.partDoc()
+
+#=========================================================================
+# Create a sketch circle to extrude
+#=========================================================================
+aSession.startOperation()
+aSketchFeature = modelAPI_CompositeFeature(aPart.addFeature("Sketch"))
+origin = geomDataAPI_Point(aSketchFeature.attribute("Origin"))
+origin.setValue(0, 0, 0)
+dirx = geomDataAPI_Dir(aSketchFeature.attribute("DirX"))
+dirx.setValue(1, 0, 0)
+diry = geomDataAPI_Dir(aSketchFeature.attribute("DirY"))
+diry.setValue(0, 1, 0)
+norm = geomDataAPI_Dir(aSketchFeature.attribute("Norm"))
+norm.setValue(0, 0, 1)
+# Create circle
+aSketchCircle = aSketchFeature.addFeature("SketchCircle")
+anCircleCentr = geomDataAPI_Point2D(aSketchCircle.attribute("CircleCenter"))
+aCircleRadius = aSketchCircle.real("CircleRadius")
+anCircleCentr.setValue(50., 50)
+aCircleRadius.setValue(20.)
+aSession.finishOperation()
+
+#=========================================================================
+# Make extrusion on circle
+#=========================================================================
+# Build shape from sketcher results
+aSketchResult = aSketchFeature.firstResult()
+aSketchEdges = modelAPI_ResultConstruction(aSketchResult).shape()
+origin = geomDataAPI_Point(aSketchFeature.attribute("Origin")).pnt()
+dirX = geomDataAPI_Dir(aSketchFeature.attribute("DirX")).dir()
+dirY = geomDataAPI_Dir(aSketchFeature.attribute("DirY")).dir()
+norm = geomDataAPI_Dir(aSketchFeature.attribute("Norm")).dir()
+aSketchFaces = ShapeList()
+GeomAlgoAPI_SketchBuilder.createFaces(
+    origin, dirX, dirY, norm, aSketchEdges, aSketchFaces)
+
+# Create extrusion
+anExtrusionFt = aPart.addFeature("Extrusion")
+anExtrusionFt.selection("extrusion_face").setValue(
+    aSketchResult, aSketchFaces[0])
+anExtrusionFt.real("extrusion_size").setValue(50)
+anExtrusionFt.boolean("extrusion_reverse").setValue(False)
+anExtrusionFt.execute()
+aSession.finishOperation()
+
+# Check extrusion results
+anExtrusionResult = modelAPI_ResultBody(anExtrusionFt.firstResult())
+
+#==================================================
+# Transfer shape to Geom module of Salome
+#==================================================
+aShape = anExtrusionResult.shape()
+aDump = aShape.getShapeStream()
+
+# Load shape to SALOME Geom
+import salome
+from salome.geom import geomBuilder
+geompy = geomBuilder.New(salome.myStudy)
+aBrep = geompy.RestoreShape(aDump)
+geompy.addToStudy(aBrep, "NewGeomShape")
+
+# Meshing of the Shape
+from salome.smesh import smeshBuilder
+meshpy = smeshBuilder.New(salome.myStudy)
+aMesh = meshpy.Mesh(aBrep)
+Regular_1D = aMesh.Segment()
+Max_Size_1 = Regular_1D.MaxSize(5)
+MEFISTO_2D = aMesh.Triangle(algo=smeshBuilder.MEFISTO)
+isDone = aMesh.Compute()
+assert (isDone)
+meshpy.SetName(aMesh.GetMesh(), 'NewGeomMesh')
+
diff --git a/src/ConnectorPlugin/plugin-Connector.xml b/src/ConnectorPlugin/plugin-Connector.xml
new file mode 100644 (file)
index 0000000..93b3977
--- /dev/null
@@ -0,0 +1,12 @@
+<plugin>
+  <workbench id="Features" document="Part">
+    <group id="Exchange">
+      <feature
+        id="ExportToGEOM"
+        title="Export to GEOM"
+        tooltip="Exports all data in GEOM compatible format"
+        icon=":pictures/part_ico.png">
+      </feature>
+    </group>
+  </workbench>
+</plugin>
\ No newline at end of file