Exemplo n.º 1
0
	def effect(self):
		if not len(self.selected) == 1:
			inkex.errormsg("You must select exactly 1 element.")
			return
		
		# Get script's values
		sensor_distance = self.options.sensor_distance		#defines where the lines are cut out
		arrow_size = self.options.line_thickness + 10
		self.gap = self.options.gap
		line_thickness = self.options.line_thickness
		
		# Get access to main SVG document element and get its dimensions.
		svg = self.document.getroot()
        
        # Create a new layer.
		layer = inkex.etree.SubElement(svg, 'g')
		layer.set(inkex.addNS('label', 'inkscape'), 'CurveLayer')
		layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer')
		
		converter = Converter()
        
		# from Inkscape svg to Path
		userInputObject = self.selected.values()[0]
		pathMask = Path(userInputObject)		
		
		degree = pathMask.getNumNodes()
		nodes = []
		points = []
		
		for i in range(0, degree):
			#Get the nodes from the control graph
			nodes.append(pathMask.getNodeXY(i))
		curve = Bezier(nodes)
		
		i = (100-sensor_distance) /1000.0
		for t in arange(0, 1+i, i):
			point = curve.point(t)
			points.append(point)
		
		#draw the bezier curve
		i = 0.005
		p0 = curve.point(0)
		for t in arange(0, 1, i):
			point = curve.point(t+i)
			self.draw_line(line_thickness, (p0[0], p0[1]), (point[0], point[1]), layer)
			p0 = curve.point(t)
		
		#cut out the sensors
		z = points[0]
		for p in points[1:]:
			self.calculatePoint(z[0],z[1],p[0],p[1],arrow_size,45, layer)
			z = p
			
		""" remove the line which describes the curve """
		for selected_element in self.selected.itervalues():
			self.remove(selected_element)
Exemplo n.º 2
0
	def drawLine(self,p1x,p1y,p2x,p2y, layer,color='#000000'):
		'''
		draw the white line in order to separate the sensors
		'''
		path = Path()
		path.addNodeAtEnd(p1x,p1y)
		path.addNodeAtEnd(p2x,p2y)
		
		style = {'stroke' : str(color), 'stroke-width': self.gap, 'fill': 'none'}
		svgPath = inkex.etree.SubElement(layer, inkex.addNS('path','svg'), {'style': simplestyle.formatStyle(style)})
		path.toSVG(svgPath)
Exemplo n.º 3
0
 def _polygonToPath(self, polygon):
     """
     Internal convertion of a Shapely Polygon
     into a Path object.
     """
     coords = polygon.exterior.coords.xy
     coordsX = coords[0]
     coordsY = coords[1]
     path = Path()
     for i in range(len(coordsX)):
         path.addNodeAtEnd(coordsX[i], coordsY[i])
     return path
Exemplo n.º 4
0
    def effect(self):
        if not len(self.selected) == 1:
            inkex.errormsg("You must select exactly 1 element.")
            return
        
        converter = Converter()
        
        svg = self.document.getroot()

        # Create a new layer.
        layer = inkex.etree.SubElement(svg, 'g')
        layer.set(inkex.addNS('label', 'inkscape'), 'SensorLayer')
        layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer')

        sensorWidth = self.options.sensors_x
        sensorHeight = self.options.sensors_y
        padding = self.options.padding
        curve_type = self.options.curve_type
        #curve_number = self.options.curve_number
        
	    # Users might create invalid masks that the Path object can not handle.
        if (not Path.isValid(self.selected.values()[0])):
            inkex.errormsg("The selected mask is invalid and can not be handled by the Path object.")
            return
		# From Inkscape svg to Path
        pathMask = Path(self.selected.values()[0])
        polyMask = converter.pathToPolygon(pathMask)
		
        '''if (curve_type != 'path'):
            polyMask = converter.curveToBezier(pathMask)
        else:
            polyMask = converter.pathToPolygon(pathMask)'''
        
       # for point in list(polyMask.exterior.coords):
        #    self.draw_SVG_square((5,5), (point[0],point[1]), layer)
        
        #inkex.errormsg("valid polygon: "+str(polyMask.is_valid))
        #inkex.errormsg("object: %s"%polyMask.exterior.type)
        #inkex.errormsg("valid linearRing: "+str(polyMask.exterior.is_valid))
        
        # Bounding box of the mask is upper size limit for grid
        minx, miny, maxx, maxy = polyMask.bounds
        maskWidth = maxx - minx
        maskHeight = maxy - miny
        
        #inkex.errormsg("width: %d"%maskWidth+", height: %d"%maskHeight)
        
        sensorNumX = int((maskWidth + padding)/(sensorWidth + padding)) + 1
        sensorNumY = int((maskHeight + padding)/(sensorHeight + padding)) + 1
        
        # Create grid
        pathGrid = util.createSensorGrid(sensorNumX, sensorNumY, sensorWidth, sensorHeight, padding, minx, miny)
        # Convert Path objects in Grid to Shapely Polygons
        polyGrid = [converter.pathToPolygon(path) for path in pathGrid]
        
        # Apply mask on each element of the grid
        pathMaskedGrid = []
        for poly in polyGrid:
            polyMasked = poly.intersection(polyMask)
            
            pathMasked = converter.polygonsToPath([polyMasked])
            if isinstance(pathMasked, list):#multiple polygons created e.g. sensor cut into parts by mask
                pathMaskedGrid.extend(pathMasked)
            elif len(pathMasked) != 0: #one polygon, not empty
                pathMaskedGrid.append(pathMasked)
        
        # Convert cut out Path objects into SVG paths and add to layer.        
        for rectMasked in pathMaskedGrid:
            style = {'stroke' : 'none', 'stroke-width': '1', 'fill': '#000000'}
            attribs = {'style': simplestyle.formatStyle(style)}
            svgRectPath = inkex.etree.Element(inkex.addNS('path','svg'),attribs)
            rectMasked.toSVG(svgRectPath)
            layer.append(svgRectPath)
