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)
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()
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')
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)
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')