コード例 #1
0
 def nodesSelected(self, nodeIDs):
     self.prop_browser.clear()
     nodeID = nodeIDs.last()
     if nodeID == None:
         return
     
     node = bzmag.getObject(nodeID)
     if node == None:
         self.selectedNode_ = None
         self.line_path.setText('')
         return
     
     path = node.getAbsolutePath()
     
     #self.CS_.clear()
     self.EnumToCSID_.clear()
     self.CSIDtoEnum_.clear()
     self.CSNames_.clear()
     
     self.EnumToMatID_.clear()
     self.MatIDtoEnum_.clear()
     self.MatNames_.clear()
     
     cs_root = bzmag.get('/coordinate')
     self.build_ObjectItem(cs_root, self.CSIDtoEnum_, self.EnumToCSID_, self.CSNames_, 'Global')
     
     mat_root = bzmag.get('/material')
     self.build_ObjectItem(mat_root, self.MatIDtoEnum_, self.EnumToMatID_, self.MatNames_, 'Vaccum')
     
     if path == '' : path = '/'
     self.line_path.setText(path)
     self.line_path.setReadOnly(True)
     
     #print('Binding node path', path)
     #node = bzmag.get(path)    
     self.selectedNodeID_ = nodeID
     
     
     for type_name in node.getGenerations():
         group = self.groupManager.addProperty(type_name)
         prop_names = node.getPropertyNames(type_name)
         if not prop_names:
             continue
      
         for prop_name in prop_names:
             prop_name, prop_value, prop_type, readonly = \
                 node.getProperty(prop_name)
             #print(prop_name, prop_value, prop_type, readonly)
             self.add_property(group, prop_name, prop_value, prop_type, readonly)
         
         #print('Property Browse : Add Property...', group)
         self.prop_browser.addProperty(group)
コード例 #2
0
    def accept(self): 
        node_name = str(self.edit_name.text())
        node_path = str(self.edit_path.text())
        node_type = str(self.edit_type.text())

        if not node_name:
            self.error_msg('Please input into the \'Node Name\' field')
            return
        
        try:
            parent_node = bzmag.get(node_path)
            #print(parent_node)
        except:
            parent_node = None
            self.error_msg('Invalid path for the parent node')
            self.edit_path.setFocus()
            return 
            
        if parent_node.findChild(node_name):
            self.error_msg('Specified node name already exist on parent node')             
            self.edit_name.setFocus()
            return
    
        if not node_type in self.node_type_dict.keys():
            self.error_msg('unable to create specified type')
            self.edit_type.setFocus()
            return
            
        if not bzmag.isNode(node_type):
            self.error_msg('The node type is not kind of bzNodes.\n It could not possible to create a node')
            return
            
        super(NodeCreator, self).accept()
コード例 #3
0
    def menu_addnode(self):
        # parent node path (bzmagPy)
        current_item = self.currentItem()
        node = current_item.data(1, Qt.UserRole)
        tpath = node.getAbsolutePath()

        nc = NodeCreator(self)
        nc.edit_path.setText(tpath)

        # OK button
        if nc.exec():
            node_name = str(nc.edit_name.text())
            node_path = str(nc.edit_path.text())
            node_type = str(nc.edit_type.text())

            # Add bzMag Node
            new_node = None
            if bzmag.isNode(node_type):
                parent_node = bzmag.get(node_path)
                bzmag.pushcwn(parent_node)
                new_node = bzmag.new(node_type, node_name)
                bzmag.popcwn()

                # Add QTreeWidgetItem
                if 'GeomHeadNode' == node.getTypeName() and \
                   'geom' == node.getName():
                    child_item = self.add_child_item(current_item, new_node)
                else:
                    child_item = self.add_child_item(current_item.parent(), \
                                 new_node)

                self.setCurrentItem(child_item, 0)
                print('Node Added')
コード例 #4
0
    def build(self, root_path):
        self.rootNode_ = bzmag.get(root_path)

        root_item = QTreeWidgetItem(['/'])
        root_item.setExpanded(True)
        self.rootItem_ = root_item

        root_item.setData(1, Qt.UserRole, self.rootNode_)
        root_item.setIcon(0, self.imageProvider_.getImage('bzmag'))

        self.addTopLevelItem(root_item)

        for node in self.rootNode_.getChildren():
            self.build_children(root_item, node)
