From: sbh Date: Mon, 22 Dec 2014 13:57:54 +0000 (+0300) Subject: ConnectorPlugin to export shapes to GEOM X-Git-Tag: V_0.7.0_rc1~57^2~1 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=1e331e45cee661c73461f09a8114aaba62c8d9b4;p=modules%2Fshaper.git ConnectorPlugin to export shapes to GEOM --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d1120f84..ede88ffa0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/env_Salome.bat b/env_Salome.bat index ffad9939b..ca536a797 100644 --- a/env_Salome.bat +++ b/env_Salome.bat @@ -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 diff --git a/msvc10_env.bat b/msvc10_env.bat index af025a994..5822d7468 100644 --- a/msvc10_env.bat +++ b/msvc10_env.bat @@ -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% diff --git a/src/Config/Config_Common.cpp b/src/Config/Config_Common.cpp index e0837036e..634a4337f 100644 --- a/src/Config/Config_Common.cpp +++ b/src/Config/Config_Common.cpp @@ -20,6 +20,8 @@ bool isElementNode(xmlNodePtr theNode) { + if (!theNode) + return false; return theNode->type == XML_ELEMENT_NODE; } diff --git a/src/Config/Config_WidgetAPI.cpp b/src/Config/Config_WidgetAPI.cpp index 994a46f99..bcf543bd1 100644 --- a/src/Config/Config_WidgetAPI.cpp +++ b/src/Config/Config_WidgetAPI.cpp @@ -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; } diff --git a/src/Config/plugins.xml b/src/Config/plugins.xml index c763eb5bc..00f45dba9 100644 --- a/src/Config/plugins.xml +++ b/src/Config/plugins.xml @@ -6,6 +6,7 @@ + diff --git a/src/ConnectorPlugin/CMakeLists.txt b/src/ConnectorPlugin/CMakeLists.txt new file mode 100644 index 000000000..9aafdea5a --- /dev/null +++ b/src/ConnectorPlugin/CMakeLists.txt @@ -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 index 000000000..b532bbd7c --- /dev/null +++ b/src/ConnectorPlugin/ConnectorPlugin.py @@ -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 index 000000000..953b31c37 --- /dev/null +++ b/src/ConnectorPlugin/ConnectorPlugin_ExportFeature.py @@ -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 index 000000000..7eb0a68b8 --- /dev/null +++ b/src/ConnectorPlugin/ExtrusionToMesh.py @@ -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 index 000000000..93b3977c3 --- /dev/null +++ b/src/ConnectorPlugin/plugin-Connector.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file