Exemplo n.º 5
0
	def effect(self):
		if not len(self.selected) == 1:
			inkex.errormsg("You must select exactly 1 element.")
			return
		
		# Get script's values
		number_sensors = self.options.number_sensors
		sensor_size = self.options.sensor_size
		sensor_distance = self.options.sensor_distance
		bezier_type = self.options.bezier_type
		
		# Get access to main SVG document element and get its dimensions.
		svg = self.document.getroot()
        
        # Create a new layer.
		layer = inkex.etree.SubElement(svg, 'g')
		layer.set(inkex.addNS('label', 'inkscape'), 'CurveLayer')
		layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer')
		
		userInputObject = self.selected.values()[0]
		
		
		# from Inkscape svg to Path
		pathMask = Path(userInputObject)
		
		degree = pathMask.getNumNodes()
		if (bezier_type == 'cubic' and degree != 4) or (bezier_type == 'quatratic' and degree != 3):
			inkex.errormsg("The path is invalid. Either 3 or 4 points are allowed.")
		nodes = []
		points = []
		
		for i in range(0, degree):
			#Get the nodes from the control graph
			nodes.append(pathMask.getNodeXY(i))
			
		#Create Cubic/Quadratic Bezier with the control points
		if (bezier_type == 'cubic'):
			if (degree < 4):
				inkex.errormsg("The path is invalid. You need 4 points.")
			curve = CubicBezier(nodes[0], nodes[1], nodes[2], nodes[3])
		else:
			curve = QuadraticBezier(nodes[0], nodes[1], nodes[2])
		
		# triangle
		p1 = [0 , 0]
		p2 = [0 , sensor_size/2]
		p3 = [sensor_size , sensor_size/4]
		pts = ar([p3, p2, p1])
		#rotation point
		pr = [sensor_size/4, sensor_size/4]
		length = curve.length()
		offset = sensor_size * 0.25
		number_sensors = math.ceil(length / (sensor_size + offset))
		
		
		i = sensor_distance/1000.0
		tri0 = [[0, 0], [0, 1], [0.5, 0.5]]
		for j in np.arange(0, 1+i, i):
			
			#Calculation of slope and angle for rotation
			slope = curve.derivation(j)
			angle = angle_between(slope)
			if slope[1] < 0:
				angle = 2*pi - angle	
	
			point = curve.point(j)
			#DEBUGGING:draw squares without rotation to compare
			#self.draw_SVG_square((5,5), (point[0],point[1]), layer)
			points.append(point)
			ots = Rotate(pts,ar(pr),angle)
	
			#draw a triangle
			tri = [[point[0]+ots[0][0], point[1]+ots[0][1]] ,\
					[point[0]+ots[1][0], point[1]+ots[1][1]] ,\
					[point[0]+ots[2][0], point[1]+ots[2][1]] ]
			self.draw_triangle(tri, layer)