diff --git a/.gitignore b/.gitignore index f9d7409..4fe2d24 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,5 @@ ENV/ # blender backup files *.blend1 +install_plugin_cad.sh +.vscode \ No newline at end of file diff --git a/cg/freecad/Frames/Frames.py b/cg/freecad/Frames/Frames.py index 4470dc6..4b8ccd4 100644 --- a/cg/freecad/Frames/Frames.py +++ b/cg/freecad/Frames/Frames.py @@ -13,6 +13,8 @@ # License along with this library. If not, see . import FreeCAD import Tools +from usecases.asm4parser_usecase import Asm4StructureParseUseCase + if FreeCAD.GuiUp: import FreeCADGui from pivy import coin @@ -309,7 +311,11 @@ Tools.spawnClassCommand("FrameCommand", {"Pixmap": str(os.path.join(icondir, "frame.svg")), "MenuText": "Make a free frame", "ToolTip": "Make a freestanding reference frame."}) - +Tools.spawnClassCommand("ASM4StructureParsing", + Asm4StructureParseUseCase().initParse, + {"Pixmap": str(os.path.join(icondir, "assembly4.svg")), + "MenuText": "Make a ASM4 parsing", + "ToolTip": "Make a ASM4 1"}) Tools.spawnClassCommand("SelectedPartFrameCommand", makeSelectedPartFrames, {"Pixmap": str(os.path.join(icondir, "partframe.svg")), diff --git a/cg/freecad/Frames/InitGui.py b/cg/freecad/Frames/InitGui.py index c62b8e5..bd7b0d9 100644 --- a/cg/freecad/Frames/InitGui.py +++ b/cg/freecad/Frames/InitGui.py @@ -37,6 +37,7 @@ class Frames(Workbench): import Frames self.framecommands = [ "FrameCommand", + "ASM4StructureParsing", "SelectedPartFrameCommand", "AllPartFramesCommand", "FeatureFrameCommand" diff --git a/cg/freecad/Frames/UI/icons/assembly4.svg b/cg/freecad/Frames/UI/icons/assembly4.svg new file mode 100644 index 0000000..ed78093 --- /dev/null +++ b/cg/freecad/Frames/UI/icons/assembly4.svg @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + Path-Stock + 2015-07-04 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Path/Gui/Resources/icons/Path-Stock.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cg/freecad/Frames/cad_parts_adjacency_matrix.py b/cg/freecad/Frames/cad_parts_adjacency_matrix.py deleted file mode 100644 index b654b26..0000000 --- a/cg/freecad/Frames/cad_parts_adjacency_matrix.py +++ /dev/null @@ -1,142 +0,0 @@ -import FreeCAD as App -import uuid - -collision_squares_labels = [] - -meshCoordinates = [] -detailSquares = {} - -class ClearWorkSpaceDocument(object): - def call(self): - for key in detailSquares: - for renderPrimitive in detailSquares[key]: - primitivePart = App.ActiveDocument.getObjectsByLabel(renderPrimitive.cadLabel)[0] - App.ActiveDocument.removeObject(primitivePart.Name) - - -class MeshGeometryCoordinateModel(object): - - def __init__(self, x, y, z, label,): - self.x = x - self.y = y - self.z = z - self.label = label - self.cadLabel = '' - - def initializePrimitivesByCoordinate(self): - uuidDoc = str(uuid.uuid1()) - App.ActiveDocument.addObject("Part::Box", "Box") - App.ActiveDocument.ActiveObject.Label = uuidDoc - App.ActiveDocument.recompute() - part = App.ActiveDocument.getObjectsByLabel(uuidDoc)[0] - collision_squares_labels.append(uuidDoc) - part.Width = 2 - part.Height = 2 - part.Length = 2 - part.Placement = App.Placement( - App.Vector(self.x - 1, self.y - 1, self.z - 1), - App.Rotation(App.Vector(0.00, 0.00, 1.00), 0.00)) - if(detailSquares.get(self.label) is None): - detailSquares[self.label] = [] - detailSquares[self.label].append(self) - self.cadLabel = uuidDoc - App.ActiveDocument.recompute() - - - -class FreeCadMetaModel(object): - - def __init__(self, label, vertex) -> None: - self.label = label - self.vertex = vertex - -class InitPartsParseUseCase(): - - def call(self) -> list[FreeCadMetaModel]: - product_details = [] - for part in App.ActiveDocument.Objects: - if part is not None: - model = FreeCadMetaModel(part.Label,part.Shape.Vertexes) - if(model is not None): - product_details.append(model) - return product_details - - - -class GetCollisionAtPrimitives(object): - - def call(self,freeCadMetaModels: list[FreeCadMetaModel] ): - for model in freeCadMetaModels: - activePart = App.ActiveDocument.getObjectsByLabel(model.label)[0] - for key in detailSquares: - if(model.label != key): - for renderPrimitive in detailSquares[key]: - primitivePart = App.ActiveDocument.getObjectsByLabel(renderPrimitive.cadLabel)[0] - collisionResult:int = int(activePart.Shape.distToShape(primitivePart.Shape)[0]) - # print(collisionResult) - if(collisionResult == 0): - print(model.label+ ' ' + renderPrimitive.label) - - - - -class GetPartPrimitiveCoordinatesUseCase(object): - - def call(self,freeCadMetaModels: list[FreeCadMetaModel]) -> list[MeshGeometryCoordinateModel]: - meshCoordinates:list[MeshGeometryCoordinateModel] = [] - for model in freeCadMetaModels: - vertexesDetail = model.vertex - labelDetail = model.label - for coords in vertexesDetail: - detailVertex = MeshGeometryCoordinateModel( - coords.X, - coords.Y, - coords.Z, - labelDetail, - ) - meshCoordinates.append(detailVertex) - - return meshCoordinates - -class RenderPrimitiveUseCase(object): - - def call(self,meshModels :list[MeshGeometryCoordinateModel]) -> None: - for mesh in meshModels: - mesh.initializePrimitivesByCoordinate() - -class RenderPrimitivesScenario(object): - - def __init__( - self, - initPartsParseUseCase: InitPartsParseUseCase, - getPartPrimitiveCoordinatesUseCase:GetPartPrimitiveCoordinatesUseCase, - renderPrimitiveUseCase:RenderPrimitiveUseCase, - getCollisionAtPrimitives:GetCollisionAtPrimitives, - clearWorkSpaceDocument:ClearWorkSpaceDocument, - ) -> None: - self.initPartsParseUseCase = initPartsParseUseCase - self.getPartPrimitiveCoordinatesUseCase = getPartPrimitiveCoordinatesUseCase - self.renderPrimitiveUseCase = renderPrimitiveUseCase - self.getCollisionAtPrimitives = getCollisionAtPrimitives - self.clearWorkSpaceDocument = clearWorkSpaceDocument - - def call(self) -> None: - parts = self.initPartsParseUseCase.call() - meshCoordinates = self.getPartPrimitiveCoordinatesUseCase.call(parts) - self.renderPrimitiveUseCase.call(meshCoordinates) - self.getCollisionAtPrimitives.call(parts) - self.clearWorkSpaceDocument.call() - - - -def main() -> None: - RenderPrimitivesScenario( - InitPartsParseUseCase(), - GetPartPrimitiveCoordinatesUseCase(), - RenderPrimitiveUseCase(), - GetCollisionAtPrimitives(), - ClearWorkSpaceDocument(), - ).call() - - -main() diff --git a/cg/freecad/Frames/usecases/asm4parser_usecase.py b/cg/freecad/Frames/usecases/asm4parser_usecase.py new file mode 100644 index 0000000..f732d1b --- /dev/null +++ b/cg/freecad/Frames/usecases/asm4parser_usecase.py @@ -0,0 +1,53 @@ +import FreeCAD as App + +class Asm4StructureParseUseCase: + _parts = [] + _label = [] + + def getSubPartsLabel(self, group): + groupLabel = [] + for el in group: + if str(el) == '': + groupLabel.append(el.Label) + return groupLabel + + def parseLabel(self, nextGroup, label, level=2, nextGroupParse=0): + if nextGroup.__len__() == nextGroupParse: + return + else: + groupParts = [] + + for el in nextGroup: + if str(el) == '': + groupParts.append(el) + + for el in groupParts: + if str(el) == '': + label.append({ + "level": level, + "attachedTo": el.AttachedTo.split('#'), + "label": el.Label, + "axis": self.getSubPartsLabel(el.Group) + }) + + def initParse(self): + + model = App.ActiveDocument.RootObjects[1] + self._label.append({ + "level": 1, + "attachedTo": "Parent Assembly", + "label": model.Label, + "axis": self.getSubPartsLabel(model.Group) + }) + for parent in model.Group: + if str(parent) == '': + self._label.append({ + "level": 1, + "attachedTo": parent.AttachedTo.split('#'), + "label": parent.Label, + "axis": self.getSubPartsLabel(parent.Group) + }) + print(self._label) + + + \ No newline at end of file