From afcd50d8c5bc530f34f014460976ff56d1ef8769 Mon Sep 17 00:00:00 2001 From: adrianarce-elemwave Date: Tue, 30 Sep 2025 15:39:39 +0200 Subject: [PATCH 1/6] Change ShapeClassification to check for json data --- src/ShapesClassification.py | 70 +++- src/mesher.py | 3 +- test/test_ShapesClassification.py | 86 +++++ test/test_mesher.py | 5 + ...electricShieldedPair.20250930-134420.FCBak | Bin 0 -> 9334 bytes .../DielectricShieldedPair.FCStd | Bin 0 -> 13624 bytes .../DielectricShieldedPair.json | 36 ++ .../DielectricShieldedPair.step | 352 ++++++++++++++++++ .../DielectricUnshieldedPair.FCStd | Bin 0 -> 13624 bytes .../DielectricUnshieldedPair.json | 30 ++ .../DielectricUnshieldedPair.step | 287 ++++++++++++++ .../partially_filled_coax.json | 23 ++ 12 files changed, 872 insertions(+), 20 deletions(-) create mode 100644 test/test_ShapesClassification.py create mode 100644 testData/DielectricShieldedPair/DielectricShieldedPair.20250930-134420.FCBak create mode 100644 testData/DielectricShieldedPair/DielectricShieldedPair.FCStd create mode 100644 testData/DielectricShieldedPair/DielectricShieldedPair.json create mode 100644 testData/DielectricShieldedPair/DielectricShieldedPair.step create mode 100644 testData/DielectricUnshieldedPair/DielectricUnshieldedPair.FCStd create mode 100644 testData/DielectricUnshieldedPair/DielectricUnshieldedPair.json create mode 100644 testData/DielectricUnshieldedPair/DielectricUnshieldedPair.step create mode 100644 testData/partially_filled_coax/partially_filled_coax.json diff --git a/src/ShapesClassification.py b/src/ShapesClassification.py index 8bef68a..b8edaae 100644 --- a/src/ShapesClassification.py +++ b/src/ShapesClassification.py @@ -1,3 +1,5 @@ +from enum import Enum +import json from typing import Any, Tuple, List, Dict import gmsh @@ -7,21 +9,25 @@ class ShapesClassification: isOpenCase:bool + crossSectionData: Dict + pecs: Dict + dielectrics: Dict - def __init__(self, shapes): + def __init__(self, shapes, jsonFile:str): gmsh.model.occ.synchronize() self.allShapes = shapes - self.pecs = self.get_surfaces_with_label(shapes, "Conductor_") - self.dielectrics = self.get_surfaces_with_label(shapes, "Dielectric_") - self.open = self.get_surfaces_with_label(shapes, "OpenBoundary_") + with open(jsonFile) as f: + jsonData = json.load(f) + self.crossSectionData = jsonData['CrossSection'] + self.pecs = self.get_pecs(shapes) + self.dielectrics = self.get_dielectrics(shapes) + self.shieldReference = dict() self.vacuum = dict() self.isOpenCase = self.isOpenProblem() - if len(self.open) > 1: - raise ValueError("Only one open region is allowed.") @staticmethod def getNumberFromName(entity_name: str, label: str): @@ -29,22 +35,43 @@ def getNumberFromName(entity_name: str, label: str): num = int(entity_name[ini:]) return num - @staticmethod - def get_surfaces_with_label(entity_tags, label: str): - surfaces = dict() + def get_pecs(self, entity_tags): + pecNames = self.__getGeometryNamesByMaterialType('PEC') + pecs = dict() for s in entity_tags: - name = gmsh.model.get_entity_name(*s) - if s[0] != 2 or label not in name: + name = gmsh.model.get_entity_name(*s).split('/')[-1] + if s[0] != 2 or name not in pecNames: continue - num = ShapesClassification.getNumberFromName(name, label) - surfaces[num] = [s] + pecs[name] = [s] - return surfaces + return pecs + + def get_dielectrics(self, entity_tags): + dielectricNames = self.__getGeometryNamesByMaterialType('Dielectric') + dielectrics = dict() + for s in entity_tags: + name = gmsh.model.get_entity_name(*s).split('/')[-1] + if s[0] != 2 or name not in dielectricNames: + continue + dielectrics[name] = [s] + + return dielectrics + + def __getGeometryNamesByMaterialType(self, materialType:str) -> List[str]: + names = [ + geometry['name'] + for geometry in self.crossSectionData + if geometry['material']['type'] == materialType + ] + return names def isOpenProblem(self): elements = list(chain(self.pecs.values())) + isOpenCase = True for idx, element in enumerate(elements): - for otheridx, otherElement in enumerate(elements[idx+1:]): + intersectWithAll = True + intersect = [] + for otheridx, otherElement in enumerate(elements): if element != otherElement: intersect = gmsh.model.occ.intersect( element, @@ -52,10 +79,15 @@ def isOpenProblem(self): removeObject=False, tag=300+otheridx, removeTool=False - )[0] - if intersect: - return False - return True + )[0] + if len(intersect) == 0: + intersectWithAll = False + else: + isOpenCase = False + if intersectWithAll: + print(element, otherElement) + self.shieldReference = {list(self.pecs.keys())[idx] : element} + return isOpenCase def removeConductorsFromDielectrics(self): for num, diel in self.dielectrics.items(): diff --git a/src/mesher.py b/src/mesher.py index 53702be..38823e1 100644 --- a/src/mesher.py +++ b/src/mesher.py @@ -46,7 +46,8 @@ def meshFromStep(self, inputFile: str, caseName: str, meshingOptions=None): gmsh.model.add(caseName) allShapes = ShapesClassification( - gmsh.model.occ.importShapes(inputFile, highestDimOnly=False) + gmsh.model.occ.importShapes(inputFile, highestDimOnly=False), + inputFile.strip('.step') + '.json' ) # --- Geometry manipulation --- diff --git a/test/test_ShapesClassification.py b/test/test_ShapesClassification.py new file mode 100644 index 0000000..274d699 --- /dev/null +++ b/test/test_ShapesClassification.py @@ -0,0 +1,86 @@ +import os +import unittest +import gmsh +import json + +from src.ShapesClassification import ShapesClassification + + +class TestShapesClassification(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.dirPath = os.path.dirname(os.path.realpath(__file__)) + '/' + cls.testdataPath = cls.dirPath + '/../testData/' + + @classmethod + def tearDownClass(cls): + del cls.dirPath + del cls.testdataPath + + def setUp(self): + gmsh.initialize() + + def tearDown(self): + gmsh.finalize() + + def inputFileFromCaseName(self, caseName): + return self.testdataPath + caseName + '/' + caseName + ".step" + + def initShapeClassification(self, inputFile:str) -> None: + jsonFile = inputFile.strip('.step') + '.json' + self.shapeClassification = ShapesClassification( + gmsh.model.occ.importShapes(inputFile, highestDimOnly=False), + jsonFile + ) + + def testDielectricShieldedPairClassification(self) -> None: + case = 'DielectricShieldedPair' + filepath = self.inputFileFromCaseName(case) + self.initShapeClassification(filepath) + expectedShapes = [ + (2, 1),(2, 2),(2, 3),(2, 4),(2, 5), + (1, 1),(1, 2),(1, 3),(1, 4),(1, 5), + (0, 1),(0, 1),(0, 2),(0, 2),(0, 3),(0, 3),(0, 4),(0, 4),(0, 5),(0, 5) + ] + expectedPecs = { + 'RightConductor': [(2,1)], + 'ExternalShield': [(2,2)], + 'LeftConductor': [(2,3)], + } + expectedDielectrics = { + 'RightDielectric': [(2,4)], + 'LeftDielectric': [(2,5)], + } + expectedShieldReference = { + 'ExternalShield': [(2,2)], + } + self.assertListEqual(self.shapeClassification.allShapes, expectedShapes) + self.assertDictEqual(self.shapeClassification.pecs, expectedPecs) + self.assertDictEqual(self.shapeClassification.dielectrics, expectedDielectrics) + self.assertDictEqual(self.shapeClassification.shieldReference, expectedShieldReference) + self.assertFalse(self.shapeClassification.isOpenCase) + + def testDielectricUnshieldedPairClassification(self) -> None: + case = 'DielectricUnshieldedPair' + filepath = self.inputFileFromCaseName(case) + self.initShapeClassification(filepath) + expectedShapes = [ + (2, 1),(2, 2),(2, 3),(2, 4), + (1, 1),(1, 2),(1, 3),(1, 4), + (0, 1),(0, 1),(0, 2),(0, 2),(0, 3),(0, 3),(0, 4),(0, 4), + ] + expectedPecs = { + 'RightConductor': [(2,1)], + 'LeftConductor': [(2,2)], + } + expectedDielectrics = { + 'RightDielectric': [(2,3)], + 'LeftDielectric': [(2,4)], + } + expectedShieldReference = {} + self.assertListEqual(self.shapeClassification.allShapes, expectedShapes) + self.assertDictEqual(self.shapeClassification.pecs, expectedPecs) + self.assertDictEqual(self.shapeClassification.dielectrics, expectedDielectrics) + self.assertDictEqual(self.shapeClassification.shieldReference, expectedShieldReference) + self.assertTrue(self.shapeClassification.isOpenCase) \ No newline at end of file diff --git a/test/test_mesher.py b/test/test_mesher.py index 46eddbd..5fe7e29 100644 --- a/test/test_mesher.py +++ b/test/test_mesher.py @@ -19,6 +19,11 @@ def setUpClass(cls): cls.dirPath = os.path.dirname(os.path.realpath(__file__)) + '/' cls.testdataPath = cls.dirPath + '/../testData/' + @classmethod + def tearDownClass(cls): + del cls.dirPath + del cls.testdataPath + def setUp(self): gmsh.initialize() diff --git a/testData/DielectricShieldedPair/DielectricShieldedPair.20250930-134420.FCBak b/testData/DielectricShieldedPair/DielectricShieldedPair.20250930-134420.FCBak new file mode 100644 index 0000000000000000000000000000000000000000..489768915d29707a5941035f9eaef15b81086fe0 GIT binary patch literal 9334 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 Date: Wed, 1 Oct 2025 18:02:37 +0200 Subject: [PATCH 2/6] Added graph for pecs in Shape Classification --- src/Graph.py | 95 ++++ src/ShapesClassification.py | 67 +-- test/test_ShapesClassification.py | 23 +- test/test_graph.py | 88 ++++ testData/ComplexNesting/ComplexNesting.FCStd | Bin 0 -> 22489 bytes testData/ComplexNesting/ComplexNesting.json | 46 ++ testData/ComplexNesting/ComplexNesting.step | 458 ++++++++++++++++++ .../FusedConductor.20250930-153234.FCBak | Bin 0 -> 13624 bytes testData/FusedConductor/FusedConductor.FCStd | Bin 0 -> 14512 bytes testData/FusedConductor/FusedConductor.json | 40 ++ testData/FusedConductor/FusedConductor.step | 401 +++++++++++++++ 11 files changed, 1181 insertions(+), 37 deletions(-) create mode 100644 src/Graph.py create mode 100644 test/test_graph.py create mode 100644 testData/ComplexNesting/ComplexNesting.FCStd create mode 100644 testData/ComplexNesting/ComplexNesting.json create mode 100644 testData/ComplexNesting/ComplexNesting.step create mode 100644 testData/FusedConductor/FusedConductor.20250930-153234.FCBak create mode 100644 testData/FusedConductor/FusedConductor.FCStd create mode 100644 testData/FusedConductor/FusedConductor.json create mode 100644 testData/FusedConductor/FusedConductor.step diff --git a/src/Graph.py b/src/Graph.py new file mode 100644 index 0000000..7354dd8 --- /dev/null +++ b/src/Graph.py @@ -0,0 +1,95 @@ +from typing import List, Tuple + +class Graph: + def __init__(self): + self._nodes:List = [] + self._edges:List[Tuple] = [] + + @property + def roots(self) -> List: + roots:List = [] + for node in self._nodes: + isChild = False + for edge in self._edges: + if edge[-1] == node: + isChild = True + continue + if isChild == False: + roots.append(node) + return roots.copy() + + @property + def nodes(self) -> List: + return self._nodes.copy() + + @property + def edges(self) -> List: + return self._edges.copy() + + @nodes.setter + def nodes(self, nodes): + self._nodes = list(nodes) + + @edges.setter + def edges(self, edges): + self._edges = [tuple(e) for e in edges] + + def add_node(self, node): + if node not in self._nodes: + self._nodes.append(node) + + def add_edge(self, source, destination): + if source not in self._nodes: + self.add_node(source) + if destination not in self._nodes: + self.add_node(destination) + if (source, destination) not in self._edges: + self._edges.append((source, destination)) + + def get_connections(self): + connections = {node: [] for node in self._nodes} + for source, destination in self._edges: + connections[source].append(destination) + return connections + + def getParentNodes(self) -> List: + return [edge[0] for edge in self._edges] + + def getChildNodes(self) -> List: + return [edge[-1] for edge in self._edges] + + #Necesita una revisión pero por ahora hace lo que necesito + def prune_to_longest_paths(self): + connections = self.get_connections() + roots = [n for n in self._nodes if n not in self.getChildNodes()] + + longest_paths = [] + + def dfs(node, path): + path = path + [node] + if node not in connections or not connections[node]: + longest_paths.append(path) + return + for child in connections[node]: + dfs(child, path) + + for root in roots: + dfs(root, []) + + leaf_to_path = {} + for path in longest_paths: + leaf = path[-1] + if leaf not in leaf_to_path or len(path) > len(leaf_to_path[leaf]): + leaf_to_path[leaf] = path + + new_nodes = set() + new_edges = set() + for path in leaf_to_path.values(): + new_nodes.update(path) + new_edges.update([(path[i], path[i+1]) for i in range(len(path)-1)]) + + self._nodes = list(new_nodes) + self._edges = list(new_edges) + + def __str__(self): + return f"Graph(Nodes: {self._nodes},\n Edges: {self._edges})" \ No newline at end of file diff --git a/src/ShapesClassification.py b/src/ShapesClassification.py index b8edaae..41ed84e 100644 --- a/src/ShapesClassification.py +++ b/src/ShapesClassification.py @@ -1,18 +1,24 @@ from enum import Enum import json +import math +from time import sleep from typing import Any, Tuple, List, Dict import gmsh + +from src.Graph import Graph from .BoundingBox import BoundingBox from itertools import chain import numpy as np class ShapesClassification: + _ROUND_VALUE:int = 6 + isOpenCase:bool crossSectionData: Dict pecs: Dict dielectrics: Dict - + nestedGraph: Graph def __init__(self, shapes, jsonFile:str): gmsh.model.occ.synchronize() @@ -25,7 +31,7 @@ def __init__(self, shapes, jsonFile:str): self.dielectrics = self.get_dielectrics(shapes) self.shieldReference = dict() self.vacuum = dict() - + self.nestedGraph = self.__getNestedGraph() self.isOpenCase = self.isOpenProblem() @@ -35,7 +41,7 @@ def getNumberFromName(entity_name: str, label: str): num = int(entity_name[ini:]) return num - def get_pecs(self, entity_tags): + def get_pecs(self, entity_tags) -> Dict[str, Dict[str,any]]: pecNames = self.__getGeometryNamesByMaterialType('PEC') pecs = dict() for s in entity_tags: @@ -46,7 +52,7 @@ def get_pecs(self, entity_tags): return pecs - def get_dielectrics(self, entity_tags): + def get_dielectrics(self, entity_tags) -> Dict[str, Dict[str,any]]: dielectricNames = self.__getGeometryNamesByMaterialType('Dielectric') dielectrics = dict() for s in entity_tags: @@ -64,30 +70,11 @@ def __getGeometryNamesByMaterialType(self, materialType:str) -> List[str]: if geometry['material']['type'] == materialType ] return names - - def isOpenProblem(self): - elements = list(chain(self.pecs.values())) - isOpenCase = True - for idx, element in enumerate(elements): - intersectWithAll = True - intersect = [] - for otheridx, otherElement in enumerate(elements): - if element != otherElement: - intersect = gmsh.model.occ.intersect( - element, - otherElement, - removeObject=False, - tag=300+otheridx, - removeTool=False - )[0] - if len(intersect) == 0: - intersectWithAll = False - else: - isOpenCase = False - if intersectWithAll: - print(element, otherElement) - self.shieldReference = {list(self.pecs.keys())[idx] : element} - return isOpenCase + + def isOpenProblem(self) -> None: + if len(self.nestedGraph.roots) > 1: + return True + return False def removeConductorsFromDielectrics(self): for num, diel in self.dielectrics.items(): @@ -208,4 +195,26 @@ def _buildDefaultVacuumDomain(self): return dict([[0, nearVacuum], [1, farVacuum]]) - + def __getNestedGraph(self): + gmsh.model.occ.synchronize() + graph = Graph() + for key in self.pecs.keys(): + graph.add_node(key) + for i, keyA in enumerate(self.pecs.keys()): + for j, keyB in enumerate(self.pecs.keys()): + if i < j: + inter = gmsh.model.occ.intersect( + self.pecs[keyA], + self.pecs[keyB], + removeObject=False, + removeTool=False + ) + if len(inter[1][0]) == 0: #comprueba las intersecciones en las que interfiere el objeto + continue + else: + if inter[1][0] == self.pecs[keyA]: + graph.add_edge(keyB, keyA) + elif inter[1][0] == self.pecs[keyB]: + graph.add_edge(keyA, keyB) + graph.prune_to_longest_paths() + return graph \ No newline at end of file diff --git a/test/test_ShapesClassification.py b/test/test_ShapesClassification.py index 274d699..cfba528 100644 --- a/test/test_ShapesClassification.py +++ b/test/test_ShapesClassification.py @@ -1,8 +1,11 @@ +from copy import copy import os +from typing import Dict, List, Tuple import unittest import gmsh import json + from src.ShapesClassification import ShapesClassification @@ -52,15 +55,21 @@ def testDielectricShieldedPairClassification(self) -> None: 'RightDielectric': [(2,4)], 'LeftDielectric': [(2,5)], } - expectedShieldReference = { - 'ExternalShield': [(2,2)], - } self.assertListEqual(self.shapeClassification.allShapes, expectedShapes) self.assertDictEqual(self.shapeClassification.pecs, expectedPecs) self.assertDictEqual(self.shapeClassification.dielectrics, expectedDielectrics) - self.assertDictEqual(self.shapeClassification.shieldReference, expectedShieldReference) self.assertFalse(self.shapeClassification.isOpenCase) + def testFusedConductors(self) -> None: + case = 'FusedConductor' + filepath = self.inputFileFromCaseName(case) + self.initShapeClassification(filepath) + + def testComplexNesting(self) -> None: + case = 'ComplexNesting' + filepath = self.inputFileFromCaseName(case) + self.initShapeClassification(filepath) + def testDielectricUnshieldedPairClassification(self) -> None: case = 'DielectricUnshieldedPair' filepath = self.inputFileFromCaseName(case) @@ -71,16 +80,14 @@ def testDielectricUnshieldedPairClassification(self) -> None: (0, 1),(0, 1),(0, 2),(0, 2),(0, 3),(0, 3),(0, 4),(0, 4), ] expectedPecs = { - 'RightConductor': [(2,1)], - 'LeftConductor': [(2,2)], + 'LeftConductor': [(2, 2)], + 'RightConductor': [(2, 1)], } expectedDielectrics = { 'RightDielectric': [(2,3)], 'LeftDielectric': [(2,4)], } - expectedShieldReference = {} self.assertListEqual(self.shapeClassification.allShapes, expectedShapes) self.assertDictEqual(self.shapeClassification.pecs, expectedPecs) self.assertDictEqual(self.shapeClassification.dielectrics, expectedDielectrics) - self.assertDictEqual(self.shapeClassification.shieldReference, expectedShieldReference) self.assertTrue(self.shapeClassification.isOpenCase) \ No newline at end of file diff --git a/test/test_graph.py b/test/test_graph.py new file mode 100644 index 0000000..cd77d2e --- /dev/null +++ b/test/test_graph.py @@ -0,0 +1,88 @@ +import unittest + +from src.Graph import Graph + +class TestGraph(unittest.TestCase): + + def setUp(self) -> None: + self.graph = Graph() + + def tearDown(self): + del self.graph + + def test_addNode(self) -> None: + self.graph.add_node('A') + self.assertIn('A', self.graph.nodes) + + self.graph.add_node('A') + self.assertEqual(self.graph.nodes.count('A'), 1) + + def test_addEdge(self) -> None: + self.graph.add_edge('A', 'B') + self.assertIn(('A', 'B'), self.graph.edges) + + self.assertIn('A', self.graph.nodes) + self.assertIn('B', self.graph.nodes) + + self.graph.add_edge('A', 'B') + self.assertEqual(self.graph.edges.count(('A', 'B')), 1) + + def test_settersAndGetters(self) -> None: + nodes = ['X', 'Y'] + edges = [('X', 'Y')] + self.graph.nodes = nodes + self.graph.edges = edges + self.assertEqual(self.graph.nodes, nodes) + self.assertEqual(self.graph.edges, edges) + + def test_GetConnections(self) -> None: + self.graph.add_edge('A', 'B') + self.graph.add_edge('A', 'C') + self.graph.add_node('D') # no connections + connections = self.graph.get_connections() + expected = { + 'A': ['B', 'C'], + 'B': [], + 'C': [], + 'D': [] + } + self.assertEqual(connections, expected) + + def test_str(self) -> None: + self.graph.add_edge('A', 'B') + s = str(self.graph) + self.assertIn('A', s) + self.assertIn('B', s) + self.assertIn('Edges', s) + + def testPruneToLongestPaths(self) -> None: + self.graph.nodes = ['A' ,'B', 'C', 'D', 'E', 'F', 'G'] + self.graph.edges = [ + ('A', 'B'), ('A', 'C'), ('A', 'D'), ('A', 'E'), + ('B', 'C'), ('B', 'E'), + ('C', 'E'), + ('F', 'G') + ] + + expectedEdges = [ + ('A', 'B'), ('A', 'D'), + ('B', 'C'), + ('C', 'E'), + ('F', 'G') + ] + + self.graph.prune_to_longest_paths() + self.assertListEqual(sorted(self.graph.edges), sorted(expectedEdges)) + + def testGetRoots(self) -> None: + self.graph.nodes = ['A' ,'B', 'C', 'D', 'E', 'F', 'G'] + self.graph.edges = [ + ('A', 'B'), ('A', 'D'), + ('B', 'C'), + ('C', 'E'), + ('F', 'G') + ] + self.assertListEqual(self.graph.roots, ['A', 'F']) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/testData/ComplexNesting/ComplexNesting.FCStd b/testData/ComplexNesting/ComplexNesting.FCStd new file mode 100644 index 0000000000000000000000000000000000000000..50fc6a80229abc48fa38db94b7cbf5e6f61a2b00 GIT binary patch literal 22489 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%0DYPIO=-;G7NPCHVn0&8E`;;BzB(m};6oNa%e4dH2 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 literal 0 HcmV?d00001 diff --git a/testData/ComplexNesting/ComplexNesting.json b/testData/ComplexNesting/ComplexNesting.json new file mode 100644 index 0000000..27d4154 --- /dev/null +++ b/testData/ComplexNesting/ComplexNesting.json @@ -0,0 +1,46 @@ +{ + "CrossSection":[ + { + "name":"Right", + "material":{ + "type":"PEC" + } + }, + { + "name":"Left", + "material":{ + "type":"PEC" + } + }, + { + "name":"SubLeftA", + "material":{ + "type":"PEC" + } + }, + { + "name":"SubLeftB", + "material":{ + "type":"PEC" + } + }, + { + "name":"SubLeftA1", + "material":{ + "type":"PEC" + } + }, + { + "name":"SubLeftA2", + "material":{ + "type":"PEC" + } + }, + { + "name":"SubRightA", + "material":{ + "type":"PEC" + } + } + ] +} \ No newline at end of file diff --git a/testData/ComplexNesting/ComplexNesting.step b/testData/ComplexNesting/ComplexNesting.step new file mode 100644 index 0000000..edb619f --- /dev/null +++ b/testData/ComplexNesting/ComplexNesting.step @@ -0,0 +1,458 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('FreeCAD Model'),'2;1'); +FILE_NAME('Open CASCADE Shape Model','2025-10-01T13:48:29',(''),(''), + 'Open CASCADE STEP processor 7.8','FreeCAD','Unknown'); +FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); +ENDSEC; +DATA; +#1 = APPLICATION_PROTOCOL_DEFINITION('international standard', + 'automotive_design',2000,#2); +#2 = APPLICATION_CONTEXT( + 'core data for automotive mechanical design processes'); +#3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10); +#4 = PRODUCT_DEFINITION_SHAPE('','',#5); +#5 = PRODUCT_DEFINITION('design','',#6,#9); +#6 = PRODUCT_DEFINITION_FORMATION('','',#7); +#7 = PRODUCT('DielectricShieldedPair','DielectricShieldedPair','',(#8)); +#8 = PRODUCT_CONTEXT('',#2,'mechanical'); +#9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#10 = SHAPE_REPRESENTATION('',(#11,#15,#19,#23,#27,#31,#35,#39),#43); +#11 = AXIS2_PLACEMENT_3D('',#12,#13,#14); +#12 = CARTESIAN_POINT('',(0.,0.,0.)); +#13 = DIRECTION('',(0.,0.,1.)); +#14 = DIRECTION('',(1.,0.,-0.)); +#15 = AXIS2_PLACEMENT_3D('',#16,#17,#18); +#16 = CARTESIAN_POINT('',(20.,0.,0.)); +#17 = DIRECTION('',(0.,0.,1.)); +#18 = DIRECTION('',(1.,0.,0.)); +#19 = AXIS2_PLACEMENT_3D('',#20,#21,#22); +#20 = CARTESIAN_POINT('',(-20.,0.,0.)); +#21 = DIRECTION('',(0.,0.,1.)); +#22 = DIRECTION('',(1.,0.,0.)); +#23 = AXIS2_PLACEMENT_3D('',#24,#25,#26); +#24 = CARTESIAN_POINT('',(-29.,0.,0.)); +#25 = DIRECTION('',(0.,0.,1.)); +#26 = DIRECTION('',(1.,0.,0.)); +#27 = AXIS2_PLACEMENT_3D('',#28,#29,#30); +#28 = CARTESIAN_POINT('',(-11.,0.,0.)); +#29 = DIRECTION('',(0.,0.,1.)); +#30 = DIRECTION('',(1.,0.,0.)); +#31 = AXIS2_PLACEMENT_3D('',#32,#33,#34); +#32 = CARTESIAN_POINT('',(-33.,0.,0.)); +#33 = DIRECTION('',(0.,0.,1.)); +#34 = DIRECTION('',(1.,0.,0.)); +#35 = AXIS2_PLACEMENT_3D('',#36,#37,#38); +#36 = CARTESIAN_POINT('',(-26.,0.,0.)); +#37 = DIRECTION('',(0.,0.,1.)); +#38 = DIRECTION('',(1.,0.,0.)); +#39 = AXIS2_PLACEMENT_3D('',#40,#41,#42); +#40 = CARTESIAN_POINT('',(20.,0.,0.)); +#41 = DIRECTION('',(0.,0.,1.)); +#42 = DIRECTION('',(1.,0.,0.)); +#43 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#47)) GLOBAL_UNIT_ASSIGNED_CONTEXT( +(#44,#45,#46)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#44 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#45 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#46 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#47 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#44, + 'distance_accuracy_value','confusion accuracy'); +#48 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7)); +#49 = SHAPE_DEFINITION_REPRESENTATION(#50,#56); +#50 = PRODUCT_DEFINITION_SHAPE('','',#51); +#51 = PRODUCT_DEFINITION('design','',#52,#55); +#52 = PRODUCT_DEFINITION_FORMATION('','',#53); +#53 = PRODUCT('Right','Right','',(#54)); +#54 = PRODUCT_CONTEXT('',#2,'mechanical'); +#55 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#56 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#57),#76); +#57 = SHELL_BASED_SURFACE_MODEL('',(#58)); +#58 = OPEN_SHELL('',(#59)); +#59 = ADVANCED_FACE('',(#60),#71,.T.); +#60 = FACE_BOUND('',#61,.T.); +#61 = EDGE_LOOP('',(#62)); +#62 = ORIENTED_EDGE('',*,*,#63,.T.); +#63 = EDGE_CURVE('',#64,#64,#66,.T.); +#64 = VERTEX_POINT('',#65); +#65 = CARTESIAN_POINT('',(8.,0.,0.)); +#66 = CIRCLE('',#67,8.); +#67 = AXIS2_PLACEMENT_3D('',#68,#69,#70); +#68 = CARTESIAN_POINT('',(0.,0.,0.)); +#69 = DIRECTION('',(0.,0.,1.)); +#70 = DIRECTION('',(1.,0.,0.)); +#71 = PLANE('',#72); +#72 = AXIS2_PLACEMENT_3D('',#73,#74,#75); +#73 = CARTESIAN_POINT('',(-5.127900497023E-16,1.528755336223E-17,0.)); +#74 = DIRECTION('',(0.,0.,1.)); +#75 = DIRECTION('',(1.,0.,0.)); +#76 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#80)) GLOBAL_UNIT_ASSIGNED_CONTEXT( +(#77,#78,#79)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#77 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#78 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#79 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#80 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#77, + 'distance_accuracy_value','confusion accuracy'); +#81 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#82,#84); +#82 = ( REPRESENTATION_RELATIONSHIP('','',#56,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#83) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#83 = ITEM_DEFINED_TRANSFORMATION('','',#11,#15); +#84 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#85); +#85 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('12','Right','',#5,#51,$); +#86 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#53)); +#87 = SHAPE_DEFINITION_REPRESENTATION(#88,#94); +#88 = PRODUCT_DEFINITION_SHAPE('','',#89); +#89 = PRODUCT_DEFINITION('design','',#90,#93); +#90 = PRODUCT_DEFINITION_FORMATION('','',#91); +#91 = PRODUCT('Left','Left','',(#92)); +#92 = PRODUCT_CONTEXT('',#2,'mechanical'); +#93 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#94 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#95),#114); +#95 = SHELL_BASED_SURFACE_MODEL('',(#96)); +#96 = OPEN_SHELL('',(#97)); +#97 = ADVANCED_FACE('',(#98),#109,.T.); +#98 = FACE_BOUND('',#99,.T.); +#99 = EDGE_LOOP('',(#100)); +#100 = ORIENTED_EDGE('',*,*,#101,.T.); +#101 = EDGE_CURVE('',#102,#102,#104,.T.); +#102 = VERTEX_POINT('',#103); +#103 = CARTESIAN_POINT('',(20.,0.,0.)); +#104 = CIRCLE('',#105,20.); +#105 = AXIS2_PLACEMENT_3D('',#106,#107,#108); +#106 = CARTESIAN_POINT('',(0.,0.,0.)); +#107 = DIRECTION('',(0.,0.,1.)); +#108 = DIRECTION('',(1.,0.,0.)); +#109 = PLANE('',#110); +#110 = AXIS2_PLACEMENT_3D('',#111,#112,#113); +#111 = CARTESIAN_POINT('',(-1.093952106032E-15,2.775209066E-16,0.)); +#112 = DIRECTION('',(0.,0.,1.)); +#113 = DIRECTION('',(1.,0.,0.)); +#114 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#118)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#115,#116,#117)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#115 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#116 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#117 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#118 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#115, + 'distance_accuracy_value','confusion accuracy'); +#119 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#120,#122); +#120 = ( REPRESENTATION_RELATIONSHIP('','',#94,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#121) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#121 = ITEM_DEFINED_TRANSFORMATION('','',#11,#19); +#122 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#123 + ); +#123 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('13','Left','',#5,#89,$); +#124 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#91)); +#125 = SHAPE_DEFINITION_REPRESENTATION(#126,#132); +#126 = PRODUCT_DEFINITION_SHAPE('','',#127); +#127 = PRODUCT_DEFINITION('design','',#128,#131); +#128 = PRODUCT_DEFINITION_FORMATION('','',#129); +#129 = PRODUCT('SubLeftA','SubLeftA','',(#130)); +#130 = PRODUCT_CONTEXT('',#2,'mechanical'); +#131 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#132 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#133),#152); +#133 = SHELL_BASED_SURFACE_MODEL('',(#134)); +#134 = OPEN_SHELL('',(#135)); +#135 = ADVANCED_FACE('',(#136),#147,.T.); +#136 = FACE_BOUND('',#137,.T.); +#137 = EDGE_LOOP('',(#138)); +#138 = ORIENTED_EDGE('',*,*,#139,.T.); +#139 = EDGE_CURVE('',#140,#140,#142,.T.); +#140 = VERTEX_POINT('',#141); +#141 = CARTESIAN_POINT('',(8.,0.,0.)); +#142 = CIRCLE('',#143,8.); +#143 = AXIS2_PLACEMENT_3D('',#144,#145,#146); +#144 = CARTESIAN_POINT('',(0.,0.,0.)); +#145 = DIRECTION('',(0.,0.,1.)); +#146 = DIRECTION('',(1.,0.,0.)); +#147 = PLANE('',#148); +#148 = AXIS2_PLACEMENT_3D('',#149,#150,#151); +#149 = CARTESIAN_POINT('',(-5.127900497023E-16,1.528755336223E-17,0.)); +#150 = DIRECTION('',(0.,0.,1.)); +#151 = DIRECTION('',(1.,0.,0.)); +#152 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#156)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#153,#154,#155)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#153 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#154 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#155 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#156 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#153, + 'distance_accuracy_value','confusion accuracy'); +#157 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#158,#160); +#158 = ( REPRESENTATION_RELATIONSHIP('','',#132,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#159) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#159 = ITEM_DEFINED_TRANSFORMATION('','',#11,#23); +#160 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#161 + ); +#161 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('14','SubLeftA','',#5,#127,$); +#162 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#129)); +#163 = SHAPE_DEFINITION_REPRESENTATION(#164,#170); +#164 = PRODUCT_DEFINITION_SHAPE('','',#165); +#165 = PRODUCT_DEFINITION('design','',#166,#169); +#166 = PRODUCT_DEFINITION_FORMATION('','',#167); +#167 = PRODUCT('SubLeftB','SubLeftB','',(#168)); +#168 = PRODUCT_CONTEXT('',#2,'mechanical'); +#169 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#170 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#171),#190); +#171 = SHELL_BASED_SURFACE_MODEL('',(#172)); +#172 = OPEN_SHELL('',(#173)); +#173 = ADVANCED_FACE('',(#174),#185,.T.); +#174 = FACE_BOUND('',#175,.T.); +#175 = EDGE_LOOP('',(#176)); +#176 = ORIENTED_EDGE('',*,*,#177,.T.); +#177 = EDGE_CURVE('',#178,#178,#180,.T.); +#178 = VERTEX_POINT('',#179); +#179 = CARTESIAN_POINT('',(8.,0.,0.)); +#180 = CIRCLE('',#181,8.); +#181 = AXIS2_PLACEMENT_3D('',#182,#183,#184); +#182 = CARTESIAN_POINT('',(0.,0.,0.)); +#183 = DIRECTION('',(0.,0.,1.)); +#184 = DIRECTION('',(1.,0.,0.)); +#185 = PLANE('',#186); +#186 = AXIS2_PLACEMENT_3D('',#187,#188,#189); +#187 = CARTESIAN_POINT('',(-5.127900497023E-16,1.528755336223E-17,0.)); +#188 = DIRECTION('',(0.,0.,1.)); +#189 = DIRECTION('',(1.,0.,0.)); +#190 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#194)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#191,#192,#193)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#191 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#192 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#193 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#194 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#191, + 'distance_accuracy_value','confusion accuracy'); +#195 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#196,#198); +#196 = ( REPRESENTATION_RELATIONSHIP('','',#170,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#197) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#197 = ITEM_DEFINED_TRANSFORMATION('','',#11,#27); +#198 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#199 + ); +#199 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('15','SubLeftB','',#5,#165,$); +#200 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#167)); +#201 = SHAPE_DEFINITION_REPRESENTATION(#202,#208); +#202 = PRODUCT_DEFINITION_SHAPE('','',#203); +#203 = PRODUCT_DEFINITION('design','',#204,#207); +#204 = PRODUCT_DEFINITION_FORMATION('','',#205); +#205 = PRODUCT('SubLeftA1','SubLeftA1','',(#206)); +#206 = PRODUCT_CONTEXT('',#2,'mechanical'); +#207 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#208 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#209),#228); +#209 = SHELL_BASED_SURFACE_MODEL('',(#210)); +#210 = OPEN_SHELL('',(#211)); +#211 = ADVANCED_FACE('',(#212),#223,.T.); +#212 = FACE_BOUND('',#213,.T.); +#213 = EDGE_LOOP('',(#214)); +#214 = ORIENTED_EDGE('',*,*,#215,.T.); +#215 = EDGE_CURVE('',#216,#216,#218,.T.); +#216 = VERTEX_POINT('',#217); +#217 = CARTESIAN_POINT('',(2.,0.,0.)); +#218 = CIRCLE('',#219,2.); +#219 = AXIS2_PLACEMENT_3D('',#220,#221,#222); +#220 = CARTESIAN_POINT('',(0.,0.,0.)); +#221 = DIRECTION('',(0.,0.,1.)); +#222 = DIRECTION('',(1.,0.,0.)); +#223 = PLANE('',#224); +#224 = AXIS2_PLACEMENT_3D('',#225,#226,#227); +#225 = CARTESIAN_POINT('',(-1.281975124256E-16,3.821888340557E-18,0.)); +#226 = DIRECTION('',(0.,0.,1.)); +#227 = DIRECTION('',(1.,0.,0.)); +#228 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#232)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#229,#230,#231)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#229 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#230 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#231 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#232 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#229, + 'distance_accuracy_value','confusion accuracy'); +#233 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#234,#236); +#234 = ( REPRESENTATION_RELATIONSHIP('','',#208,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#235) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#235 = ITEM_DEFINED_TRANSFORMATION('','',#11,#31); +#236 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#237 + ); +#237 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('16','SubLeftA1','',#5,#203,$); +#238 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#205)); +#239 = SHAPE_DEFINITION_REPRESENTATION(#240,#246); +#240 = PRODUCT_DEFINITION_SHAPE('','',#241); +#241 = PRODUCT_DEFINITION('design','',#242,#245); +#242 = PRODUCT_DEFINITION_FORMATION('','',#243); +#243 = PRODUCT('SubLeftA2','SubLeftA2','',(#244)); +#244 = PRODUCT_CONTEXT('',#2,'mechanical'); +#245 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#246 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#247),#266); +#247 = SHELL_BASED_SURFACE_MODEL('',(#248)); +#248 = OPEN_SHELL('',(#249)); +#249 = ADVANCED_FACE('',(#250),#261,.T.); +#250 = FACE_BOUND('',#251,.T.); +#251 = EDGE_LOOP('',(#252)); +#252 = ORIENTED_EDGE('',*,*,#253,.T.); +#253 = EDGE_CURVE('',#254,#254,#256,.T.); +#254 = VERTEX_POINT('',#255); +#255 = CARTESIAN_POINT('',(4.,0.,0.)); +#256 = CIRCLE('',#257,4.); +#257 = AXIS2_PLACEMENT_3D('',#258,#259,#260); +#258 = CARTESIAN_POINT('',(0.,0.,0.)); +#259 = DIRECTION('',(0.,0.,1.)); +#260 = DIRECTION('',(1.,0.,0.)); +#261 = PLANE('',#262); +#262 = AXIS2_PLACEMENT_3D('',#263,#264,#265); +#263 = CARTESIAN_POINT('',(-2.563950248511E-16,7.643776681114E-18,0.)); +#264 = DIRECTION('',(0.,0.,1.)); +#265 = DIRECTION('',(1.,0.,0.)); +#266 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#270)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#267,#268,#269)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#267 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#268 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#269 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#270 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#267, + 'distance_accuracy_value','confusion accuracy'); +#271 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#272,#274); +#272 = ( REPRESENTATION_RELATIONSHIP('','',#246,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#273) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#273 = ITEM_DEFINED_TRANSFORMATION('','',#11,#35); +#274 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#275 + ); +#275 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('17','SubLeftA2','',#5,#241,$); +#276 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#243)); +#277 = SHAPE_DEFINITION_REPRESENTATION(#278,#284); +#278 = PRODUCT_DEFINITION_SHAPE('','',#279); +#279 = PRODUCT_DEFINITION('design','',#280,#283); +#280 = PRODUCT_DEFINITION_FORMATION('','',#281); +#281 = PRODUCT('SubRightA','SubRightA','',(#282)); +#282 = PRODUCT_CONTEXT('',#2,'mechanical'); +#283 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#284 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#285),#304); +#285 = SHELL_BASED_SURFACE_MODEL('',(#286)); +#286 = OPEN_SHELL('',(#287)); +#287 = ADVANCED_FACE('',(#288),#299,.T.); +#288 = FACE_BOUND('',#289,.T.); +#289 = EDGE_LOOP('',(#290)); +#290 = ORIENTED_EDGE('',*,*,#291,.T.); +#291 = EDGE_CURVE('',#292,#292,#294,.T.); +#292 = VERTEX_POINT('',#293); +#293 = CARTESIAN_POINT('',(2.,0.,0.)); +#294 = CIRCLE('',#295,2.); +#295 = AXIS2_PLACEMENT_3D('',#296,#297,#298); +#296 = CARTESIAN_POINT('',(0.,0.,0.)); +#297 = DIRECTION('',(0.,0.,1.)); +#298 = DIRECTION('',(1.,0.,0.)); +#299 = PLANE('',#300); +#300 = AXIS2_PLACEMENT_3D('',#301,#302,#303); +#301 = CARTESIAN_POINT('',(-1.281975124256E-16,3.821888340557E-18,0.)); +#302 = DIRECTION('',(0.,0.,1.)); +#303 = DIRECTION('',(1.,0.,0.)); +#304 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#308)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#305,#306,#307)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#305 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#306 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#307 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#308 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#305, + 'distance_accuracy_value','confusion accuracy'); +#309 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#310,#312); +#310 = ( REPRESENTATION_RELATIONSHIP('','',#284,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#311) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#311 = ITEM_DEFINED_TRANSFORMATION('','',#11,#39); +#312 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#313 + ); +#313 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('18','SubRightA','',#5,#279,$); +#314 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#281)); +#315 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#316) + ,#114); +#316 = STYLED_ITEM('color',(#317),#97); +#317 = PRESENTATION_STYLE_ASSIGNMENT((#318,#324)); +#318 = SURFACE_STYLE_USAGE(.BOTH.,#319); +#319 = SURFACE_SIDE_STYLE('',(#320)); +#320 = SURFACE_STYLE_FILL_AREA(#321); +#321 = FILL_AREA_STYLE('',(#322)); +#322 = FILL_AREA_STYLE_COLOUR('',#323); +#323 = COLOUR_RGB('',0.800000010877,0.800000010877,0.800000010877); +#324 = CURVE_STYLE('',#325,POSITIVE_LENGTH_MEASURE(0.1),#326); +#325 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#326 = COLOUR_RGB('',9.803921802644E-02,9.803921802644E-02, + 9.803921802644E-02); +#327 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#328) + ,#266); +#328 = STYLED_ITEM('color',(#329),#249); +#329 = PRESENTATION_STYLE_ASSIGNMENT((#330,#335)); +#330 = SURFACE_STYLE_USAGE(.BOTH.,#331); +#331 = SURFACE_SIDE_STYLE('',(#332)); +#332 = SURFACE_STYLE_FILL_AREA(#333); +#333 = FILL_AREA_STYLE('',(#334)); +#334 = FILL_AREA_STYLE_COLOUR('',#323); +#335 = CURVE_STYLE('',#336,POSITIVE_LENGTH_MEASURE(0.1),#326); +#336 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#337 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#338) + ,#304); +#338 = STYLED_ITEM('color',(#339),#287); +#339 = PRESENTATION_STYLE_ASSIGNMENT((#340,#345)); +#340 = SURFACE_STYLE_USAGE(.BOTH.,#341); +#341 = SURFACE_SIDE_STYLE('',(#342)); +#342 = SURFACE_STYLE_FILL_AREA(#343); +#343 = FILL_AREA_STYLE('',(#344)); +#344 = FILL_AREA_STYLE_COLOUR('',#323); +#345 = CURVE_STYLE('',#346,POSITIVE_LENGTH_MEASURE(0.1),#326); +#346 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#347 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#348) + ,#228); +#348 = STYLED_ITEM('color',(#349),#211); +#349 = PRESENTATION_STYLE_ASSIGNMENT((#350,#355)); +#350 = SURFACE_STYLE_USAGE(.BOTH.,#351); +#351 = SURFACE_SIDE_STYLE('',(#352)); +#352 = SURFACE_STYLE_FILL_AREA(#353); +#353 = FILL_AREA_STYLE('',(#354)); +#354 = FILL_AREA_STYLE_COLOUR('',#323); +#355 = CURVE_STYLE('',#356,POSITIVE_LENGTH_MEASURE(0.1),#326); +#356 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#357 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#358) + ,#76); +#358 = STYLED_ITEM('color',(#359),#59); +#359 = PRESENTATION_STYLE_ASSIGNMENT((#360,#365)); +#360 = SURFACE_STYLE_USAGE(.BOTH.,#361); +#361 = SURFACE_SIDE_STYLE('',(#362)); +#362 = SURFACE_STYLE_FILL_AREA(#363); +#363 = FILL_AREA_STYLE('',(#364)); +#364 = FILL_AREA_STYLE_COLOUR('',#323); +#365 = CURVE_STYLE('',#366,POSITIVE_LENGTH_MEASURE(0.1),#326); +#366 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#367 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#368) + ,#152); +#368 = STYLED_ITEM('color',(#369),#135); +#369 = PRESENTATION_STYLE_ASSIGNMENT((#370,#375)); +#370 = SURFACE_STYLE_USAGE(.BOTH.,#371); +#371 = SURFACE_SIDE_STYLE('',(#372)); +#372 = SURFACE_STYLE_FILL_AREA(#373); +#373 = FILL_AREA_STYLE('',(#374)); +#374 = FILL_AREA_STYLE_COLOUR('',#323); +#375 = CURVE_STYLE('',#376,POSITIVE_LENGTH_MEASURE(0.1),#326); +#376 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#377 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#378) + ,#190); +#378 = STYLED_ITEM('color',(#379),#173); +#379 = PRESENTATION_STYLE_ASSIGNMENT((#380,#385)); +#380 = SURFACE_STYLE_USAGE(.BOTH.,#381); +#381 = SURFACE_SIDE_STYLE('',(#382)); +#382 = SURFACE_STYLE_FILL_AREA(#383); +#383 = FILL_AREA_STYLE('',(#384)); +#384 = FILL_AREA_STYLE_COLOUR('',#323); +#385 = CURVE_STYLE('',#386,POSITIVE_LENGTH_MEASURE(0.1),#326); +#386 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +ENDSEC; +END-ISO-10303-21; diff --git a/testData/FusedConductor/FusedConductor.20250930-153234.FCBak b/testData/FusedConductor/FusedConductor.20250930-153234.FCBak new file mode 100644 index 0000000000000000000000000000000000000000..f9436fae275e836b8a311d63640b8fd24bcc94ff GIT binary patch literal 13624 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 W;PmAj1i%Md0|OxeVS;}p;{O98|2JF! literal 0 HcmV?d00001 diff --git a/testData/FusedConductor/FusedConductor.json b/testData/FusedConductor/FusedConductor.json new file mode 100644 index 0000000..b90e55f --- /dev/null +++ b/testData/FusedConductor/FusedConductor.json @@ -0,0 +1,40 @@ +{ + "CrossSection":[ + { + "name":"Shield", + "material":{ + "type":"PEC" + } + }, + { + "name":"A", + "material":{ + "type":"PEC" + } + }, + { + "name":"B", + "material":{ + "type":"PEC" + } + }, + { + "name":"C", + "material":{ + "type":"PEC" + } + }, + { + "name":"D", + "material":{ + "type":"PEC" + } + }, + { + "name":"E", + "material":{ + "type":"PEC" + } + } + ] +} \ No newline at end of file diff --git a/testData/FusedConductor/FusedConductor.step b/testData/FusedConductor/FusedConductor.step new file mode 100644 index 0000000..1ff048b --- /dev/null +++ b/testData/FusedConductor/FusedConductor.step @@ -0,0 +1,401 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('FreeCAD Model'),'2;1'); +FILE_NAME('Open CASCADE Shape Model','2025-10-01T13:24:21',(''),(''), + 'Open CASCADE STEP processor 7.8','FreeCAD','Unknown'); +FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); +ENDSEC; +DATA; +#1 = APPLICATION_PROTOCOL_DEFINITION('international standard', + 'automotive_design',2000,#2); +#2 = APPLICATION_CONTEXT( + 'core data for automotive mechanical design processes'); +#3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10); +#4 = PRODUCT_DEFINITION_SHAPE('','',#5); +#5 = PRODUCT_DEFINITION('design','',#6,#9); +#6 = PRODUCT_DEFINITION_FORMATION('','',#7); +#7 = PRODUCT('FusedConductor','FusedConductor','',(#8)); +#8 = PRODUCT_CONTEXT('',#2,'mechanical'); +#9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#10 = SHAPE_REPRESENTATION('',(#11,#15,#19,#23,#27,#31,#35),#39); +#11 = AXIS2_PLACEMENT_3D('',#12,#13,#14); +#12 = CARTESIAN_POINT('',(0.,0.,0.)); +#13 = DIRECTION('',(0.,0.,1.)); +#14 = DIRECTION('',(1.,0.,-0.)); +#15 = AXIS2_PLACEMENT_3D('',#16,#17,#18); +#16 = CARTESIAN_POINT('',(3.,0.,0.)); +#17 = DIRECTION('',(0.,0.,1.)); +#18 = DIRECTION('',(1.,0.,0.)); +#19 = AXIS2_PLACEMENT_3D('',#20,#21,#22); +#20 = CARTESIAN_POINT('',(0.,0.,0.)); +#21 = DIRECTION('',(0.,0.,1.)); +#22 = DIRECTION('',(1.,0.,0.)); +#23 = AXIS2_PLACEMENT_3D('',#24,#25,#26); +#24 = CARTESIAN_POINT('',(-8.,0.,0.)); +#25 = DIRECTION('',(0.,0.,1.)); +#26 = DIRECTION('',(1.,0.,0.)); +#27 = AXIS2_PLACEMENT_3D('',#28,#29,#30); +#28 = CARTESIAN_POINT('',(-2.,7.,0.)); +#29 = DIRECTION('',(0.,0.,1.)); +#30 = DIRECTION('',(1.,0.,0.)); +#31 = AXIS2_PLACEMENT_3D('',#32,#33,#34); +#32 = CARTESIAN_POINT('',(-2.,30.,0.)); +#33 = DIRECTION('',(0.,0.,1.)); +#34 = DIRECTION('',(1.,0.,0.)); +#35 = AXIS2_PLACEMENT_3D('',#36,#37,#38); +#36 = CARTESIAN_POINT('',(16.,1.,0.)); +#37 = DIRECTION('',(0.,0.,1.)); +#38 = DIRECTION('',(1.,0.,0.)); +#39 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#43)) GLOBAL_UNIT_ASSIGNED_CONTEXT( +(#40,#41,#42)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#40 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#41 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#42 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#43 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#40, + 'distance_accuracy_value','confusion accuracy'); +#44 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7)); +#45 = SHAPE_DEFINITION_REPRESENTATION(#46,#52); +#46 = PRODUCT_DEFINITION_SHAPE('','',#47); +#47 = PRODUCT_DEFINITION('design','',#48,#51); +#48 = PRODUCT_DEFINITION_FORMATION('','',#49); +#49 = PRODUCT('A','A','',(#50)); +#50 = PRODUCT_CONTEXT('',#2,'mechanical'); +#51 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#52 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#53),#72); +#53 = SHELL_BASED_SURFACE_MODEL('',(#54)); +#54 = OPEN_SHELL('',(#55)); +#55 = ADVANCED_FACE('',(#56),#67,.T.); +#56 = FACE_BOUND('',#57,.T.); +#57 = EDGE_LOOP('',(#58)); +#58 = ORIENTED_EDGE('',*,*,#59,.T.); +#59 = EDGE_CURVE('',#60,#60,#62,.T.); +#60 = VERTEX_POINT('',#61); +#61 = CARTESIAN_POINT('',(8.,0.,0.)); +#62 = CIRCLE('',#63,8.); +#63 = AXIS2_PLACEMENT_3D('',#64,#65,#66); +#64 = CARTESIAN_POINT('',(0.,0.,0.)); +#65 = DIRECTION('',(0.,0.,1.)); +#66 = DIRECTION('',(1.,0.,0.)); +#67 = PLANE('',#68); +#68 = AXIS2_PLACEMENT_3D('',#69,#70,#71); +#69 = CARTESIAN_POINT('',(-5.1E-16,2.E-17,0.)); +#70 = DIRECTION('',(0.,0.,1.)); +#71 = DIRECTION('',(1.,0.,0.)); +#72 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#76)) GLOBAL_UNIT_ASSIGNED_CONTEXT( +(#73,#74,#75)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#73 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#74 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#75 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#76 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#73, + 'distance_accuracy_value','confusion accuracy'); +#77 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#78,#80); +#78 = ( REPRESENTATION_RELATIONSHIP('','',#52,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#79) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#79 = ITEM_DEFINED_TRANSFORMATION('','',#11,#15); +#80 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#81); +#81 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('6','A','',#5,#47,$); +#82 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#49)); +#83 = SHAPE_DEFINITION_REPRESENTATION(#84,#90); +#84 = PRODUCT_DEFINITION_SHAPE('','',#85); +#85 = PRODUCT_DEFINITION('design','',#86,#89); +#86 = PRODUCT_DEFINITION_FORMATION('','',#87); +#87 = PRODUCT('Shield','Shield','',(#88)); +#88 = PRODUCT_CONTEXT('',#2,'mechanical'); +#89 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#90 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#91),#110); +#91 = SHELL_BASED_SURFACE_MODEL('',(#92)); +#92 = OPEN_SHELL('',(#93)); +#93 = ADVANCED_FACE('',(#94),#105,.T.); +#94 = FACE_BOUND('',#95,.T.); +#95 = EDGE_LOOP('',(#96)); +#96 = ORIENTED_EDGE('',*,*,#97,.T.); +#97 = EDGE_CURVE('',#98,#98,#100,.T.); +#98 = VERTEX_POINT('',#99); +#99 = CARTESIAN_POINT('',(50.,0.,0.)); +#100 = CIRCLE('',#101,50.); +#101 = AXIS2_PLACEMENT_3D('',#102,#103,#104); +#102 = CARTESIAN_POINT('',(0.,0.,0.)); +#103 = DIRECTION('',(0.,0.,1.)); +#104 = DIRECTION('',(1.,0.,-0.)); +#105 = PLANE('',#106); +#106 = AXIS2_PLACEMENT_3D('',#107,#108,#109); +#107 = CARTESIAN_POINT('',(-3.5E-15,-2.04E-15,0.)); +#108 = DIRECTION('',(0.,0.,1.)); +#109 = DIRECTION('',(1.,0.,-0.)); +#110 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#114)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#111,#112,#113)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#111 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#112 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#113 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#114 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#111, + 'distance_accuracy_value','confusion accuracy'); +#115 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#116,#118); +#116 = ( REPRESENTATION_RELATIONSHIP('','',#90,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#117) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#117 = ITEM_DEFINED_TRANSFORMATION('','',#11,#19); +#118 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#119 + ); +#119 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('7','Shield','',#5,#85,$); +#120 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#87)); +#121 = SHAPE_DEFINITION_REPRESENTATION(#122,#128); +#122 = PRODUCT_DEFINITION_SHAPE('','',#123); +#123 = PRODUCT_DEFINITION('design','',#124,#127); +#124 = PRODUCT_DEFINITION_FORMATION('','',#125); +#125 = PRODUCT('B','B','',(#126)); +#126 = PRODUCT_CONTEXT('',#2,'mechanical'); +#127 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#128 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#129),#148); +#129 = SHELL_BASED_SURFACE_MODEL('',(#130)); +#130 = OPEN_SHELL('',(#131)); +#131 = ADVANCED_FACE('',(#132),#143,.T.); +#132 = FACE_BOUND('',#133,.T.); +#133 = EDGE_LOOP('',(#134)); +#134 = ORIENTED_EDGE('',*,*,#135,.T.); +#135 = EDGE_CURVE('',#136,#136,#138,.T.); +#136 = VERTEX_POINT('',#137); +#137 = CARTESIAN_POINT('',(8.,0.,0.)); +#138 = CIRCLE('',#139,8.); +#139 = AXIS2_PLACEMENT_3D('',#140,#141,#142); +#140 = CARTESIAN_POINT('',(0.,0.,0.)); +#141 = DIRECTION('',(0.,0.,1.)); +#142 = DIRECTION('',(1.,0.,0.)); +#143 = PLANE('',#144); +#144 = AXIS2_PLACEMENT_3D('',#145,#146,#147); +#145 = CARTESIAN_POINT('',(-5.1E-16,2.E-17,0.)); +#146 = DIRECTION('',(0.,0.,1.)); +#147 = DIRECTION('',(1.,0.,0.)); +#148 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#152)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#149,#150,#151)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#149 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#150 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#151 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#152 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#149, + 'distance_accuracy_value','confusion accuracy'); +#153 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#154,#156); +#154 = ( REPRESENTATION_RELATIONSHIP('','',#128,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#155) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#155 = ITEM_DEFINED_TRANSFORMATION('','',#11,#23); +#156 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#157 + ); +#157 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('8','B','',#5,#123,$); +#158 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#125)); +#159 = SHAPE_DEFINITION_REPRESENTATION(#160,#166); +#160 = PRODUCT_DEFINITION_SHAPE('','',#161); +#161 = PRODUCT_DEFINITION('design','',#162,#165); +#162 = PRODUCT_DEFINITION_FORMATION('','',#163); +#163 = PRODUCT('C','C','',(#164)); +#164 = PRODUCT_CONTEXT('',#2,'mechanical'); +#165 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#166 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#167),#186); +#167 = SHELL_BASED_SURFACE_MODEL('',(#168)); +#168 = OPEN_SHELL('',(#169)); +#169 = ADVANCED_FACE('',(#170),#181,.T.); +#170 = FACE_BOUND('',#171,.T.); +#171 = EDGE_LOOP('',(#172)); +#172 = ORIENTED_EDGE('',*,*,#173,.T.); +#173 = EDGE_CURVE('',#174,#174,#176,.T.); +#174 = VERTEX_POINT('',#175); +#175 = CARTESIAN_POINT('',(8.,0.,0.)); +#176 = CIRCLE('',#177,8.); +#177 = AXIS2_PLACEMENT_3D('',#178,#179,#180); +#178 = CARTESIAN_POINT('',(0.,0.,0.)); +#179 = DIRECTION('',(0.,0.,1.)); +#180 = DIRECTION('',(1.,0.,0.)); +#181 = PLANE('',#182); +#182 = AXIS2_PLACEMENT_3D('',#183,#184,#185); +#183 = CARTESIAN_POINT('',(-5.127900497023E-16,1.528755336223E-17,0.)); +#184 = DIRECTION('',(0.,0.,1.)); +#185 = DIRECTION('',(1.,0.,0.)); +#186 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#190)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#187,#188,#189)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#187 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#188 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#189 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#190 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#187, + 'distance_accuracy_value','confusion accuracy'); +#191 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#192,#194); +#192 = ( REPRESENTATION_RELATIONSHIP('','',#166,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#193) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#193 = ITEM_DEFINED_TRANSFORMATION('','',#11,#27); +#194 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#195 + ); +#195 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('9','C','',#5,#161,$); +#196 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#163)); +#197 = SHAPE_DEFINITION_REPRESENTATION(#198,#204); +#198 = PRODUCT_DEFINITION_SHAPE('','',#199); +#199 = PRODUCT_DEFINITION('design','',#200,#203); +#200 = PRODUCT_DEFINITION_FORMATION('','',#201); +#201 = PRODUCT('D','D','',(#202)); +#202 = PRODUCT_CONTEXT('',#2,'mechanical'); +#203 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#204 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#205),#224); +#205 = SHELL_BASED_SURFACE_MODEL('',(#206)); +#206 = OPEN_SHELL('',(#207)); +#207 = ADVANCED_FACE('',(#208),#219,.T.); +#208 = FACE_BOUND('',#209,.T.); +#209 = EDGE_LOOP('',(#210)); +#210 = ORIENTED_EDGE('',*,*,#211,.T.); +#211 = EDGE_CURVE('',#212,#212,#214,.T.); +#212 = VERTEX_POINT('',#213); +#213 = CARTESIAN_POINT('',(8.,0.,0.)); +#214 = CIRCLE('',#215,8.); +#215 = AXIS2_PLACEMENT_3D('',#216,#217,#218); +#216 = CARTESIAN_POINT('',(0.,0.,0.)); +#217 = DIRECTION('',(0.,0.,1.)); +#218 = DIRECTION('',(1.,0.,0.)); +#219 = PLANE('',#220); +#220 = AXIS2_PLACEMENT_3D('',#221,#222,#223); +#221 = CARTESIAN_POINT('',(-5.127900497023E-16,1.528755336223E-17,0.)); +#222 = DIRECTION('',(0.,0.,1.)); +#223 = DIRECTION('',(1.,0.,0.)); +#224 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#228)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#225,#226,#227)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#225 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#226 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#227 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#228 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#225, + 'distance_accuracy_value','confusion accuracy'); +#229 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#230,#232); +#230 = ( REPRESENTATION_RELATIONSHIP('','',#204,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#231) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#231 = ITEM_DEFINED_TRANSFORMATION('','',#11,#31); +#232 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#233 + ); +#233 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('10','D','',#5,#199,$); +#234 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#201)); +#235 = SHAPE_DEFINITION_REPRESENTATION(#236,#242); +#236 = PRODUCT_DEFINITION_SHAPE('','',#237); +#237 = PRODUCT_DEFINITION('design','',#238,#241); +#238 = PRODUCT_DEFINITION_FORMATION('','',#239); +#239 = PRODUCT('E','E','',(#240)); +#240 = PRODUCT_CONTEXT('',#2,'mechanical'); +#241 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#242 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#243),#262); +#243 = SHELL_BASED_SURFACE_MODEL('',(#244)); +#244 = OPEN_SHELL('',(#245)); +#245 = ADVANCED_FACE('',(#246),#257,.T.); +#246 = FACE_BOUND('',#247,.T.); +#247 = EDGE_LOOP('',(#248)); +#248 = ORIENTED_EDGE('',*,*,#249,.T.); +#249 = EDGE_CURVE('',#250,#250,#252,.T.); +#250 = VERTEX_POINT('',#251); +#251 = CARTESIAN_POINT('',(8.,0.,0.)); +#252 = CIRCLE('',#253,8.); +#253 = AXIS2_PLACEMENT_3D('',#254,#255,#256); +#254 = CARTESIAN_POINT('',(0.,0.,0.)); +#255 = DIRECTION('',(0.,0.,1.)); +#256 = DIRECTION('',(1.,0.,0.)); +#257 = PLANE('',#258); +#258 = AXIS2_PLACEMENT_3D('',#259,#260,#261); +#259 = CARTESIAN_POINT('',(-5.127900497023E-16,1.528755336223E-17,0.)); +#260 = DIRECTION('',(0.,0.,1.)); +#261 = DIRECTION('',(1.,0.,0.)); +#262 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#266)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#263,#264,#265)) REPRESENTATION_CONTEXT('Context #1', + '3D Context with UNIT and UNCERTAINTY') ); +#263 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#264 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#265 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#266 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#263, + 'distance_accuracy_value','confusion accuracy'); +#267 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#268,#270); +#268 = ( REPRESENTATION_RELATIONSHIP('','',#242,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#269) +SHAPE_REPRESENTATION_RELATIONSHIP() ); +#269 = ITEM_DEFINED_TRANSFORMATION('','',#11,#35); +#270 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#271 + ); +#271 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('11','E','',#5,#237,$); +#272 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#239)); +#273 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#274) + ,#262); +#274 = STYLED_ITEM('color',(#275),#245); +#275 = PRESENTATION_STYLE_ASSIGNMENT((#276,#282)); +#276 = SURFACE_STYLE_USAGE(.BOTH.,#277); +#277 = SURFACE_SIDE_STYLE('',(#278)); +#278 = SURFACE_STYLE_FILL_AREA(#279); +#279 = FILL_AREA_STYLE('',(#280)); +#280 = FILL_AREA_STYLE_COLOUR('',#281); +#281 = COLOUR_RGB('',0.800000010877,0.800000010877,0.800000010877); +#282 = CURVE_STYLE('',#283,POSITIVE_LENGTH_MEASURE(0.1),#284); +#283 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#284 = COLOUR_RGB('',9.803921802644E-02,9.803921802644E-02, + 9.803921802644E-02); +#285 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#286) + ,#148); +#286 = STYLED_ITEM('color',(#287),#131); +#287 = PRESENTATION_STYLE_ASSIGNMENT((#288,#293)); +#288 = SURFACE_STYLE_USAGE(.BOTH.,#289); +#289 = SURFACE_SIDE_STYLE('',(#290)); +#290 = SURFACE_STYLE_FILL_AREA(#291); +#291 = FILL_AREA_STYLE('',(#292)); +#292 = FILL_AREA_STYLE_COLOUR('',#281); +#293 = CURVE_STYLE('',#294,POSITIVE_LENGTH_MEASURE(0.1),#284); +#294 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#295 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#296) + ,#72); +#296 = STYLED_ITEM('color',(#297),#55); +#297 = PRESENTATION_STYLE_ASSIGNMENT((#298,#303)); +#298 = SURFACE_STYLE_USAGE(.BOTH.,#299); +#299 = SURFACE_SIDE_STYLE('',(#300)); +#300 = SURFACE_STYLE_FILL_AREA(#301); +#301 = FILL_AREA_STYLE('',(#302)); +#302 = FILL_AREA_STYLE_COLOUR('',#281); +#303 = CURVE_STYLE('',#304,POSITIVE_LENGTH_MEASURE(0.1),#284); +#304 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#305 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#306) + ,#186); +#306 = STYLED_ITEM('color',(#307),#169); +#307 = PRESENTATION_STYLE_ASSIGNMENT((#308,#313)); +#308 = SURFACE_STYLE_USAGE(.BOTH.,#309); +#309 = SURFACE_SIDE_STYLE('',(#310)); +#310 = SURFACE_STYLE_FILL_AREA(#311); +#311 = FILL_AREA_STYLE('',(#312)); +#312 = FILL_AREA_STYLE_COLOUR('',#281); +#313 = CURVE_STYLE('',#314,POSITIVE_LENGTH_MEASURE(0.1),#284); +#314 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#315 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#316) + ,#224); +#316 = STYLED_ITEM('color',(#317),#207); +#317 = PRESENTATION_STYLE_ASSIGNMENT((#318,#323)); +#318 = SURFACE_STYLE_USAGE(.BOTH.,#319); +#319 = SURFACE_SIDE_STYLE('',(#320)); +#320 = SURFACE_STYLE_FILL_AREA(#321); +#321 = FILL_AREA_STYLE('',(#322)); +#322 = FILL_AREA_STYLE_COLOUR('',#281); +#323 = CURVE_STYLE('',#324,POSITIVE_LENGTH_MEASURE(0.1),#284); +#324 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#325 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#326) + ,#110); +#326 = STYLED_ITEM('color',(#327),#93); +#327 = PRESENTATION_STYLE_ASSIGNMENT((#328,#335)); +#328 = SURFACE_STYLE_USAGE(.BOTH.,#329); +#329 = SURFACE_SIDE_STYLE('',(#330,#333)); +#330 = SURFACE_STYLE_FILL_AREA(#331); +#331 = FILL_AREA_STYLE('',(#332)); +#332 = FILL_AREA_STYLE_COLOUR('',#281); +#333 = SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#281,( + #334)); +#334 = SURFACE_STYLE_TRANSPARENT(0.899999976158); +#335 = CURVE_STYLE('',#336,POSITIVE_LENGTH_MEASURE(0.1),#284); +#336 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +ENDSEC; +END-ISO-10303-21; From 304dabd61d7e986c8e8cd9ec5fd66ae370c3a71a Mon Sep 17 00:00:00 2001 From: adrianarce-elemwave Date: Thu, 2 Oct 2025 17:43:17 +0200 Subject: [PATCH 3/6] Added json files --- partially_filled_coax.areas.json | 20 - testData/agrawal1981/agrawal1981.json | 46 + .../conductor_and_outer_dielectric.json | 16 + testData/empty_coax/empty_coax.json | 16 + testData/five_wires/five_wires.json | 70 ++ .../lansink2024_single_wire_multipolar.json | 16 + testData/nested_coax/nested_coax.json | 22 + .../three_wires_ribbon.20250709-095732.FCBak | Bin 0 -> 15650 bytes .../three_wires_ribbon.FCStd | Bin 15650 -> 21065 bytes .../three_wires_ribbon.json | 40 + .../three_wires_ribbon.step | 914 +++++++----------- testData/two_wires_coax/two_wires_coax.json | 22 + .../two_wires_open.20250709-095732.FCBak | Bin 0 -> 5861 bytes testData/two_wires_open/two_wires_open.FCStd | Bin 5861 -> 6171 bytes testData/two_wires_open/two_wires_open.json | 16 + testData/two_wires_open/two_wires_open.step | 328 +++---- .../unshielded_multiwire.json | 22 + 17 files changed, 748 insertions(+), 800 deletions(-) delete mode 100644 partially_filled_coax.areas.json create mode 100644 testData/agrawal1981/agrawal1981.json create mode 100644 testData/conductor_and_outer_dielectric/conductor_and_outer_dielectric.json create mode 100644 testData/empty_coax/empty_coax.json create mode 100644 testData/five_wires/five_wires.json create mode 100644 testData/lansink2024_single_wire_multipolar/lansink2024_single_wire_multipolar.json create mode 100644 testData/nested_coax/nested_coax.json create mode 100644 testData/three_wires_ribbon/three_wires_ribbon.20250709-095732.FCBak create mode 100644 testData/three_wires_ribbon/three_wires_ribbon.json create mode 100644 testData/two_wires_coax/two_wires_coax.json create mode 100644 testData/two_wires_open/two_wires_open.20250709-095732.FCBak create mode 100644 testData/two_wires_open/two_wires_open.json create mode 100644 testData/unshielded_multiwire/unshielded_multiwire.json diff --git a/partially_filled_coax.areas.json b/partially_filled_coax.areas.json deleted file mode 100644 index 5d26d89..0000000 --- a/partially_filled_coax.areas.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "geometries": [ - { - "geometry": "Vacuum_0", - "area": 4005.5306333269873 - }, - { - "geometry": "Dielectric_1", - "area": 1884.9555921538756 - }, - { - "geometry": "Conductor_0", - "area": 7853.98163397448 - }, - { - "geometry": "Conductor_1", - "area": 1963.49540849362 - } - ] -} \ No newline at end of file diff --git a/testData/agrawal1981/agrawal1981.json b/testData/agrawal1981/agrawal1981.json new file mode 100644 index 0000000..c341a70 --- /dev/null +++ b/testData/agrawal1981/agrawal1981.json @@ -0,0 +1,46 @@ +{ + "CrossSection":[ + { + "name":"Conductor_0", + "material":{ + "type":"PEC" + } + }, + { + "name":"Conductor_001", + "material":{ + "type":"PEC" + } + }, + { + "name":"Conductor_002", + "material":{ + "type":"PEC" + } + }, + { + "name":"Conductor_003", + "material":{ + "type":"PEC" + } + }, + { + "name":"Dielectric_001", + "material":{ + "type":"Dielectric" + } + }, + { + "name":"Dielectric_002", + "material":{ + "type":"Dielectric" + } + }, + { + "name":"Dielectric_003", + "material":{ + "type":"Dielectric" + } + } + ] +} \ No newline at end of file diff --git a/testData/conductor_and_outer_dielectric/conductor_and_outer_dielectric.json b/testData/conductor_and_outer_dielectric/conductor_and_outer_dielectric.json new file mode 100644 index 0000000..cf9fd42 --- /dev/null +++ b/testData/conductor_and_outer_dielectric/conductor_and_outer_dielectric.json @@ -0,0 +1,16 @@ +{ + "CrossSection":[ + { + "name":"Conductor_000", + "material":{ + "type":"PEC" + } + }, + { + "name":"Dielectric_000", + "material":{ + "type":"Dielectric" + } + } + ] +} \ No newline at end of file diff --git a/testData/empty_coax/empty_coax.json b/testData/empty_coax/empty_coax.json new file mode 100644 index 0000000..ac13926 --- /dev/null +++ b/testData/empty_coax/empty_coax.json @@ -0,0 +1,16 @@ +{ + "CrossSection":[ + { + "name":"Conductor_0", + "material":{ + "type":"PEC" + } + }, + { + "name":"Conductor_1", + "material":{ + "type":"PEC" + } + } + ] +} \ No newline at end of file diff --git a/testData/five_wires/five_wires.json b/testData/five_wires/five_wires.json new file mode 100644 index 0000000..baf93aa --- /dev/null +++ b/testData/five_wires/five_wires.json @@ -0,0 +1,70 @@ +{ + "CrossSection":[ + { + "name":"Conductor_0", + "material":{ + "type":"PEC" + } + }, + { + "name":"Conductor_1", + "material":{ + "type":"PEC" + } + }, + { + "name":"Conductor_002", + "material":{ + "type":"PEC" + } + }, + { + "name":"Conductor_003", + "material":{ + "type":"PEC" + } + }, + { + "name":"Conductor_004", + "material":{ + "type":"PEC" + } + }, + { + "name":"Conductor_005", + "material":{ + "type":"PEC" + } + }, + { + "name":"Dielectric_1", + "material":{ + "type":"Dielectric" + } + }, + { + "name":"Dielectric_002", + "material":{ + "type":"Dielectric" + } + }, + { + "name":"Dielectric_003", + "material":{ + "type":"Dielectric" + } + }, + { + "name":"Dielectric_004", + "material":{ + "type":"Dielectric" + } + }, + { + "name":"Dielectric_005", + "material":{ + "type":"Dielectric" + } + } + ] +} \ No newline at end of file diff --git a/testData/lansink2024_single_wire_multipolar/lansink2024_single_wire_multipolar.json b/testData/lansink2024_single_wire_multipolar/lansink2024_single_wire_multipolar.json new file mode 100644 index 0000000..d4a35a4 --- /dev/null +++ b/testData/lansink2024_single_wire_multipolar/lansink2024_single_wire_multipolar.json @@ -0,0 +1,16 @@ +{ + "CrossSection":[ + { + "name":"Conductor_0", + "material":{ + "type":"PEC" + } + }, + { + "name":"Dielectric_0", + "material":{ + "type":"Dielectric" + } + } + ] +} \ No newline at end of file diff --git a/testData/nested_coax/nested_coax.json b/testData/nested_coax/nested_coax.json new file mode 100644 index 0000000..c82189f --- /dev/null +++ b/testData/nested_coax/nested_coax.json @@ -0,0 +1,22 @@ +{ + "CrossSection":[ + { + "name":"Conductor_0", + "material":{ + "type":"PEC" + } + }, + { + "name":"Conductor_1", + "material":{ + "type":"PEC" + } + }, + { + "name":"Conductor_2", + "material":{ + "type":"PEC" + } + } + ] +} \ No newline at end of file diff --git a/testData/three_wires_ribbon/three_wires_ribbon.20250709-095732.FCBak b/testData/three_wires_ribbon/three_wires_ribbon.20250709-095732.FCBak new file mode 100644 index 0000000000000000000000000000000000000000..fcc9ca8d3cc87f5cd58cc6e2f2d8950b5496bc49 GIT binary patch literal 15650 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 WJ$yL^5lGC=*jQLlgz#Sl@c#kbWRH&k literal 0 HcmV?d00001 diff --git a/testData/three_wires_ribbon/three_wires_ribbon.FCStd b/testData/three_wires_ribbon/three_wires_ribbon.FCStd index fcc9ca8d3cc87f5cd58cc6e2f2d8950b5496bc49..d84b8d0f7565bba9608a9b6a1840e05d8dfd9428 100644 GIT binary patch literal 21065 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 X3vjp$@EH}HJ=4d>*2Ye6X88UG#qI{? literal 15650 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 WJ$yL^5lGC=*jQLlgz#Sl@c#kbWRH&k diff --git a/testData/three_wires_ribbon/three_wires_ribbon.json b/testData/three_wires_ribbon/three_wires_ribbon.json new file mode 100644 index 0000000..292fe72 --- /dev/null +++ b/testData/three_wires_ribbon/three_wires_ribbon.json @@ -0,0 +1,40 @@ +{ + "CrossSection":[ + { + "name":"Conductor_000", + "material":{ + "type":"PEC" + } + }, + { + "name":"Conductor_001", + "material":{ + "type":"PEC" + } + }, + { + "name":"Conductor_002", + "material":{ + "type":"PEC" + } + }, + { + "name":"Dielectric_0", + "material":{ + "type":"Dielectric" + } + }, + { + "name":"Dielectric_001", + "material":{ + "type":"Dielectric" + } + }, + { + "name":"Dielectric_002", + "material":{ + "type":"Dielectric" + } + } + ] +} \ No newline at end of file diff --git a/testData/three_wires_ribbon/three_wires_ribbon.step b/testData/three_wires_ribbon/three_wires_ribbon.step index 7e48d70..9e4ad8f 100644 --- a/testData/three_wires_ribbon/three_wires_ribbon.step +++ b/testData/three_wires_ribbon/three_wires_ribbon.step @@ -1,8 +1,8 @@ ISO-10303-21; HEADER; FILE_DESCRIPTION(('FreeCAD Model'),'2;1'); -FILE_NAME('Open CASCADE Shape Model','2023-09-19T20:10:34',(''),(''), - 'Open CASCADE STEP processor 7.6','FreeCAD','Unknown'); +FILE_NAME('Open CASCADE Shape Model','2025-10-02T13:59:31',(''),(''), + 'Open CASCADE STEP processor 7.8','FreeCAD','Unknown'); FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); ENDSEC; DATA; @@ -17,7 +17,7 @@ DATA; #7 = PRODUCT('three_wires_ribbon','three_wires_ribbon','',(#8)); #8 = PRODUCT_CONTEXT('',#2,'mechanical'); #9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); -#10 = SHAPE_REPRESENTATION('',(#11,#15,#19,#23,#27),#31); +#10 = SHAPE_REPRESENTATION('',(#11,#15,#19,#23,#27,#31,#35),#39); #11 = AXIS2_PLACEMENT_3D('',#12,#13,#14); #12 = CARTESIAN_POINT('',(0.,0.,0.)); #13 = DIRECTION('',(0.,0.,1.)); @@ -31,606 +31,382 @@ DATA; #21 = DIRECTION('',(0.,0.,1.)); #22 = DIRECTION('',(1.,0.,0.)); #23 = AXIS2_PLACEMENT_3D('',#24,#25,#26); -#24 = CARTESIAN_POINT('',(0.,0.,0.)); +#24 = CARTESIAN_POINT('',(1.27,0.,0.)); #25 = DIRECTION('',(0.,0.,1.)); #26 = DIRECTION('',(1.,0.,0.)); #27 = AXIS2_PLACEMENT_3D('',#28,#29,#30); -#28 = CARTESIAN_POINT('',(1.27,1.E-16,0.)); +#28 = CARTESIAN_POINT('',(1.27,0.,0.)); #29 = DIRECTION('',(0.,0.,1.)); #30 = DIRECTION('',(1.,0.,0.)); -#31 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#35)) GLOBAL_UNIT_ASSIGNED_CONTEXT( -(#32,#33,#34)) REPRESENTATION_CONTEXT('Context #1', +#31 = AXIS2_PLACEMENT_3D('',#32,#33,#34); +#32 = CARTESIAN_POINT('',(2.54,0.,0.)); +#33 = DIRECTION('',(0.,0.,1.)); +#34 = DIRECTION('',(1.,0.,0.)); +#35 = AXIS2_PLACEMENT_3D('',#36,#37,#38); +#36 = CARTESIAN_POINT('',(2.54,0.,0.)); +#37 = DIRECTION('',(0.,0.,1.)); +#38 = DIRECTION('',(1.,0.,0.)); +#39 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#43)) GLOBAL_UNIT_ASSIGNED_CONTEXT( +(#40,#41,#42)) REPRESENTATION_CONTEXT('Context #1', '3D Context with UNIT and UNCERTAINTY') ); -#32 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); -#33 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); -#34 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); -#35 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#32, +#40 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#41 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#42 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#43 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#40, 'distance_accuracy_value','confusion accuracy'); -#36 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7)); -#37 = SHAPE_DEFINITION_REPRESENTATION(#38,#44); -#38 = PRODUCT_DEFINITION_SHAPE('','',#39); -#39 = PRODUCT_DEFINITION('design','',#40,#43); -#40 = PRODUCT_DEFINITION_FORMATION('','',#41); -#41 = PRODUCT('solid_wire_000','solid_wire_000','',(#42)); -#42 = PRODUCT_CONTEXT('',#2,'mechanical'); -#43 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); -#44 = SHAPE_REPRESENTATION('',(#11,#45,#49),#53); -#45 = AXIS2_PLACEMENT_3D('',#46,#47,#48); -#46 = CARTESIAN_POINT('',(0.,0.,0.)); -#47 = DIRECTION('',(0.,0.,1.)); -#48 = DIRECTION('',(1.,0.,0.)); -#49 = AXIS2_PLACEMENT_3D('',#50,#51,#52); -#50 = CARTESIAN_POINT('',(0.,0.,0.)); -#51 = DIRECTION('',(0.,0.,1.)); -#52 = DIRECTION('',(1.,0.,0.)); -#53 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#57)) GLOBAL_UNIT_ASSIGNED_CONTEXT( -(#54,#55,#56)) REPRESENTATION_CONTEXT('Context #1', +#44 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7)); +#45 = SHAPE_DEFINITION_REPRESENTATION(#46,#52); +#46 = PRODUCT_DEFINITION_SHAPE('','',#47); +#47 = PRODUCT_DEFINITION('design','',#48,#51); +#48 = PRODUCT_DEFINITION_FORMATION('','',#49); +#49 = PRODUCT('Conductor_000','Conductor_000','',(#50)); +#50 = PRODUCT_CONTEXT('',#2,'mechanical'); +#51 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#52 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#53),#72); +#53 = SHELL_BASED_SURFACE_MODEL('',(#54)); +#54 = OPEN_SHELL('',(#55)); +#55 = ADVANCED_FACE('',(#56),#67,.T.); +#56 = FACE_BOUND('',#57,.T.); +#57 = EDGE_LOOP('',(#58)); +#58 = ORIENTED_EDGE('',*,*,#59,.T.); +#59 = EDGE_CURVE('',#60,#60,#62,.T.); +#60 = VERTEX_POINT('',#61); +#61 = CARTESIAN_POINT('',(0.1905,0.,0.)); +#62 = CIRCLE('',#63,0.1905); +#63 = AXIS2_PLACEMENT_3D('',#64,#65,#66); +#64 = CARTESIAN_POINT('',(0.,0.,0.)); +#65 = DIRECTION('',(0.,0.,1.)); +#66 = DIRECTION('',(1.,0.,-0.)); +#67 = PLANE('',#68); +#68 = AXIS2_PLACEMENT_3D('',#69,#70,#71); +#69 = CARTESIAN_POINT('',(-7.009925220121E-18,-7.665819544648E-19,0.)); +#70 = DIRECTION('',(0.,0.,1.)); +#71 = DIRECTION('',(1.,0.,-0.)); +#72 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#76)) GLOBAL_UNIT_ASSIGNED_CONTEXT( +(#73,#74,#75)) REPRESENTATION_CONTEXT('Context #1', '3D Context with UNIT and UNCERTAINTY') ); -#54 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); -#55 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); -#56 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); -#57 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#54, +#73 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#74 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#75 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#76 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#73, 'distance_accuracy_value','confusion accuracy'); -#58 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#59,#61); -#59 = ( REPRESENTATION_RELATIONSHIP('','',#44,#10) -REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#60) +#77 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#78,#80); +#78 = ( REPRESENTATION_RELATIONSHIP('','',#52,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#79) SHAPE_REPRESENTATION_RELATIONSHIP() ); -#60 = ITEM_DEFINED_TRANSFORMATION('','',#11,#15); -#61 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#62); -#62 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('13','solid_wire_000','',#5,#39,$); -#63 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#41)); -#64 = SHAPE_DEFINITION_REPRESENTATION(#65,#71); -#65 = PRODUCT_DEFINITION_SHAPE('','',#66); -#66 = PRODUCT_DEFINITION('design','',#67,#70); -#67 = PRODUCT_DEFINITION_FORMATION('','',#68); -#68 = PRODUCT('Conductor_0','Conductor_0','',(#69)); -#69 = PRODUCT_CONTEXT('',#2,'mechanical'); -#70 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); -#71 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#72),#99); -#72 = SHELL_BASED_SURFACE_MODEL('',(#73)); -#73 = OPEN_SHELL('',(#74)); -#74 = ADVANCED_FACE('',(#75),#88,.T.); -#75 = FACE_BOUND('',#76,.T.); -#76 = EDGE_LOOP('',(#77)); -#77 = ORIENTED_EDGE('',*,*,#78,.T.); -#78 = EDGE_CURVE('',#79,#79,#81,.T.); -#79 = VERTEX_POINT('',#80); -#80 = CARTESIAN_POINT('',(0.1905,0.,0.)); -#81 = SURFACE_CURVE('',#82,(#87),.PCURVE_S1.); -#82 = CIRCLE('',#83,0.1905); -#83 = AXIS2_PLACEMENT_3D('',#84,#85,#86); -#84 = CARTESIAN_POINT('',(0.,0.,0.)); -#85 = DIRECTION('',(0.,0.,1.)); -#86 = DIRECTION('',(1.,0.,-0.)); -#87 = PCURVE('',#88,#93); -#88 = PLANE('',#89); -#89 = AXIS2_PLACEMENT_3D('',#90,#91,#92); -#90 = CARTESIAN_POINT('',(-7.009925220121E-18,-7.665819544648E-19,0.)); -#91 = DIRECTION('',(0.,0.,1.)); -#92 = DIRECTION('',(1.,0.,-0.)); -#93 = DEFINITIONAL_REPRESENTATION('',(#94),#98); -#94 = CIRCLE('',#95,0.1905); -#95 = AXIS2_PLACEMENT_2D('',#96,#97); -#96 = CARTESIAN_POINT('',(7.009925220121E-18,7.665819544648E-19)); -#97 = DIRECTION('',(1.,0.)); -#98 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) -PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' - ) ); -#99 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#103)) GLOBAL_UNIT_ASSIGNED_CONTEXT -((#100,#101,#102)) REPRESENTATION_CONTEXT('Context #1', +#79 = ITEM_DEFINED_TRANSFORMATION('','',#11,#15); +#80 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#81); +#81 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('17','Conductor_000','',#5,#47,$); +#82 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#49)); +#83 = SHAPE_DEFINITION_REPRESENTATION(#84,#90); +#84 = PRODUCT_DEFINITION_SHAPE('','',#85); +#85 = PRODUCT_DEFINITION('design','',#86,#89); +#86 = PRODUCT_DEFINITION_FORMATION('','',#87); +#87 = PRODUCT('Dielectric_0','Dielectric_0','',(#88)); +#88 = PRODUCT_CONTEXT('',#2,'mechanical'); +#89 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#90 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#91),#110); +#91 = SHELL_BASED_SURFACE_MODEL('',(#92)); +#92 = OPEN_SHELL('',(#93)); +#93 = ADVANCED_FACE('',(#94),#105,.T.); +#94 = FACE_BOUND('',#95,.T.); +#95 = EDGE_LOOP('',(#96)); +#96 = ORIENTED_EDGE('',*,*,#97,.T.); +#97 = EDGE_CURVE('',#98,#98,#100,.T.); +#98 = VERTEX_POINT('',#99); +#99 = CARTESIAN_POINT('',(0.4445,0.,0.)); +#100 = CIRCLE('',#101,0.4445); +#101 = AXIS2_PLACEMENT_3D('',#102,#103,#104); +#102 = CARTESIAN_POINT('',(0.,0.,0.)); +#103 = DIRECTION('',(0.,0.,1.)); +#104 = DIRECTION('',(1.,0.,-0.)); +#105 = PLANE('',#106); +#106 = AXIS2_PLACEMENT_3D('',#107,#108,#109); +#107 = CARTESIAN_POINT('',(-1.201701466306E-17,5.888845918762E-18,0.)); +#108 = DIRECTION('',(0.,0.,1.)); +#109 = DIRECTION('',(1.,0.,-0.)); +#110 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#114)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#111,#112,#113)) REPRESENTATION_CONTEXT('Context #1', '3D Context with UNIT and UNCERTAINTY') ); -#100 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); -#101 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); -#102 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); -#103 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#100, +#111 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#112 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#113 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#114 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#111, 'distance_accuracy_value','confusion accuracy'); -#104 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#105,#107); -#105 = ( REPRESENTATION_RELATIONSHIP('','',#71,#44) -REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#106) +#115 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#116,#118); +#116 = ( REPRESENTATION_RELATIONSHIP('','',#90,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#117) SHAPE_REPRESENTATION_RELATIONSHIP() ); -#106 = ITEM_DEFINED_TRANSFORMATION('','',#11,#45); -#107 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#108 +#117 = ITEM_DEFINED_TRANSFORMATION('','',#11,#19); +#118 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#119 ); -#108 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('11','Conductor_0','',#39,#66,$); -#109 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#68)); -#110 = SHAPE_DEFINITION_REPRESENTATION(#111,#117); -#111 = PRODUCT_DEFINITION_SHAPE('','',#112); -#112 = PRODUCT_DEFINITION('design','',#113,#116); -#113 = PRODUCT_DEFINITION_FORMATION('','',#114); -#114 = PRODUCT('Dielectric_0','Dielectric_0','',(#115)); -#115 = PRODUCT_CONTEXT('',#2,'mechanical'); -#116 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); -#117 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#118),#145); -#118 = SHELL_BASED_SURFACE_MODEL('',(#119)); -#119 = OPEN_SHELL('',(#120)); -#120 = ADVANCED_FACE('',(#121),#134,.T.); -#121 = FACE_BOUND('',#122,.T.); -#122 = EDGE_LOOP('',(#123)); -#123 = ORIENTED_EDGE('',*,*,#124,.T.); -#124 = EDGE_CURVE('',#125,#125,#127,.T.); -#125 = VERTEX_POINT('',#126); -#126 = CARTESIAN_POINT('',(0.4445,0.,0.)); -#127 = SURFACE_CURVE('',#128,(#133),.PCURVE_S1.); -#128 = CIRCLE('',#129,0.4445); -#129 = AXIS2_PLACEMENT_3D('',#130,#131,#132); -#130 = CARTESIAN_POINT('',(0.,0.,0.)); -#131 = DIRECTION('',(0.,0.,1.)); -#132 = DIRECTION('',(1.,0.,-0.)); -#133 = PCURVE('',#134,#139); -#134 = PLANE('',#135); -#135 = AXIS2_PLACEMENT_3D('',#136,#137,#138); -#136 = CARTESIAN_POINT('',(-1.201701466306E-17,5.888845918762E-18,0.)); -#137 = DIRECTION('',(0.,0.,1.)); -#138 = DIRECTION('',(1.,0.,-0.)); -#139 = DEFINITIONAL_REPRESENTATION('',(#140),#144); -#140 = CIRCLE('',#141,0.4445); -#141 = AXIS2_PLACEMENT_2D('',#142,#143); -#142 = CARTESIAN_POINT('',(1.201701466306E-17,-5.888845918762E-18)); -#143 = DIRECTION('',(1.,0.)); -#144 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) -PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' - ) ); -#145 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#149)) GLOBAL_UNIT_ASSIGNED_CONTEXT -((#146,#147,#148)) REPRESENTATION_CONTEXT('Context #1', +#119 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('18','Dielectric_0','',#5,#85,$); +#120 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#87)); +#121 = SHAPE_DEFINITION_REPRESENTATION(#122,#128); +#122 = PRODUCT_DEFINITION_SHAPE('','',#123); +#123 = PRODUCT_DEFINITION('design','',#124,#127); +#124 = PRODUCT_DEFINITION_FORMATION('','',#125); +#125 = PRODUCT('Conductor_001','Conductor_001','',(#126)); +#126 = PRODUCT_CONTEXT('',#2,'mechanical'); +#127 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#128 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#129),#148); +#129 = SHELL_BASED_SURFACE_MODEL('',(#130)); +#130 = OPEN_SHELL('',(#131)); +#131 = ADVANCED_FACE('',(#132),#143,.T.); +#132 = FACE_BOUND('',#133,.T.); +#133 = EDGE_LOOP('',(#134)); +#134 = ORIENTED_EDGE('',*,*,#135,.T.); +#135 = EDGE_CURVE('',#136,#136,#138,.T.); +#136 = VERTEX_POINT('',#137); +#137 = CARTESIAN_POINT('',(0.1905,0.,0.)); +#138 = CIRCLE('',#139,0.1905); +#139 = AXIS2_PLACEMENT_3D('',#140,#141,#142); +#140 = CARTESIAN_POINT('',(0.,0.,0.)); +#141 = DIRECTION('',(0.,0.,1.)); +#142 = DIRECTION('',(1.,0.,0.)); +#143 = PLANE('',#144); +#144 = AXIS2_PLACEMENT_3D('',#145,#146,#147); +#145 = CARTESIAN_POINT('',(-7.009925220121E-18,-7.665819544648E-19,0.)); +#146 = DIRECTION('',(0.,0.,1.)); +#147 = DIRECTION('',(1.,0.,0.)); +#148 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#152)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#149,#150,#151)) REPRESENTATION_CONTEXT('Context #1', '3D Context with UNIT and UNCERTAINTY') ); -#146 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); -#147 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); -#148 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); -#149 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#146, +#149 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#150 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#151 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#152 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#149, 'distance_accuracy_value','confusion accuracy'); -#150 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#151,#153); -#151 = ( REPRESENTATION_RELATIONSHIP('','',#117,#44) -REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#152) +#153 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#154,#156); +#154 = ( REPRESENTATION_RELATIONSHIP('','',#128,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#155) SHAPE_REPRESENTATION_RELATIONSHIP() ); -#152 = ITEM_DEFINED_TRANSFORMATION('','',#11,#49); -#153 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#154 +#155 = ITEM_DEFINED_TRANSFORMATION('','',#11,#23); +#156 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#157 ); -#154 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('12','Dielectric_0','',#39,#112,$ +#157 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('19','Conductor_001','',#5,#123,$ ); -#155 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#114)); -#156 = SHAPE_DEFINITION_REPRESENTATION(#157,#163); -#157 = PRODUCT_DEFINITION_SHAPE('','',#158); -#158 = PRODUCT_DEFINITION('design','',#159,#162); -#159 = PRODUCT_DEFINITION_FORMATION('','',#160); -#160 = PRODUCT('solid_wire_001','solid_wire_001','',(#161)); -#161 = PRODUCT_CONTEXT('',#2,'mechanical'); -#162 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); -#163 = SHAPE_REPRESENTATION('',(#11,#164,#168),#172); -#164 = AXIS2_PLACEMENT_3D('',#165,#166,#167); -#165 = CARTESIAN_POINT('',(1.27,0.,0.)); -#166 = DIRECTION('',(0.,0.,1.)); -#167 = DIRECTION('',(1.,0.,0.)); -#168 = AXIS2_PLACEMENT_3D('',#169,#170,#171); -#169 = CARTESIAN_POINT('',(1.27,0.,0.)); -#170 = DIRECTION('',(0.,0.,1.)); -#171 = DIRECTION('',(1.,0.,0.)); -#172 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#176)) GLOBAL_UNIT_ASSIGNED_CONTEXT -((#173,#174,#175)) REPRESENTATION_CONTEXT('Context #1', +#158 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#125)); +#159 = SHAPE_DEFINITION_REPRESENTATION(#160,#166); +#160 = PRODUCT_DEFINITION_SHAPE('','',#161); +#161 = PRODUCT_DEFINITION('design','',#162,#165); +#162 = PRODUCT_DEFINITION_FORMATION('','',#163); +#163 = PRODUCT('Dielectric_001','Dielectric_001','',(#164)); +#164 = PRODUCT_CONTEXT('',#2,'mechanical'); +#165 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#166 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#167),#186); +#167 = SHELL_BASED_SURFACE_MODEL('',(#168)); +#168 = OPEN_SHELL('',(#169)); +#169 = ADVANCED_FACE('',(#170),#181,.T.); +#170 = FACE_BOUND('',#171,.T.); +#171 = EDGE_LOOP('',(#172)); +#172 = ORIENTED_EDGE('',*,*,#173,.T.); +#173 = EDGE_CURVE('',#174,#174,#176,.T.); +#174 = VERTEX_POINT('',#175); +#175 = CARTESIAN_POINT('',(0.4445,0.,0.)); +#176 = CIRCLE('',#177,0.4445); +#177 = AXIS2_PLACEMENT_3D('',#178,#179,#180); +#178 = CARTESIAN_POINT('',(0.,0.,0.)); +#179 = DIRECTION('',(0.,0.,1.)); +#180 = DIRECTION('',(1.,0.,0.)); +#181 = PLANE('',#182); +#182 = AXIS2_PLACEMENT_3D('',#183,#184,#185); +#183 = CARTESIAN_POINT('',(-1.201701466306E-17,5.888845918762E-18,0.)); +#184 = DIRECTION('',(0.,0.,1.)); +#185 = DIRECTION('',(1.,0.,0.)); +#186 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#190)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#187,#188,#189)) REPRESENTATION_CONTEXT('Context #1', '3D Context with UNIT and UNCERTAINTY') ); -#173 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); -#174 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); -#175 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); -#176 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#173, +#187 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#188 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#189 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#190 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#187, 'distance_accuracy_value','confusion accuracy'); -#177 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#178,#180); -#178 = ( REPRESENTATION_RELATIONSHIP('','',#163,#10) -REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#179) +#191 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#192,#194); +#192 = ( REPRESENTATION_RELATIONSHIP('','',#166,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#193) SHAPE_REPRESENTATION_RELATIONSHIP() ); -#179 = ITEM_DEFINED_TRANSFORMATION('','',#11,#19); -#180 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#181 +#193 = ITEM_DEFINED_TRANSFORMATION('','',#11,#27); +#194 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#195 ); -#181 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('16','solid_wire_001','',#5,#158,$ +#195 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('20','Dielectric_001','',#5,#161,$ ); -#182 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#160)); -#183 = SHAPE_DEFINITION_REPRESENTATION(#184,#190); -#184 = PRODUCT_DEFINITION_SHAPE('','',#185); -#185 = PRODUCT_DEFINITION('design','',#186,#189); -#186 = PRODUCT_DEFINITION_FORMATION('','',#187); -#187 = PRODUCT('Conductor_001','Conductor_001','',(#188)); -#188 = PRODUCT_CONTEXT('',#2,'mechanical'); -#189 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); -#190 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#191),#218); -#191 = SHELL_BASED_SURFACE_MODEL('',(#192)); -#192 = OPEN_SHELL('',(#193)); -#193 = ADVANCED_FACE('',(#194),#207,.T.); -#194 = FACE_BOUND('',#195,.T.); -#195 = EDGE_LOOP('',(#196)); -#196 = ORIENTED_EDGE('',*,*,#197,.T.); -#197 = EDGE_CURVE('',#198,#198,#200,.T.); -#198 = VERTEX_POINT('',#199); -#199 = CARTESIAN_POINT('',(0.1905,0.,0.)); -#200 = SURFACE_CURVE('',#201,(#206),.PCURVE_S1.); -#201 = CIRCLE('',#202,0.1905); -#202 = AXIS2_PLACEMENT_3D('',#203,#204,#205); -#203 = CARTESIAN_POINT('',(0.,0.,0.)); -#204 = DIRECTION('',(0.,0.,1.)); -#205 = DIRECTION('',(1.,0.,-0.)); -#206 = PCURVE('',#207,#212); -#207 = PLANE('',#208); -#208 = AXIS2_PLACEMENT_3D('',#209,#210,#211); -#209 = CARTESIAN_POINT('',(-7.009925220121E-18,-7.665819544648E-19,0.)); -#210 = DIRECTION('',(0.,0.,1.)); -#211 = DIRECTION('',(1.,0.,-0.)); -#212 = DEFINITIONAL_REPRESENTATION('',(#213),#217); -#213 = CIRCLE('',#214,0.1905); -#214 = AXIS2_PLACEMENT_2D('',#215,#216); -#215 = CARTESIAN_POINT('',(7.009925220121E-18,7.665819544648E-19)); -#216 = DIRECTION('',(1.,0.)); -#217 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) -PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' - ) ); -#218 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#222)) GLOBAL_UNIT_ASSIGNED_CONTEXT -((#219,#220,#221)) REPRESENTATION_CONTEXT('Context #1', +#196 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#163)); +#197 = SHAPE_DEFINITION_REPRESENTATION(#198,#204); +#198 = PRODUCT_DEFINITION_SHAPE('','',#199); +#199 = PRODUCT_DEFINITION('design','',#200,#203); +#200 = PRODUCT_DEFINITION_FORMATION('','',#201); +#201 = PRODUCT('Conductor_002','Conductor_002','',(#202)); +#202 = PRODUCT_CONTEXT('',#2,'mechanical'); +#203 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#204 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#205),#224); +#205 = SHELL_BASED_SURFACE_MODEL('',(#206)); +#206 = OPEN_SHELL('',(#207)); +#207 = ADVANCED_FACE('',(#208),#219,.T.); +#208 = FACE_BOUND('',#209,.T.); +#209 = EDGE_LOOP('',(#210)); +#210 = ORIENTED_EDGE('',*,*,#211,.T.); +#211 = EDGE_CURVE('',#212,#212,#214,.T.); +#212 = VERTEX_POINT('',#213); +#213 = CARTESIAN_POINT('',(0.1905,0.,0.)); +#214 = CIRCLE('',#215,0.1905); +#215 = AXIS2_PLACEMENT_3D('',#216,#217,#218); +#216 = CARTESIAN_POINT('',(0.,0.,0.)); +#217 = DIRECTION('',(0.,0.,1.)); +#218 = DIRECTION('',(1.,0.,0.)); +#219 = PLANE('',#220); +#220 = AXIS2_PLACEMENT_3D('',#221,#222,#223); +#221 = CARTESIAN_POINT('',(-7.009925220121E-18,-7.665819544648E-19,0.)); +#222 = DIRECTION('',(0.,0.,1.)); +#223 = DIRECTION('',(1.,0.,0.)); +#224 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#228)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#225,#226,#227)) REPRESENTATION_CONTEXT('Context #1', '3D Context with UNIT and UNCERTAINTY') ); -#219 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); -#220 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); -#221 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); -#222 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#219, +#225 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#226 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#227 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#228 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#225, 'distance_accuracy_value','confusion accuracy'); -#223 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#224,#226); -#224 = ( REPRESENTATION_RELATIONSHIP('','',#190,#163) -REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#225) +#229 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#230,#232); +#230 = ( REPRESENTATION_RELATIONSHIP('','',#204,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#231) SHAPE_REPRESENTATION_RELATIONSHIP() ); -#225 = ITEM_DEFINED_TRANSFORMATION('','',#11,#164); -#226 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#227 +#231 = ITEM_DEFINED_TRANSFORMATION('','',#11,#31); +#232 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#233 ); -#227 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('14','Conductor_001','',#158,#185, - $); -#228 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#187)); -#229 = SHAPE_DEFINITION_REPRESENTATION(#230,#236); -#230 = PRODUCT_DEFINITION_SHAPE('','',#231); -#231 = PRODUCT_DEFINITION('design','',#232,#235); -#232 = PRODUCT_DEFINITION_FORMATION('','',#233); -#233 = PRODUCT('Dielectric_001','Dielectric_001','',(#234)); -#234 = PRODUCT_CONTEXT('',#2,'mechanical'); -#235 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); -#236 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#237),#264); -#237 = SHELL_BASED_SURFACE_MODEL('',(#238)); -#238 = OPEN_SHELL('',(#239)); -#239 = ADVANCED_FACE('',(#240),#253,.T.); -#240 = FACE_BOUND('',#241,.T.); -#241 = EDGE_LOOP('',(#242)); -#242 = ORIENTED_EDGE('',*,*,#243,.T.); -#243 = EDGE_CURVE('',#244,#244,#246,.T.); -#244 = VERTEX_POINT('',#245); -#245 = CARTESIAN_POINT('',(0.4445,0.,0.)); -#246 = SURFACE_CURVE('',#247,(#252),.PCURVE_S1.); -#247 = CIRCLE('',#248,0.4445); -#248 = AXIS2_PLACEMENT_3D('',#249,#250,#251); -#249 = CARTESIAN_POINT('',(0.,0.,0.)); -#250 = DIRECTION('',(0.,0.,1.)); -#251 = DIRECTION('',(1.,0.,-0.)); -#252 = PCURVE('',#253,#258); -#253 = PLANE('',#254); -#254 = AXIS2_PLACEMENT_3D('',#255,#256,#257); -#255 = CARTESIAN_POINT('',(-1.201701466306E-17,5.888845918762E-18,0.)); -#256 = DIRECTION('',(0.,0.,1.)); -#257 = DIRECTION('',(1.,0.,-0.)); -#258 = DEFINITIONAL_REPRESENTATION('',(#259),#263); -#259 = CIRCLE('',#260,0.4445); -#260 = AXIS2_PLACEMENT_2D('',#261,#262); -#261 = CARTESIAN_POINT('',(1.201701466306E-17,-5.888845918762E-18)); -#262 = DIRECTION('',(1.,0.)); -#263 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) -PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' - ) ); -#264 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#268)) GLOBAL_UNIT_ASSIGNED_CONTEXT -((#265,#266,#267)) REPRESENTATION_CONTEXT('Context #1', - '3D Context with UNIT and UNCERTAINTY') ); -#265 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); -#266 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); -#267 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); -#268 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#265, - 'distance_accuracy_value','confusion accuracy'); -#269 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#270,#272); -#270 = ( REPRESENTATION_RELATIONSHIP('','',#236,#163) -REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#271) -SHAPE_REPRESENTATION_RELATIONSHIP() ); -#271 = ITEM_DEFINED_TRANSFORMATION('','',#11,#168); -#272 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#273 - ); -#273 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('15','Dielectric_001','',#158,#231 - ,$); -#274 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#233)); -#275 = SHAPE_DEFINITION_REPRESENTATION(#276,#282); -#276 = PRODUCT_DEFINITION_SHAPE('','',#277); -#277 = PRODUCT_DEFINITION('design','',#278,#281); -#278 = PRODUCT_DEFINITION_FORMATION('','',#279); -#279 = PRODUCT('solid_wire_002','solid_wire_002','',(#280)); -#280 = PRODUCT_CONTEXT('',#2,'mechanical'); -#281 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); -#282 = SHAPE_REPRESENTATION('',(#11,#283,#287),#291); -#283 = AXIS2_PLACEMENT_3D('',#284,#285,#286); -#284 = CARTESIAN_POINT('',(2.54,0.,0.)); -#285 = DIRECTION('',(0.,0.,1.)); -#286 = DIRECTION('',(1.,0.,0.)); -#287 = AXIS2_PLACEMENT_3D('',#288,#289,#290); -#288 = CARTESIAN_POINT('',(2.54,0.,0.)); -#289 = DIRECTION('',(0.,0.,1.)); -#290 = DIRECTION('',(1.,0.,0.)); -#291 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#295)) GLOBAL_UNIT_ASSIGNED_CONTEXT -((#292,#293,#294)) REPRESENTATION_CONTEXT('Context #1', - '3D Context with UNIT and UNCERTAINTY') ); -#292 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); -#293 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); -#294 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); -#295 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#292, - 'distance_accuracy_value','confusion accuracy'); -#296 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#297,#299); -#297 = ( REPRESENTATION_RELATIONSHIP('','',#282,#10) -REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#298) -SHAPE_REPRESENTATION_RELATIONSHIP() ); -#298 = ITEM_DEFINED_TRANSFORMATION('','',#11,#23); -#299 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#300 - ); -#300 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('19','solid_wire_002','',#5,#277,$ +#233 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('21','Conductor_002','',#5,#199,$ ); -#301 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#279)); -#302 = SHAPE_DEFINITION_REPRESENTATION(#303,#309); -#303 = PRODUCT_DEFINITION_SHAPE('','',#304); -#304 = PRODUCT_DEFINITION('design','',#305,#308); -#305 = PRODUCT_DEFINITION_FORMATION('','',#306); -#306 = PRODUCT('Conductor_002','Conductor_002','',(#307)); -#307 = PRODUCT_CONTEXT('',#2,'mechanical'); -#308 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); -#309 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#310),#337); -#310 = SHELL_BASED_SURFACE_MODEL('',(#311)); -#311 = OPEN_SHELL('',(#312)); -#312 = ADVANCED_FACE('',(#313),#326,.T.); -#313 = FACE_BOUND('',#314,.T.); -#314 = EDGE_LOOP('',(#315)); -#315 = ORIENTED_EDGE('',*,*,#316,.T.); -#316 = EDGE_CURVE('',#317,#317,#319,.T.); -#317 = VERTEX_POINT('',#318); -#318 = CARTESIAN_POINT('',(0.1905,0.,0.)); -#319 = SURFACE_CURVE('',#320,(#325),.PCURVE_S1.); -#320 = CIRCLE('',#321,0.1905); -#321 = AXIS2_PLACEMENT_3D('',#322,#323,#324); -#322 = CARTESIAN_POINT('',(0.,0.,0.)); -#323 = DIRECTION('',(0.,0.,1.)); -#324 = DIRECTION('',(1.,0.,-0.)); -#325 = PCURVE('',#326,#331); -#326 = PLANE('',#327); -#327 = AXIS2_PLACEMENT_3D('',#328,#329,#330); -#328 = CARTESIAN_POINT('',(-7.009925220121E-18,-7.665819544648E-19,0.)); -#329 = DIRECTION('',(0.,0.,1.)); -#330 = DIRECTION('',(1.,0.,-0.)); -#331 = DEFINITIONAL_REPRESENTATION('',(#332),#336); -#332 = CIRCLE('',#333,0.1905); -#333 = AXIS2_PLACEMENT_2D('',#334,#335); -#334 = CARTESIAN_POINT('',(7.009925220121E-18,7.665819544648E-19)); -#335 = DIRECTION('',(1.,0.)); -#336 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) -PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' - ) ); -#337 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#341)) GLOBAL_UNIT_ASSIGNED_CONTEXT -((#338,#339,#340)) REPRESENTATION_CONTEXT('Context #1', +#234 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#201)); +#235 = SHAPE_DEFINITION_REPRESENTATION(#236,#242); +#236 = PRODUCT_DEFINITION_SHAPE('','',#237); +#237 = PRODUCT_DEFINITION('design','',#238,#241); +#238 = PRODUCT_DEFINITION_FORMATION('','',#239); +#239 = PRODUCT('Dielectric_002','Dielectric_002','',(#240)); +#240 = PRODUCT_CONTEXT('',#2,'mechanical'); +#241 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); +#242 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#243),#262); +#243 = SHELL_BASED_SURFACE_MODEL('',(#244)); +#244 = OPEN_SHELL('',(#245)); +#245 = ADVANCED_FACE('',(#246),#257,.T.); +#246 = FACE_BOUND('',#247,.T.); +#247 = EDGE_LOOP('',(#248)); +#248 = ORIENTED_EDGE('',*,*,#249,.T.); +#249 = EDGE_CURVE('',#250,#250,#252,.T.); +#250 = VERTEX_POINT('',#251); +#251 = CARTESIAN_POINT('',(0.4445,0.,0.)); +#252 = CIRCLE('',#253,0.4445); +#253 = AXIS2_PLACEMENT_3D('',#254,#255,#256); +#254 = CARTESIAN_POINT('',(0.,0.,0.)); +#255 = DIRECTION('',(0.,0.,1.)); +#256 = DIRECTION('',(1.,0.,0.)); +#257 = PLANE('',#258); +#258 = AXIS2_PLACEMENT_3D('',#259,#260,#261); +#259 = CARTESIAN_POINT('',(-1.201701466306E-17,5.888845918762E-18,0.)); +#260 = DIRECTION('',(0.,0.,1.)); +#261 = DIRECTION('',(1.,0.,0.)); +#262 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#266)) GLOBAL_UNIT_ASSIGNED_CONTEXT +((#263,#264,#265)) REPRESENTATION_CONTEXT('Context #1', '3D Context with UNIT and UNCERTAINTY') ); -#338 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); -#339 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); -#340 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); -#341 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#338, +#263 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#264 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#265 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#266 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#263, 'distance_accuracy_value','confusion accuracy'); -#342 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#343,#345); -#343 = ( REPRESENTATION_RELATIONSHIP('','',#309,#282) -REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#344) +#267 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#268,#270); +#268 = ( REPRESENTATION_RELATIONSHIP('','',#242,#10) +REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#269) SHAPE_REPRESENTATION_RELATIONSHIP() ); -#344 = ITEM_DEFINED_TRANSFORMATION('','',#11,#283); -#345 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#346 +#269 = ITEM_DEFINED_TRANSFORMATION('','',#11,#35); +#270 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#271 ); -#346 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('17','Conductor_002','',#277,#304, - $); -#347 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#306)); -#348 = SHAPE_DEFINITION_REPRESENTATION(#349,#355); -#349 = PRODUCT_DEFINITION_SHAPE('','',#350); -#350 = PRODUCT_DEFINITION('design','',#351,#354); -#351 = PRODUCT_DEFINITION_FORMATION('','',#352); -#352 = PRODUCT('Dielectric_002','Dielectric_002','',(#353)); -#353 = PRODUCT_CONTEXT('',#2,'mechanical'); -#354 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); -#355 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#356),#383); -#356 = SHELL_BASED_SURFACE_MODEL('',(#357)); -#357 = OPEN_SHELL('',(#358)); -#358 = ADVANCED_FACE('',(#359),#372,.T.); -#359 = FACE_BOUND('',#360,.T.); -#360 = EDGE_LOOP('',(#361)); -#361 = ORIENTED_EDGE('',*,*,#362,.T.); -#362 = EDGE_CURVE('',#363,#363,#365,.T.); -#363 = VERTEX_POINT('',#364); -#364 = CARTESIAN_POINT('',(0.4445,0.,0.)); -#365 = SURFACE_CURVE('',#366,(#371),.PCURVE_S1.); -#366 = CIRCLE('',#367,0.4445); -#367 = AXIS2_PLACEMENT_3D('',#368,#369,#370); -#368 = CARTESIAN_POINT('',(0.,0.,0.)); -#369 = DIRECTION('',(0.,0.,1.)); -#370 = DIRECTION('',(1.,0.,-0.)); -#371 = PCURVE('',#372,#377); -#372 = PLANE('',#373); -#373 = AXIS2_PLACEMENT_3D('',#374,#375,#376); -#374 = CARTESIAN_POINT('',(-1.201701466306E-17,5.888845918762E-18,0.)); -#375 = DIRECTION('',(0.,0.,1.)); -#376 = DIRECTION('',(1.,0.,-0.)); -#377 = DEFINITIONAL_REPRESENTATION('',(#378),#382); -#378 = CIRCLE('',#379,0.4445); -#379 = AXIS2_PLACEMENT_2D('',#380,#381); -#380 = CARTESIAN_POINT('',(1.201701466306E-17,-5.888845918762E-18)); -#381 = DIRECTION('',(1.,0.)); -#382 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) -PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' - ) ); -#383 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#387)) GLOBAL_UNIT_ASSIGNED_CONTEXT -((#384,#385,#386)) REPRESENTATION_CONTEXT('Context #1', - '3D Context with UNIT and UNCERTAINTY') ); -#384 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); -#385 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); -#386 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); -#387 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#384, - 'distance_accuracy_value','confusion accuracy'); -#388 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#389,#391); -#389 = ( REPRESENTATION_RELATIONSHIP('','',#355,#282) -REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#390) -SHAPE_REPRESENTATION_RELATIONSHIP() ); -#390 = ITEM_DEFINED_TRANSFORMATION('','',#11,#287); -#391 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#392 - ); -#392 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('18','Dielectric_002','',#277,#350 - ,$); -#393 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#352)); -#394 = SHAPE_DEFINITION_REPRESENTATION(#395,#401); -#395 = PRODUCT_DEFINITION_SHAPE('','',#396); -#396 = PRODUCT_DEFINITION('design','',#397,#400); -#397 = PRODUCT_DEFINITION_FORMATION('','',#398); -#398 = PRODUCT('OpenBoundary_0','OpenBoundary_0','',(#399)); -#399 = PRODUCT_CONTEXT('',#2,'mechanical'); -#400 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); -#401 = MANIFOLD_SURFACE_SHAPE_REPRESENTATION('',(#11,#402),#429); -#402 = SHELL_BASED_SURFACE_MODEL('',(#403)); -#403 = OPEN_SHELL('',(#404)); -#404 = ADVANCED_FACE('',(#405),#418,.T.); -#405 = FACE_BOUND('',#406,.T.); -#406 = EDGE_LOOP('',(#407)); -#407 = ORIENTED_EDGE('',*,*,#408,.T.); -#408 = EDGE_CURVE('',#409,#409,#411,.T.); -#409 = VERTEX_POINT('',#410); -#410 = CARTESIAN_POINT('',(150.,0.,0.)); -#411 = SURFACE_CURVE('',#412,(#417),.PCURVE_S1.); -#412 = CIRCLE('',#413,150.); -#413 = AXIS2_PLACEMENT_3D('',#414,#415,#416); -#414 = CARTESIAN_POINT('',(0.,0.,0.)); -#415 = DIRECTION('',(0.,0.,1.)); -#416 = DIRECTION('',(1.,0.,0.)); -#417 = PCURVE('',#418,#423); -#418 = PLANE('',#419); -#419 = AXIS2_PLACEMENT_3D('',#420,#421,#422); -#420 = CARTESIAN_POINT('',(-2.333764492867E-14,3.211823975732E-15,0.)); -#421 = DIRECTION('',(0.,0.,1.)); -#422 = DIRECTION('',(1.,0.,0.)); -#423 = DEFINITIONAL_REPRESENTATION('',(#424),#428); -#424 = CIRCLE('',#425,150.); -#425 = AXIS2_PLACEMENT_2D('',#426,#427); -#426 = CARTESIAN_POINT('',(2.333764492867E-14,-3.211823975732E-15)); -#427 = DIRECTION('',(1.,0.)); -#428 = ( GEOMETRIC_REPRESENTATION_CONTEXT(2) -PARAMETRIC_REPRESENTATION_CONTEXT() REPRESENTATION_CONTEXT('2D SPACE','' - ) ); -#429 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) -GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#433)) GLOBAL_UNIT_ASSIGNED_CONTEXT -((#430,#431,#432)) REPRESENTATION_CONTEXT('Context #1', - '3D Context with UNIT and UNCERTAINTY') ); -#430 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); -#431 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); -#432 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); -#433 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#430, - 'distance_accuracy_value','confusion accuracy'); -#434 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#435,#437); -#435 = ( REPRESENTATION_RELATIONSHIP('','',#401,#10) -REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#436) -SHAPE_REPRESENTATION_RELATIONSHIP() ); -#436 = ITEM_DEFINED_TRANSFORMATION('','',#11,#27); -#437 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#438 +#271 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('22','Dielectric_002','',#5,#237,$ ); -#438 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('20','OpenBoundary_0','',#5,#396,$); -#439 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#398)); -#440 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#441) - ,#145); -#441 = STYLED_ITEM('color',(#442),#120); -#442 = PRESENTATION_STYLE_ASSIGNMENT((#443,#451)); -#443 = SURFACE_STYLE_USAGE(.BOTH.,#444); -#444 = SURFACE_SIDE_STYLE('',(#445,#449)); -#445 = SURFACE_STYLE_FILL_AREA(#446); -#446 = FILL_AREA_STYLE('',(#447)); -#447 = FILL_AREA_STYLE_COLOUR('',#448); -#448 = DRAUGHTING_PRE_DEFINED_COLOUR('red'); -#449 = SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#448,( - #450)); -#450 = SURFACE_STYLE_TRANSPARENT(0.899999976158); -#451 = CURVE_STYLE('',#452,POSITIVE_LENGTH_MEASURE(0.1),#453); -#452 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); -#453 = COLOUR_RGB('',9.803921802644E-02,9.803921802644E-02, +#272 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#239)); +#273 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#274) + ,#186); +#274 = STYLED_ITEM('color',(#275),#169); +#275 = PRESENTATION_STYLE_ASSIGNMENT((#276,#284)); +#276 = SURFACE_STYLE_USAGE(.BOTH.,#277); +#277 = SURFACE_SIDE_STYLE('',(#278,#282)); +#278 = SURFACE_STYLE_FILL_AREA(#279); +#279 = FILL_AREA_STYLE('',(#280)); +#280 = FILL_AREA_STYLE_COLOUR('',#281); +#281 = DRAUGHTING_PRE_DEFINED_COLOUR('red'); +#282 = SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#281,( + #283)); +#283 = SURFACE_STYLE_TRANSPARENT(0.899999976158); +#284 = CURVE_STYLE('',#285,POSITIVE_LENGTH_MEASURE(0.1),#286); +#285 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#286 = COLOUR_RGB('',9.803921802644E-02,9.803921802644E-02, 9.803921802644E-02); -#454 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#455) - ,#337); -#455 = STYLED_ITEM('color',(#456),#312); -#456 = PRESENTATION_STYLE_ASSIGNMENT((#457,#463)); -#457 = SURFACE_STYLE_USAGE(.BOTH.,#458); -#458 = SURFACE_SIDE_STYLE('',(#459)); -#459 = SURFACE_STYLE_FILL_AREA(#460); -#460 = FILL_AREA_STYLE('',(#461)); -#461 = FILL_AREA_STYLE_COLOUR('',#462); -#462 = COLOUR_RGB('',1.,0.333333345507,0.); -#463 = CURVE_STYLE('',#464,POSITIVE_LENGTH_MEASURE(0.1),#453); -#464 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); -#465 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#466) - ,#264); -#466 = STYLED_ITEM('color',(#467),#239); -#467 = PRESENTATION_STYLE_ASSIGNMENT((#468,#475)); -#468 = SURFACE_STYLE_USAGE(.BOTH.,#469); -#469 = SURFACE_SIDE_STYLE('',(#470,#473)); -#470 = SURFACE_STYLE_FILL_AREA(#471); -#471 = FILL_AREA_STYLE('',(#472)); -#472 = FILL_AREA_STYLE_COLOUR('',#448); -#473 = SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#448,( - #474)); -#474 = SURFACE_STYLE_TRANSPARENT(0.899999976158); -#475 = CURVE_STYLE('',#476,POSITIVE_LENGTH_MEASURE(0.1),#453); -#476 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); -#477 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#478) - ,#383); -#478 = STYLED_ITEM('color',(#479),#358); -#479 = PRESENTATION_STYLE_ASSIGNMENT((#480,#487)); -#480 = SURFACE_STYLE_USAGE(.BOTH.,#481); -#481 = SURFACE_SIDE_STYLE('',(#482,#485)); -#482 = SURFACE_STYLE_FILL_AREA(#483); -#483 = FILL_AREA_STYLE('',(#484)); -#484 = FILL_AREA_STYLE_COLOUR('',#448); -#485 = SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#448,( - #486)); -#486 = SURFACE_STYLE_TRANSPARENT(0.899999976158); -#487 = CURVE_STYLE('',#488,POSITIVE_LENGTH_MEASURE(0.1),#453); -#488 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); -#489 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#490) - ,#99); -#490 = STYLED_ITEM('color',(#491),#74); -#491 = PRESENTATION_STYLE_ASSIGNMENT((#492,#497)); -#492 = SURFACE_STYLE_USAGE(.BOTH.,#493); -#493 = SURFACE_SIDE_STYLE('',(#494)); -#494 = SURFACE_STYLE_FILL_AREA(#495); -#495 = FILL_AREA_STYLE('',(#496)); -#496 = FILL_AREA_STYLE_COLOUR('',#462); -#497 = CURVE_STYLE('',#498,POSITIVE_LENGTH_MEASURE(0.1),#453); -#498 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); -#499 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#500) - ,#429); -#500 = STYLED_ITEM('color',(#501),#404); -#501 = PRESENTATION_STYLE_ASSIGNMENT((#502,#508)); -#502 = SURFACE_STYLE_USAGE(.BOTH.,#503); -#503 = SURFACE_SIDE_STYLE('',(#504)); -#504 = SURFACE_STYLE_FILL_AREA(#505); -#505 = FILL_AREA_STYLE('',(#506)); -#506 = FILL_AREA_STYLE_COLOUR('',#507); -#507 = COLOUR_RGB('',0.800000010877,0.800000010877,0.800000010877); -#508 = CURVE_STYLE('',#509,POSITIVE_LENGTH_MEASURE(0.1),#453); -#509 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); -#510 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#511) - ,#218); -#511 = STYLED_ITEM('color',(#512),#193); -#512 = PRESENTATION_STYLE_ASSIGNMENT((#513,#518)); -#513 = SURFACE_STYLE_USAGE(.BOTH.,#514); -#514 = SURFACE_SIDE_STYLE('',(#515)); -#515 = SURFACE_STYLE_FILL_AREA(#516); -#516 = FILL_AREA_STYLE('',(#517)); -#517 = FILL_AREA_STYLE_COLOUR('',#462); -#518 = CURVE_STYLE('',#519,POSITIVE_LENGTH_MEASURE(0.1),#453); -#519 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#287 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#288) + ,#110); +#288 = STYLED_ITEM('color',(#289),#93); +#289 = PRESENTATION_STYLE_ASSIGNMENT((#290,#297)); +#290 = SURFACE_STYLE_USAGE(.BOTH.,#291); +#291 = SURFACE_SIDE_STYLE('',(#292,#295)); +#292 = SURFACE_STYLE_FILL_AREA(#293); +#293 = FILL_AREA_STYLE('',(#294)); +#294 = FILL_AREA_STYLE_COLOUR('',#281); +#295 = SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#281,( + #296)); +#296 = SURFACE_STYLE_TRANSPARENT(0.899999976158); +#297 = CURVE_STYLE('',#298,POSITIVE_LENGTH_MEASURE(0.1),#286); +#298 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#299 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#300) + ,#224); +#300 = STYLED_ITEM('color',(#301),#207); +#301 = PRESENTATION_STYLE_ASSIGNMENT((#302,#308)); +#302 = SURFACE_STYLE_USAGE(.BOTH.,#303); +#303 = SURFACE_SIDE_STYLE('',(#304)); +#304 = SURFACE_STYLE_FILL_AREA(#305); +#305 = FILL_AREA_STYLE('',(#306)); +#306 = FILL_AREA_STYLE_COLOUR('',#307); +#307 = COLOUR_RGB('',1.,0.333333345507,0.); +#308 = CURVE_STYLE('',#309,POSITIVE_LENGTH_MEASURE(0.1),#286); +#309 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#310 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#311) + ,#148); +#311 = STYLED_ITEM('color',(#312),#131); +#312 = PRESENTATION_STYLE_ASSIGNMENT((#313,#318)); +#313 = SURFACE_STYLE_USAGE(.BOTH.,#314); +#314 = SURFACE_SIDE_STYLE('',(#315)); +#315 = SURFACE_STYLE_FILL_AREA(#316); +#316 = FILL_AREA_STYLE('',(#317)); +#317 = FILL_AREA_STYLE_COLOUR('',#307); +#318 = CURVE_STYLE('',#319,POSITIVE_LENGTH_MEASURE(0.1),#286); +#319 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#320 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#321) + ,#72); +#321 = STYLED_ITEM('color',(#322),#55); +#322 = PRESENTATION_STYLE_ASSIGNMENT((#323,#328)); +#323 = SURFACE_STYLE_USAGE(.BOTH.,#324); +#324 = SURFACE_SIDE_STYLE('',(#325)); +#325 = SURFACE_STYLE_FILL_AREA(#326); +#326 = FILL_AREA_STYLE('',(#327)); +#327 = FILL_AREA_STYLE_COLOUR('',#307); +#328 = CURVE_STYLE('',#329,POSITIVE_LENGTH_MEASURE(0.1),#286); +#329 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); +#330 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#331) + ,#262); +#331 = STYLED_ITEM('color',(#332),#245); +#332 = PRESENTATION_STYLE_ASSIGNMENT((#333,#340)); +#333 = SURFACE_STYLE_USAGE(.BOTH.,#334); +#334 = SURFACE_SIDE_STYLE('',(#335,#338)); +#335 = SURFACE_STYLE_FILL_AREA(#336); +#336 = FILL_AREA_STYLE('',(#337)); +#337 = FILL_AREA_STYLE_COLOUR('',#281); +#338 = SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#281,( + #339)); +#339 = SURFACE_STYLE_TRANSPARENT(0.899999976158); +#340 = CURVE_STYLE('',#341,POSITIVE_LENGTH_MEASURE(0.1),#286); +#341 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); ENDSEC; END-ISO-10303-21; diff --git a/testData/two_wires_coax/two_wires_coax.json b/testData/two_wires_coax/two_wires_coax.json new file mode 100644 index 0000000..c82189f --- /dev/null +++ b/testData/two_wires_coax/two_wires_coax.json @@ -0,0 +1,22 @@ +{ + "CrossSection":[ + { + "name":"Conductor_0", + "material":{ + "type":"PEC" + } + }, + { + "name":"Conductor_1", + "material":{ + "type":"PEC" + } + }, + { + "name":"Conductor_2", + "material":{ + "type":"PEC" + } + } + ] +} \ No newline at end of file diff --git a/testData/two_wires_open/two_wires_open.20250709-095732.FCBak b/testData/two_wires_open/two_wires_open.20250709-095732.FCBak new file mode 100644 index 0000000000000000000000000000000000000000..56cbc226789ebedefe441c039f191bd15fc3208c GIT binary patch literal 5861 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 Vtto5{4nW?;!a_z`mgev3{68IXq^bY_ literal 5861 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 Date: Thu, 2 Oct 2025 17:43:49 +0200 Subject: [PATCH 4/6] Add label to exported json --- src/AreaExporterService.py | 13 +++++--- test/test_AreaExporterService.py | 56 +++++++++++++++++++++++++++++--- 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/AreaExporterService.py b/src/AreaExporterService.py index c11401d..4d8e9d3 100644 --- a/src/AreaExporterService.py +++ b/src/AreaExporterService.py @@ -11,18 +11,23 @@ def __init__(self): "geometries": [] } - def addComputedArea(self, geometry:str, area:float): + def addComputedArea(self, geometry:str, label:str, area:float): geometry:Dict ={ "geometry": geometry, - "area": area, + "label": label, + "area": round(area,6), } self.computedAreas['geometries'].append(geometry) - def addPhysicalModelOfDimension(self, dimension=2): + def addPhysicalModelOfDimension(self, mappedElements:Dict[str,str], dimension=2): physicalGroups = gmsh.model.getPhysicalGroups(dimension) for physicalGroup in physicalGroups: entityTags = gmsh.model.getEntitiesForPhysicalGroup(*physicalGroup) geometryName = gmsh.model.getPhysicalName(*physicalGroup) + label = '' + for key, geometry in mappedElements.items(): + if geometry == geometryName: + label = key for tag in entityTags: if dimension == 1: rad = gmsh.model.occ.getMass(dimension, tag) / (2*np.pi) @@ -30,7 +35,7 @@ def addPhysicalModelOfDimension(self, dimension=2): if dimension == 2: area = gmsh.model.occ.getMass(dimension, tag) if geometryName != AreaExporterService._EMPTY_NAME_CASE: - self.addComputedArea(geometryName, area) + self.addComputedArea(geometryName, label, area) def exportToJson(self, exportFileName:str): with open(exportFileName + ".areas.json", 'w') as f: diff --git a/test/test_AreaExporterService.py b/test/test_AreaExporterService.py index 21fe124..fe40ecf 100644 --- a/test/test_AreaExporterService.py +++ b/test/test_AreaExporterService.py @@ -23,15 +23,15 @@ def setUp(self): def tearDown(self): gmsh.finalize() - def inputFileFromCaseName(self, caseName): + def inputFileFromCaseName(self, caseName) -> None: return self.testdataPath + caseName + '/' + caseName + ".step" def testAreaExporterReturnsTrueValues(self): caseName = 'five_wires' - Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) + mappedElements = Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) areaExporter = AreaExporterService() - areaExporter.addPhysicalModelOfDimension(dimension=1) - areaExporter.addPhysicalModelOfDimension(dimension=2) + areaExporter.addPhysicalModelOfDimension(mappedElements=mappedElements, dimension=1) + areaExporter.addPhysicalModelOfDimension(mappedElements=mappedElements, dimension=2) geometries = areaExporter.computedAreas['geometries'] internalElements = [] @@ -43,3 +43,51 @@ def testAreaExporterReturnsTrueValues(self): areaElements = self.sumAreasFromList(internalElements) self.assertAlmostEqual(totalArea, areaElements) + + def testJsonFormat(self) -> None: + caseName = 'DielectricUnshieldedPair' + mappedElements = Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) + areaExporter = AreaExporterService() + areaExporter.addPhysicalModelOfDimension(mappedElements=mappedElements, dimension=1) + areaExporter.addPhysicalModelOfDimension(mappedElements=mappedElements, dimension=2) + + expectedDict = { + 'geometries': [ + { + 'area': 201.06193, + 'geometry': 'Conductor_1', + 'label': 'RightConductor' + }, + { + 'area': 201.06193, + 'geometry': 'Conductor_0', + 'label': 'LeftConductor'}, + { + 'area': 312048.117187, + 'geometry': 'OpenBoundary_0', + 'label': 'OpenBoundary_0' + }, + { + 'area': 603.185789, + 'geometry': 'Dielectric_1', + 'label': 'RightDielectric' + }, + { + 'area': 603.185789, + 'geometry': 'Dielectric_0', + 'label': 'LeftDielectric' + }, + { + 'area': 6491.504606, + 'geometry': 'Vacuum_0', + 'label': 'Vacuum_0' + }, + { + 'area': 303948.117142, + 'geometry': 'Vacuum_1', + 'label': 'Vacuum_1' + } + ] + } + self.maxDiff = None + self.assertDictEqual(areaExporter.computedAreas, expectedDict) From 98ee095adaed1fc76ad21d7d39cb26e3bbe9e011 Mon Sep 17 00:00:00 2001 From: adrianarce-elemwave Date: Thu, 2 Oct 2025 17:47:14 +0200 Subject: [PATCH 5/6] Changed physical model to use mapped graph --- src/Graph.py | 26 ++++++++- src/ShapesClassification.py | 96 +++++++++++++++--------------- src/mesher.py | 60 ++++++++++--------- test/test_ShapesClassification.py | 29 ++++++++- test/test_graph.py | 13 +++++ test/test_mesher.py | 97 ++++++++++++++----------------- 6 files changed, 189 insertions(+), 132 deletions(-) diff --git a/src/Graph.py b/src/Graph.py index 7354dd8..2806609 100644 --- a/src/Graph.py +++ b/src/Graph.py @@ -1,4 +1,5 @@ -from typing import List, Tuple +from collections import defaultdict, deque +from typing import Dict, List, Tuple class Graph: def __init__(self): @@ -91,5 +92,28 @@ def dfs(node, path): self._nodes = list(new_nodes) self._edges = list(new_edges) + def getAdyacencyTree(self) -> Dict: + tree = defaultdict(list) + for root in self.roots: + tree[''].append(root) + for parent, child in self._edges: + tree[parent].append(child) + return tree + + def getNodesByLevels(self) -> List: + adyacencyTree = self.getAdyacencyTree() + qeue = deque([('',0)]) + nodeList = [] + while qeue: + node,level = qeue.popleft() + nodeList.append(node) + for child in adyacencyTree[node]: + qeue.append((child, level+1)) + return nodeList[1:] #Removes case 0 that is not part of nodes + + def _reorderData(self) -> None: + self._edges = sorted(self._edges) + self._nodes = sorted(self._nodes) + def __str__(self): return f"Graph(Nodes: {self._nodes},\n Edges: {self._edges})" \ No newline at end of file diff --git a/src/ShapesClassification.py b/src/ShapesClassification.py index 41ed84e..baca977 100644 --- a/src/ShapesClassification.py +++ b/src/ShapesClassification.py @@ -15,9 +15,9 @@ class ShapesClassification: _ROUND_VALUE:int = 6 isOpenCase:bool - crossSectionData: Dict - pecs: Dict - dielectrics: Dict + crossSectionData: Dict[str,List[Dict[str,any]]] + pecs: Dict[str,List[Tuple[int,int]]] + dielectrics: Dict[str,List[Tuple[int,int]]] nestedGraph: Graph def __init__(self, shapes, jsonFile:str): @@ -29,12 +29,11 @@ def __init__(self, shapes, jsonFile:str): self.crossSectionData = jsonData['CrossSection'] self.pecs = self.get_pecs(shapes) self.dielectrics = self.get_dielectrics(shapes) - self.shieldReference = dict() self.vacuum = dict() + self.open = dict() self.nestedGraph = self.__getNestedGraph() self.isOpenCase = self.isOpenProblem() - @staticmethod def getNumberFromName(entity_name: str, label: str): ini = entity_name.rindex(label) + len(label) @@ -72,7 +71,10 @@ def __getGeometryNamesByMaterialType(self, materialType:str) -> List[str]: return names def isOpenProblem(self) -> None: - if len(self.nestedGraph.roots) > 1: + roots = self.nestedGraph.roots + if len(roots) > 1: #Más de un componente pec/pec pec/dielectric dielectric/dielectric etc da al exterior + return True + if roots[0] in self.dielectrics.keys(): #El único root es un dielectrico return True return False @@ -80,7 +82,7 @@ def removeConductorsFromDielectrics(self): for num, diel in self.dielectrics.items(): pec_surfs = [] for num2, pec_surf in self.pecs.items(): - if num2 == 0 and not self.isOpenCase: + if (num2 in self.nestedGraph.roots) and (not self.isOpenCase): continue pec_surfs.extend(pec_surf) self.dielectrics[num] = gmsh.model.occ.cut(diel, pec_surfs, removeTool=False)[0] @@ -88,51 +90,32 @@ def removeConductorsFromDielectrics(self): gmsh.model.occ.synchronize() def ensureDielectricsDoNotOverlap(self): - for n1, diel1 in self.dielectrics.items(): - others = list( - chain( - *[x[1] for x in self.dielectrics.items() if x[0] != n1] - ) - ) + for currentKey in self.dielectrics.keys(): + + others = list(chain(*[tag for key, tag in self.dielectrics.items() if currentKey != key])) if len(others) == 0: continue - self.dielectrics[n1] = gmsh.model.occ.cut( - self.dielectrics[n1], others, removeObject=True, removeTool=False)[0] + self.dielectrics[currentKey] = gmsh.model.occ.cut( + self.dielectrics[currentKey], others, removeObject=True, removeTool=False + )[0] gmsh.model.occ.synchronize() def buildVacuumDomain(self): - if self.isOpenCase and len(self.open) == 0: + if self.isOpenCase: self.vacuum = self._buildDefaultVacuumDomain() - elif self.isOpenCase and len(self.open) > 0: - self.vacuum = self._buildVacuumDomainFromOpenBoundary() else: self.vacuum = self._buildClosedVacuumDomain() return self.vacuum - def _buildVacuumDomainFromOpenBoundary(self) -> Dict[int, List[int]]: - dom = self.open[0] - - surfsToRemove = [] - for num, surf in self.pecs.items(): - surfsToRemove.extend(surf) - - for _, surf in self.dielectrics.items(): - surfsToRemove.extend(surf) - - dom = gmsh.model.occ.cut( - dom, surfsToRemove, removeObject=False, removeTool=False)[0] - gmsh.model.occ.synchronize() - - return dict([[0, dom]]) - def _buildClosedVacuumDomain(self) -> Tuple[int, int]: - dom = self.pecs[0] + root = self.nestedGraph.roots[0] + dom = self.pecs[root] surfsToRemove = [] for num, surf in self.pecs.items(): - if num == 0: + if num == root: continue surfsToRemove.extend(surf) @@ -141,7 +124,7 @@ def _buildClosedVacuumDomain(self) -> Tuple[int, int]: dom = gmsh.model.occ.cut( dom, surfsToRemove, removeObject=False, removeTool=False)[0] gmsh.model.occ.synchronize() - return dict([[0, dom]]) + return dict([['Vacuum_0', dom]]) def _buildDefaultVacuumDomain(self): NEAR_REGION_BOUNDING_BOX_SCALING_FACTOR = 1.25 @@ -170,7 +153,7 @@ def _buildDefaultVacuumDomain(self): farVacuumDiameter, farVacuumDiameter))] gmsh.model.occ.synchronize() - self.open = dict([[0, gmsh.model.getBoundary(farVacuum)]]) + self.open = dict([['OpenBoundary_0', gmsh.model.getBoundary(farVacuum)]]) farVacuum = gmsh.model.occ.cut( farVacuum, nearVacuum, removeObject=True, removeTool=False)[0] @@ -189,32 +172,47 @@ def _buildDefaultVacuumDomain(self): innerRegion = gmsh.model.getBoundary(nearVacuum, recursive=True) gmsh.model.mesh.setSize(innerRegion, minSide / 20) - - gmsh.model.occ.synchronize() - return dict([[0, nearVacuum], [1, farVacuum]]) + return dict([['Vacuum_0', nearVacuum], ['Vacuum_1', farVacuum]]) def __getNestedGraph(self): gmsh.model.occ.synchronize() graph = Graph() - for key in self.pecs.keys(): + elements:Dict = {} + elements = {**self.pecs, **self.dielectrics} + for key in elements: graph.add_node(key) - for i, keyA in enumerate(self.pecs.keys()): - for j, keyB in enumerate(self.pecs.keys()): + for i, keyA in enumerate(elements): + for j, keyB in enumerate(elements): if i < j: inter = gmsh.model.occ.intersect( - self.pecs[keyA], - self.pecs[keyB], + elements[keyA], + elements[keyB], removeObject=False, removeTool=False ) if len(inter[1][0]) == 0: #comprueba las intersecciones en las que interfiere el objeto continue else: - if inter[1][0] == self.pecs[keyA]: + if inter[1][0] == elements[keyA]: graph.add_edge(keyB, keyA) - elif inter[1][0] == self.pecs[keyB]: + elif inter[1][0] == elements[keyB]: graph.add_edge(keyA, keyB) graph.prune_to_longest_paths() - return graph \ No newline at end of file + graph._reorderData() + return graph + + def getComponentsMappedByLevel(self) -> Dict[str,str]: + sortedNodes = self.nestedGraph.getNodesByLevels() + mappedElements = [] + conductors = [] + dielectrics = [] + for node in sortedNodes: + if node in self.pecs.keys(): + conductors.append((node, 'Conductor_{}'.format(len(conductors)))) + if node in self.dielectrics.keys(): + dielectrics.append((node, 'Dielectric_{}'.format(len(dielectrics)))) + mappedElements.extend(conductors) + mappedElements.extend(dielectrics) + return {element[0]:element[1] for element in mappedElements} \ No newline at end of file diff --git a/src/mesher.py b/src/mesher.py index 38823e1..320903b 100644 --- a/src/mesher.py +++ b/src/mesher.py @@ -1,4 +1,5 @@ -from typing import Tuple +import os +from typing import List, Tuple import gmsh from pathlib import Path from typing import Dict @@ -31,8 +32,8 @@ def runFromInput(self, inputFile, runGui=False): caseName = Path(inputFile).stem gmsh.initialize() - self.meshFromStep(inputFile, caseName, self.DEFAULT_MESHING_OPTIONS) - self.exportGeometryAreas(caseName) + mappedElements = self.meshFromStep(inputFile, caseName, self.DEFAULT_MESHING_OPTIONS) + self.exportGeometryAreas(caseName, mappedElements) gmsh.write(caseName + '.msh') gmsh.write(caseName + '.vtk') # vtk export is just for debugging. if runGui: @@ -40,14 +41,14 @@ def runFromInput(self, inputFile, runGui=False): gmsh.finalize() - def meshFromStep(self, inputFile: str, caseName: str, meshingOptions=None): + def meshFromStep(self, inputFile: str, caseName: str, meshingOptions=None) -> Dict[str,str]: if meshingOptions is None: meshingOptions = Mesher.DEFAULT_MESHING_OPTIONS gmsh.model.add(caseName) allShapes = ShapesClassification( gmsh.model.occ.importShapes(inputFile, highestDimOnly=False), - inputFile.strip('.step') + '.json' + os.path.splitext(inputFile)[0] +'.json' ) # --- Geometry manipulation --- @@ -56,33 +57,40 @@ def meshFromStep(self, inputFile: str, caseName: str, meshingOptions=None): vacuumDomain = allShapes.buildVacuumDomain() # -- Boundaries pecBoundaries = self.extractBoundaries(allShapes.pecs) - + mappedComponents = allShapes.getComponentsMappedByLevel() + + for domain in vacuumDomain.keys(): + mappedComponents[domain] = domain + for openRegion in allShapes.open.keys(): + mappedComponents[openRegion] = openRegion + components = { + **pecBoundaries, + **allShapes.dielectrics, + **allShapes.open, + **vacuumDomain, + } + self.buildPhysicalModel( - pecBoundaries, - allShapes.dielectrics, - allShapes.open, - vacuumDomain + components, + mappedComponents ) for [opt, val] in meshingOptions.items(): gmsh.option.setNumber(opt, val) - # --- Mesh generation --- - gmsh.model.mesh.generate(2) + return mappedComponents - def exportGeometryAreas(self, caseName:str): + + def exportGeometryAreas(self, caseName:str, mappedElements:Dict[str,str]): exporter = AreaExporterService() - exporter.addPhysicalModelOfDimension(dimension=2) - exporter.addPhysicalModelOfDimension(dimension=1) + exporter.addPhysicalModelOfDimension(mappedElements, dimension=2) + exporter.addPhysicalModelOfDimension(mappedElements, dimension=1) exporter.exportToJson(caseName) - def buildPhysicalModel(self, pecBoundaries, dielectrics, openRegion, vacuumDomain): - self._addPhysicalGroup("Conductor_", pecBoundaries, dimensionTag=1) - self._addPhysicalGroup("OpenBoundary_", openRegion, dimensionTag=1) - self._addPhysicalGroup("Vacuum_", vacuumDomain, dimensionTag=2) - self._addPhysicalGroup("Dielectric_", dielectrics, dimensionTag=2) + def buildPhysicalModel(self, components:Dict[str,List[Tuple[int,int]]], labeMapping:Dict[str,str]): + self._createPhysicalGroups(components, labeMapping) allEnts = gmsh.model.get_entities() entsInPG = [] @@ -96,13 +104,13 @@ def buildPhysicalModel(self, pecBoundaries, dielectrics, openRegion, vacuumDomai gmsh.model.occ.synchronize() - def _addPhysicalGroup(self, physicalGroupName:str, objsDict:Dict, dimensionTag=1): - for num, objs in objsDict.items(): - name = physicalGroupName + str(num) - tags = [x[1] for x in objs] - gmsh.model.addPhysicalGroup(dimensionTag, tags, name=name) + def _createPhysicalGroups(self, objsDict:Dict[str,List[Tuple[int,int]]], labelMapping:Dict[str,str]): + for name, elements in objsDict.items(): + mappedName = labelMapping[name] + dimensionTag = elements[0][0] + tags = [x[1] for x in elements] + gmsh.model.addPhysicalGroup(dimensionTag, tags, name=mappedName) - @staticmethod def getPhysicalGroupWithName(name: str): pGs = gmsh.model.getPhysicalGroups() diff --git a/test/test_ShapesClassification.py b/test/test_ShapesClassification.py index cfba528..520ea88 100644 --- a/test/test_ShapesClassification.py +++ b/test/test_ShapesClassification.py @@ -31,7 +31,7 @@ def inputFileFromCaseName(self, caseName): return self.testdataPath + caseName + '/' + caseName + ".step" def initShapeClassification(self, inputFile:str) -> None: - jsonFile = inputFile.strip('.step') + '.json' + jsonFile = os.path.splitext(inputFile)[0] +'.json' self.shapeClassification = ShapesClassification( gmsh.model.occ.importShapes(inputFile, highestDimOnly=False), jsonFile @@ -90,4 +90,29 @@ def testDielectricUnshieldedPairClassification(self) -> None: self.assertListEqual(self.shapeClassification.allShapes, expectedShapes) self.assertDictEqual(self.shapeClassification.pecs, expectedPecs) self.assertDictEqual(self.shapeClassification.dielectrics, expectedDielectrics) - self.assertTrue(self.shapeClassification.isOpenCase) \ No newline at end of file + self.assertTrue(self.shapeClassification.isOpenCase) + + def test_partially_filled_coax_step_shapes(self): + case = 'partially_filled_coax' + filepath = self.inputFileFromCaseName(case) + self.initShapeClassification(filepath) + + self.assertEqual(len(self.shapeClassification.pecs), 2) + self.assertEqual(len(self.shapeClassification.dielectrics), 1) + + def test_five_wires_step_shapes(self): + case = 'five_wires' + filepath = self.inputFileFromCaseName(case) + self.initShapeClassification(filepath) + + self.assertEqual(len(self.shapeClassification.pecs), 6) + self.assertEqual(len(self.shapeClassification.dielectrics), 5) + + def test_three_wires_ribbon_step_shapes(self): + case = 'three_wires_ribbon' + filepath = self.inputFileFromCaseName(case) + self.initShapeClassification(filepath) + + self.assertEqual(len(self.shapeClassification.open), 0) + self.assertEqual(len(self.shapeClassification.pecs), 3) + self.assertEqual(len(self.shapeClassification.dielectrics), 3) \ No newline at end of file diff --git a/test/test_graph.py b/test/test_graph.py index cd77d2e..e4f1932 100644 --- a/test/test_graph.py +++ b/test/test_graph.py @@ -74,6 +74,19 @@ def testPruneToLongestPaths(self) -> None: self.graph.prune_to_longest_paths() self.assertListEqual(sorted(self.graph.edges), sorted(expectedEdges)) + def testGetNodesByLevel(self) -> None: + self.graph.nodes = ['A' ,'B', 'C', 'D', 'E', 'F', 'G'] + self.graph.edges = [ + ('A', 'B'), ('A', 'D'), + ('B', 'C'), + ('C', 'E'), + ('F', 'G') + ] + + expectedList = ['A', 'F', 'B', 'D', 'G', 'C', 'E'] + sortedNodes = self.graph.getNodesByLevels() + self.assertListEqual(sortedNodes, expectedList) + def testGetRoots(self) -> None: self.graph.nodes = ['A' ,'B', 'C', 'D', 'E', 'F', 'G'] self.graph.edges = [ diff --git a/test/test_mesher.py b/test/test_mesher.py index 5fe7e29..c371d0d 100644 --- a/test/test_mesher.py +++ b/test/test_mesher.py @@ -30,6 +30,14 @@ def setUp(self): def tearDown(self): gmsh.finalize() + def assertPhysicalGroup(self,expectedNames, expectedEntities): + pGs = gmsh.model.getPhysicalGroups() + pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs] + self.assertEqual(sorted(pGNames), sorted(expectedNames)) + + for idx, name in enumerate(expectedNames): + self.assertEqual(self.countEntitiesInPhysicalGroupWithName(name), expectedEntities[idx], name) + def countEntitiesInPhysicalGroupWithName(self, name: str): return len( gmsh.model.getEntitiesForPhysicalGroup( @@ -63,7 +71,7 @@ def test_mesh_from_step_with_partially_filled_coax(self): self.assertEqual(len(pGs), 4) pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs] - expectedNames = ['Conductor_0', 'Conductor_1', 'Dielectric_1', 'Vacuum_0'] + expectedNames = ['Conductor_0', 'Conductor_1', 'Dielectric_0', 'Vacuum_0'] self.assertEqual(sorted(pGNames), sorted(expectedNames)) for name in expectedNames: @@ -72,8 +80,8 @@ def test_mesh_from_step_with_partially_filled_coax(self): def test_mesh_from_step_with_empty_coax(self): caseName = 'empty_coax' Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) - gmsh.write(caseName + '.msh') - gmsh.write(caseName + '.vtk') + #gmsh.write(caseName + '.msh') + #gmsh.write(caseName + '.vtk') pGs = gmsh.model.getPhysicalGroups() pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs] @@ -97,33 +105,46 @@ def test_mesh_from_step_with_two_wires_coax(self): def test_mesh_from_step_with_two_wires_open(self): caseName = 'two_wires_open' + Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) - - gmsh.write(caseName + '.vtk') + #gmsh.write(caseName + '.vtk') pGs = gmsh.model.getPhysicalGroups() pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs] - expectedNames = ['Conductor_0', 'Conductor_1', 'OpenBoundary_0', 'Vacuum_0'] + expectedNames = ['Conductor_0', 'Conductor_1', 'OpenBoundary_0', 'Vacuum_0', 'Vacuum_1'] self.assertEqual(sorted(pGNames), sorted(expectedNames)) - expectedEntities = [1,1,1,1] + expectedEntities = [1,1,1,1,1] for idx, name in enumerate(expectedNames): self.assertEqual(self.countEntitiesInPhysicalGroupWithName(name), expectedEntities[idx], name) + def test_mesh_dielectric_pair_open(self) -> None: + caseName = 'DielectricUnshieldedPair' + expectedNames = [ + 'Conductor_0', 'Conductor_1', + 'Dielectric_0', 'Dielectric_1', + 'OpenBoundary_0', 'Vacuum_0', 'Vacuum_1'] + expectedEntities = [1,1,1,1,1,1,1] + + Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) + #gmsh.write(caseName + '.vtk') + + self.assertPhysicalGroup(expectedNames, expectedEntities) + + def test_mesh_from_step_with_five_wires(self): expectedNames = [ 'Conductor_0', 'Conductor_1', 'Conductor_2', 'Conductor_3', 'Conductor_4', 'Conductor_5', - 'Dielectric_1', 'Dielectric_2', - 'Dielectric_3', 'Dielectric_4', - 'Dielectric_5', 'Vacuum_0', + 'Dielectric_0', 'Dielectric_1', + 'Dielectric_2', 'Dielectric_3', + 'Dielectric_4', 'Vacuum_0' ] caseName = 'five_wires' Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) - pGs = gmsh.model.getPhysicalGroups() pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs] self.assertEqual(sorted(pGNames), sorted(expectedNames)) @@ -135,7 +156,7 @@ def test_mesh_from_step_with_three_wires_ribbon(self): caseName = 'three_wires_ribbon' Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) - gmsh.write(caseName + '.vtk') + #gmsh.write(caseName + '.vtk') pGs = gmsh.model.getPhysicalGroups() pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs] @@ -143,13 +164,13 @@ def test_mesh_from_step_with_three_wires_ribbon(self): 'Conductor_0', 'Conductor_1', 'Conductor_2', 'OpenBoundary_0', 'Dielectric_0', 'Dielectric_1', 'Dielectric_2', - 'Vacuum_0' + 'Vacuum_0', 'Vacuum_1' ] expectedEntities = [1,1,1, 1, 1,1,1, - 1] - + 1,1] + self.maxDiff = None self.assertEqual(sorted(pGNames), sorted(expectedNames)) for idx, name in enumerate(expectedNames): @@ -180,7 +201,7 @@ def test_mesh_from_step_with_agrawal1981(self): pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs] expectedNames = ['Conductor_0', 'Conductor_1', 'Conductor_2', 'Conductor_3', 'OpenBoundary_0', - 'Dielectric_1', 'Dielectric_2', 'Dielectric_3', + 'Dielectric_1', 'Dielectric_2', 'Dielectric_0', 'Vacuum_0'] expectedEntities = [4, 1, 1, 1, 1, @@ -190,49 +211,17 @@ def test_mesh_from_step_with_agrawal1981(self): for idx, name in enumerate(expectedNames): self.assertEqual(self.countEntitiesInPhysicalGroupWithName(name), expectedEntities[idx], name) - def test_partially_filled_coax_step_shapes(self): - caseName = 'partially_filled_coax' - stepShapes = ShapesClassification( - gmsh.model.occ.importShapes( - self.testdataPath + caseName + '/' + caseName + '.step' - ) - ) - - self.assertEqual(len(stepShapes.pecs), 2) - self.assertEqual(len(stepShapes.dielectrics), 1) - - def test_five_wires_step_shapes(self): - caseName = 'five_wires' - stepShapes = ShapesClassification( - gmsh.model.occ.importShapes( - self.testdataPath + caseName + '/' + caseName + '.step' - ) - ) - - self.assertEqual(len(stepShapes.pecs), 6) - self.assertEqual(len(stepShapes.dielectrics), 5) - - def test_three_wires_ribbon_step_shapes(self): - caseName = 'three_wires_ribbon' - stepShapes = ShapesClassification( - gmsh.model.occ.importShapes( - self.testdataPath + caseName + '/' + caseName + '.step' - ) - ) - - self.assertEqual(len(stepShapes.open), 1) - self.assertEqual(len(stepShapes.pecs), 3) - self.assertEqual(len(stepShapes.dielectrics), 3) + def test_unshielded_multiwire(self): caseName = 'unshielded_multiwire' Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) - gmsh.write(caseName + '.vtk') + #gmsh.write(caseName + '.vtk') pGs = gmsh.model.getPhysicalGroups() pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs] - expectedNames = ['Conductor_0', 'Conductor_1', 'Dielectric_1', + expectedNames = ['Conductor_0', 'Conductor_1', 'Dielectric_0', 'OpenBoundary_0', 'Vacuum_0', 'Vacuum_1'] expectedEntities = [1, 1, 1, @@ -247,7 +236,7 @@ def test_conductor_and_outer_dielectric(self): caseName = 'conductor_and_outer_dielectric' Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) - gmsh.write(caseName + '.vtk') + #gmsh.write(caseName + '.vtk') pGs = gmsh.model.getPhysicalGroups() pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs] @@ -269,8 +258,8 @@ def test_lansink2024_single_wire_multipolar(self): caseName = 'lansink2024_single_wire_multipolar' Mesher().meshFromStep(self.inputFileFromCaseName(caseName), caseName) - gmsh.write(caseName + '.msh') - gmsh.write(caseName + '.vtk') + #gmsh.write(caseName + '.msh') + #gmsh.write(caseName + '.vtk') pGs = gmsh.model.getPhysicalGroups() pGNames = [gmsh.model.getPhysicalName(*pG) for pG in pGs] From f817b9ef79fdc2c2b33f19623267e416dffd9abe Mon Sep 17 00:00:00 2001 From: adrianarce-elemwave Date: Thu, 2 Oct 2025 17:55:53 +0200 Subject: [PATCH 6/6] minor, assertion fix --- test/test_AreaExporterService.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_AreaExporterService.py b/test/test_AreaExporterService.py index fe40ecf..e85a5f4 100644 --- a/test/test_AreaExporterService.py +++ b/test/test_AreaExporterService.py @@ -42,7 +42,7 @@ def testAreaExporterReturnsTrueValues(self): internalElements.append(geometry['area']) areaElements = self.sumAreasFromList(internalElements) - self.assertAlmostEqual(totalArea, areaElements) + self.assertAlmostEqual(totalArea, areaElements, places=5) def testJsonFormat(self) -> None: caseName = 'DielectricUnshieldedPair'