def __init__(self, nr, closed, parentEntity): QGraphicsItem.__init__(self) Shape.__init__(self, nr, closed, parentEntity) self.setFlag(QGraphicsItem.ItemIsSelectable, True) self.setAcceptedMouseButtons(QtCore.Qt.NoButton) self.selectionChangedCallback = None self.enableDisableCallback = None self.starrow = None self.enarrow = None
def setSelected(self, flag=True, blockSignals=True): """ Override inherited function to turn off selection of Arrows. @param flag: The flag to enable or disable Selection """ self.starrow.setSelected(flag) self.enarrow.setSelected(flag) self.stmove.setSelected(flag) QGraphicsItem.setSelected(self, flag) Shape.setSelected(self, flag) if self.selectionChangedCallback and not blockSignals: self.selectionChangedCallback(self, flag)
def setDisable(self, flag=False, blockSignals=True): """ New implemented function which is in parallel to show and hide. @param flag: The flag to enable or disable Selection """ # QGraphicsItem.setDisable(self, flag) Shape.setDisable(self, flag) scene = self.scene() if scene is not None: if not scene.showDisabledPaths and flag: self.hide() self.starrow.setSelected(False) self.enarrow.setSelected(False) self.stmove.setSelected(False) else: self.show() if self.enableDisableCallback and not blockSignals: self.enableDisableCallback(self, not flag)
def pdf_wi(self, p, wi): """Intersect sample ray with area light geometry.""" p_center = self.object_to_world(Point(0, 0, 0)) # Return uniform weight if point inside sphere if (distance_squared(p, p_center) - self.radius * self.radius) < 1e-4: return Shape.pdf_wi(self, p, wi) # Compute general sphere weight sin_theta_max2 = self.radius * self.radius / distance_squared(p, p_center) cos_theta_max = math.sqrt(max(0.0, 1.0 - sin_theta_max2)) raise Exception("next_line") # return uniform_cone_pdf(cos_theta_max) return 0.0
def pdf_wi(self, p, wi): """Intersect sample ray with area light geometry.""" p_center = self.object_to_world(Point(0, 0, 0)) # Return uniform weight if point inside sphere if (distance_squared(p, p_center) - self.radius * self.radius) < 1e-4: return Shape.pdf_wi(self, p, wi) # Compute general sphere weight sin_theta_max2 = self.radius * self.radius / distance_squared( p, p_center) cos_theta_max = math.sqrt(max(0.0, 1.0 - sin_theta_max2)) raise Exception("next_line") # return uniform_cone_pdf(cos_theta_max) return 0.0
def makeEntityShapes(self, parent, layerNr=-1): """ Instance is called prior to plotting the shapes. It creates all shape classes which are plotted into the canvas. @param parent: The parent of a shape is always an Entity. It may be the root or, if it is a Block, this is the Block. """ if parent.name == "Entities": entities = self.valuesDXF.entities else: ent_nr = self.valuesDXF.Get_Block_Nr(parent.name) entities = self.valuesDXF.blocks.Entities[ent_nr] # Assigning the geometries in the variables geos & contours in cont ent_geos = entities.geo # Loop for the number of contours for cont in entities.cont: # Query if it is in the contour of an insert or of a block if ent_geos[cont.order[0][0]].Typ == "Insert": ent_geo = ent_geos[cont.order[0][0]] # Assign the base point for the block new_ent_nr = self.valuesDXF.Get_Block_Nr(ent_geo.BlockName) new_entities = self.valuesDXF.blocks.Entities[new_ent_nr] pb = new_entities.basep # Scaling, etc. assign the block p0 = ent_geos[cont.order[0][0]].Point sca = ent_geos[cont.order[0][0]].Scale rot = ent_geos[cont.order[0][0]].rot # Creating the new Entitie Contents for the insert newEntityContent = EntityContent(nr=0, name=ent_geo.BlockName, parent=parent, p0=p0, pb=pb, sca=sca, rot=rot) parent.append(newEntityContent) self.makeEntityShapes(newEntityContent, ent_geo.Layer_Nr) else: # Loop for the number of geometries tmp_shape = Shape(len(self.shapes), cont.closed, parent) for ent_geo_nr in range(len(cont.order)): ent_geo = ent_geos[cont.order[ent_geo_nr][0]] if cont.order[ent_geo_nr][1]: ent_geo.geo.reverse() for geo in ent_geo.geo: geo = copy(geo) geo.reverse() self.append_geo_to_shape(tmp_shape, geo) ent_geo.geo.reverse() else: for geo in ent_geo.geo: self.append_geo_to_shape(tmp_shape, copy(geo)) if len(tmp_shape.geos) > 0: # All shapes have to be CW direction. tmp_shape.AnalyseAndOptimize() self.shapes.append(tmp_shape) if g.config.vars.Import_Parameters[ 'insert_at_block_layer'] and layerNr != -1: self.addtoLayerContents(tmp_shape, layerNr) else: self.addtoLayerContents(tmp_shape, ent_geo.Layer_Nr) parent.append(tmp_shape) if not g.config.mode3d: # Connect the shapeSelectionChanged and enableDisableShape signals to our treeView, # so that selections of the shapes are reflected on the treeView tmp_shape.setSelectionChangedCallback( self.TreeHandler.updateShapeSelection) tmp_shape.setEnableDisableCallback( self.TreeHandler.updateShapeEnabling)
def makeEntityShapes(self, parent, layerNr=-1): """ Instance is called prior to plotting the shapes. It creates all shape classes which are plotted into the canvas. @param parent: The parent of a shape is always an Entity. It may be the root or, if it is a Block, this is the Block. """ if parent.name == "Entities": entities = self.valuesDXF.entities else: ent_nr = self.valuesDXF.Get_Block_Nr(parent.name) entities = self.valuesDXF.blocks.Entities[ent_nr] # Assigning the geometries in the variables geos & contours in cont ent_geos = entities.geo # Loop for the number of contours for cont in entities.cont: # Query if it is in the contour of an insert or of a block if ent_geos[cont.order[0][0]].Typ == "Insert": ent_geo = ent_geos[cont.order[0][0]] # Assign the base point for the block new_ent_nr = self.valuesDXF.Get_Block_Nr(ent_geo.BlockName) new_entities = self.valuesDXF.blocks.Entities[new_ent_nr] pb = new_entities.basep # Scaling, etc. assign the block p0 = ent_geos[cont.order[0][0]].Point sca = ent_geos[cont.order[0][0]].Scale rot = ent_geos[cont.order[0][0]].rot # Creating the new Entitie Contents for the insert newEntityContent = EntityContent(nr=0, name=ent_geo.BlockName, parent=parent, p0=p0, pb=pb, sca=sca, rot=rot) parent.append(newEntityContent) self.makeEntityShapes(newEntityContent, ent_geo.Layer_Nr) else: # Loop for the number of geometries tmp_shape = Shape(len(self.shapes), (True if cont.closed else False), parent) for ent_geo_nr in range(len(cont.order)): ent_geo = ent_geos[cont.order[ent_geo_nr][0]] if cont.order[ent_geo_nr][1]: ent_geo.geo.reverse() for geo in ent_geo.geo: geo = copy(geo) geo.reverse() self.append_geo_to_shape(tmp_shape, geo) ent_geo.geo.reverse() else: for geo in ent_geo.geo: self.append_geo_to_shape(tmp_shape, copy(geo)) if len(tmp_shape.geos) > 0: # All shapes have to be CW direction. tmp_shape.AnalyseAndOptimize() self.shapes.append(tmp_shape) if g.config.vars.Import_Parameters['insert_at_block_layer'] and layerNr != -1: self.addtoLayerContents(tmp_shape, layerNr) else: self.addtoLayerContents(tmp_shape, ent_geo.Layer_Nr) parent.append(tmp_shape) if not g.config.mode3d: # Connect the shapeSelectionChanged and enableDisableShape signals to our treeView, # so that selections of the shapes are reflected on the treeView tmp_shape.setSelectionChangedCallback(self.TreeHandler.updateShapeSelection) tmp_shape.setEnableDisableCallback(self.TreeHandler.updateShapeEnabling)
def __init__(self, parent=Shape(), offset=1, offtype='in'): """ Standard method to initialize the class @param closed: Gives information about the shape, when it is closed this value becomes 1. Closed means it is a Polygon, otherwise it is a Polyline @param length: The total length of the shape including all geometries @param geos: The list with all geometries included in the shape. May also contain arcs. These will be reflected by multiple lines in order to easy calclations. """ super(offShapeClass, self).__init__(nr=parent.nr, closed=parent.closed, geos=[]) self.offset = offset self.offtype = offtype self.segments = [] self.rawoff = [] self.geos_preprocessing(parent) self.make_segment_types() nextConvexPoint = [ e for e in self.segments if isinstance(e, ConvexPoint) ] # logger.debug(nextConvexPoint) # nextConvexPoint=[nextConvexPoint[31]] self.counter = 0 while len(nextConvexPoint): # [self.convex_vertex[-1]]: convex_vertex_nr = self.segments.index(nextConvexPoint[0]) # logger.debug(len(self.segments)) # logger.debug("convex_vertex: %s" % nextConvexPoint[0]) # logger.debug("convex_vertex_nr: %s" % convex_vertex_nr) forward, backward = self.PairWiseInterferenceDetection( convex_vertex_nr + 1, convex_vertex_nr - 1) # logger.debug("forward: %s, backward: %s" % (forward, backward)) if forward is None: return break if backward == 0 and forward == (len(self.segments) - 1) and self.closed: self.segments = [] break # Make Raw offset curve of forward and backward segment fw_rawoff_seg = self.make_rawoff_seg(self.segments[forward]) bw_rawoff_seg = self.make_rawoff_seg(self.segments[backward]) # Intersect the two segements iPoint = fw_rawoff_seg.find_inter_point(bw_rawoff_seg) if iPoint is None: logger.debug("fw_rawoff_seg: %s, bw_rawoff_seg: %s" % (fw_rawoff_seg, bw_rawoff_seg)) logger.debug( "forward: %s, backward: %s, iPoint: %s =====================================" % (forward, backward, iPoint)) logger.debug(fw_rawoff_seg) logger.debug(bw_rawoff_seg) logger.error("No intersection found?!") self.segments = [] # raise Exception("No intersection found?!") break # Reomve the LIR from the PS Curce self.remove_LIR(forward, backward, iPoint) nextConvexPoint = [ e for e in self.segments if isinstance(e, ConvexPoint) ] # logger.debug(nextConvexPoint) # nextConvexPoint=[] # logger.debug(nextConvexPoint) for seg in self.segments: self.rawoff += [self.make_rawoff_seg(seg)]