コード例 #5
0
ファイル: TriangleMesh.py プロジェクト: JaenamBae/bzmagEditor
    def generateMesh(self, root_path):
        tri_node = bzmag.get('/sys/server/triangle')
        tri_node.makePolyStructure(root_path)
        n_polyholes = tri_node.getNumberOfPolyHoles()
        # Step1. Polyhole 의 갯수만큼 루프를 돌며 요소 생성을 위한 기저 절점과 세그먼트 생성
        #        (.Poly 파일 구조 생성이라고 보면 편할듯)
        #        g_verices (절점), g_segments(세그먼트), g_holes(홀), g_regions(영역)에 저장 될 것임
        # Step2. 중복되는 기저절점과 세그먼트제거
        #        mergePolyData() 함수를 이용할 것임
        # Step3. 현재 Polyhole을 지정할 수 있는 임의 좌표 <x> <y>를 만들고
        #        이를 활용하여 해당 영역에 <attribute> 과 <maximum area>를 설정
        # Step4. Mesh Generating

        dd = tri_node.getDomainArea()
        print('Domain Area', dd)
        print('There are', n_polyholes, 'region')
        for i in range(0, n_polyholes):
            #if i==0 : continue
            # 현재 영역을 구성하는 절점좌표를 받음
            # 튜플형태(x0, y0, x1, y1, ...)로 넘어오게 되는데,
            # 이를 reshape 해서 2차원 배열로 만들어 편리하게 사용할 것임
            v_data = tri_node.getVertices(i)
            nvertices = len(v_data) / 2
            vertices = np.array(v_data).reshape(int(nvertices), 2)
            #print(vertices)

            # 마찬가지 segments 데이터도 튜플형태로 넘어오는데
            # (시작점0_ID, 끝점0_ID, 시작점1_ID, 끝점1_ID, ...) 형태로 넘어옴
            # 마찬가지로 reshape 해서 편리하게 사용함
            s_data = tri_node.getSegments(i)
            nsegments = len(s_data) / 2
            segments = np.array(s_data).reshape(int(nsegments), 2)
            #print(segments)

            # hole 데이터도 홀의 위치를 나타내는 절점 좌표가
            # (x0, y0, x1, y1, ...) 형태로 넘어옴
            # reshape 해서 편하게 씀
            h_data = tri_node.getHoles(i)
            nholes = len(h_data) / 2
            holes = np.array(h_data).reshape(int(nholes), 2)
            #print('Holes point')
            #print(holes)

            # 중복점 제거
            self.eliminateDuplicate(vertices, segments)

            # 각 영역의 vertices, segments, holes 데이터를 합침
            # g_vertices, g_segments, g_holes에 저장됨
            self.mergePolyData(vertices, segments)

            # 절점 근사화
            #self.approximateVertices()

            # 현재 영역을 대표할 수 있는 좌표 <x> <y>를 찾고 싶음
            # 그냥 현재 기저 절점으로 대충 요소생성후
            # 임의 요소의 중심 좌표를 현재 영역의 대표 점으로 설정할 것임
            input = dict(vertices=vertices, segments=segments, holes=holes)
            if len(holes) == 0: del input['holes']

            print('Mesh control area of the Region (ID',
                  tri_node.getPolyHolesID(i), ') :',
                  tri_node.getPolyHolesMeshArea(i))
            output = triangle.triangulate(input, 'p')
            tris = output['triangles']
            verts = output['vertices']

            for tri in tris:
                x0, y0 = verts[tri[0], :]
                x1, y1 = verts[tri[1], :]
                x2, y2 = verts[tri[2], :]
                break

            # 영역을 지정하기 위한 대표 절점좌표
            xP = (x0 + x1 + x2) / 3
            yP = (y0 + y1 + y2) / 3

            # 이제 영역에 <attribute>과 요소컨트롤을 위한 <maximum area>를 설정할 수 있음
            # <attribute>는 영역의 ID를 설정하기로 하며,
            # <maximum area>는 사용자로부터 받은 값을 설정하면 좋은데
            # 아직 인터페이스가 마련되어 있지 않으므로 임의값 넣기로 함
            region = np.array([
                xP, yP,
                tri_node.getPolyHolesID(i),
                tri_node.getPolyHolesMeshArea(i)
            ])
            self.g_regions = np.concatenate([self.g_regions, [region]])

        #print(self.g_regions)
        pthole = tri_node.getPointsOnHoles()
        self.g_holes = np.array(pthole).reshape(int(len(pthole) / 2), 2)
        input = dict(vertices=self.g_vertices,
                     segments=self.g_segments,
                     holes=self.g_holes,
                     regions=self.g_regions)
        #print(input)
        #return

        #n_segments = len(self.g_segments)
        #n_vertices = len(self.g_vertices)
        #print('Number of Segments : ', n_segments)
        #print('Number of Vertices : ', n_vertices)

        if len(self.g_holes) == 0: del input['holes']
        #self.output_ = triangle.triangulate(input, 'pqAaYY')
        self.output_ = triangle.triangulate(input, 'pqAaY')