示例#1
0
    def modal(self, ctx, event):
        ctx.area.tag_redraw()
        x, y = event.mouse_region_x, event.mouse_region_y

        if ctx.mode != 'EDIT_CURVE':
            return {'CANCELLED'}

        if not event.type in {'LEFTMOUSE', 'RIGHTMOUSE', 'MOUSEMOVE', 'ESC'}:
            return {'PASS_THROUGH'}

        elif event.type == 'MOUSEMOVE':
            # if vert created:
            # 	slide on the segment or spline
            # else:
            # 	pass
            pass

        elif event.type == 'LEFTMOUSE':
            if event.value == 'PRESS':
                self.new_point_added = False
                self.curve = Curve(self.obj)
                """ Divide each segment to 10 part and collect distance from click point """
                points = []
                for spline in self.curve.splines:
                    for segment in spline.get_as_segments():
                        points += self.divide_segment(ctx, segment, 0, 1, 10,
                                                      (x, y))

                nearest_point = self.get_nearest_point(points)
                """ second division steps """
                for step in {0.1, 0.01, 0.001}:
                    points.clear()
                    start_time, end_time = nearest_point.time - step, nearest_point.time + step
                    points = self.divide_segment(ctx, nearest_point.segment,
                                                 start_time, end_time, 10,
                                                 (x, y))
                    nearest_point = self.get_nearest_point(points)
                """ get nearest point of curve on 2d screen """
                nearest_point_on_curve = self.obj.matrix_world @ nearest_point.segment.get_point_on(
                    nearest_point.time)
                pl = location_3d_to_region_2d(ctx.region,
                                              ctx.space_data.region_3d,
                                              nearest_point_on_curve)
                """ insert if distance les than 10 pixel """
                if abs(x - pl.x) < 10 and abs(y - pl.y) < 10:
                    nearest_point.segment.spline.divid(
                        nearest_point.segment.index, nearest_point.time)
                    self.new_point_added = True

            if event.value == 'RELEASE' and self.new_point_added:
                """ Update and Get new genarated curve data """
                self.curve.update()
                bpy.ops.ed.undo_push()

            return {'RUNNING_MODAL'}

        elif event.type in {'RIGHTMOUSE', 'ESC'}:
            return {'CANCELLED'}

        return {'RUNNING_MODAL'}
示例#2
0
    def execute(self, ctx):
        curve = Curve(ctx.active_object)
        for splineindex, points in curve.selection("point"):
            if len(points) == 1:
                spline = curve.splines[splineindex]
                spline.make_first(points[0])
        curve.update()

        self.report({'INFO'}, 'bpy.ops.curve.make_first()')
        return {"FINISHED"}
示例#3
0
    def execute(self, ctx):
        curve = Curve(ctx.active_object)
        for spline, points in curve.selection("point"):
            curve.break_point(spline, points)
        curve.update()

        self.report({'INFO'}, 'bpy.ops.curve.break()')
        return {"FINISHED"}
示例#4
0
	def get_data(self, ctx):
		self.obj = ctx.active_object
		self.curve = Curve(self.obj)
示例#5
0
class CurveTool(Operator):
	bl_options = {'REGISTER','UNDO'}
	curve,obj = None,None
	start,finish = False,False
	start_x,start_y = 0,0
	value_x,value_y,value_w = 0,0,0

	@classmethod
	def poll(self, ctx):
		if ctx.area.type == 'VIEW_3D':
			if len(ctx.scene.objects) > 0:
				if ctx.object != None:
					return ctx.mode == 'EDIT_CURVE'
		return False

	def get_data(self, ctx):
		self.obj = ctx.active_object
		self.curve = Curve(self.obj)

	def apply(self):
		pass

	def draw(self, ctx):
		pass

	def abort(self):
		self.curve.reset()

	def execute(self, ctx):
		if self.value_x + self.value_y == 0:
			self.abort()
		else:
			self.apply()
		return{"FINISHED"}

	def check(self, ctx):
		if not self.start:
			self.start = True
		self.apply()

	def modal(self, ctx, event):
		if event.type == 'LEFTMOUSE':
			if not self.start:
				self.start = True
				self.start_x = event.mouse_x
				self.start_y = event.mouse_y
				self.get_data(ctx)
		if event.type == 'MOUSEMOVE':
			if self.start:
				self.value_x = (event.mouse_x-self.start_x)/200
				self.value_y = (event.mouse_y-self.start_y)/200
				self.apply()
			if self.start and event.value =='RELEASE':
				self.finish = True
		#TODO mouse weel changes self.value_w
		if self.finish:
			if self.value_x + self.value_y == 0:
				self.abort()
			return {'CANCELLED'}
		if event.type in {'RIGHTMOUSE', 'ESC'}:
			self.abort()
			return {'CANCELLED'}
		return {'RUNNING_MODAL'}

	def invoke(self, ctx, event):
		self.get_data(ctx)
		if self.typein:
			wm = ctx.window_manager
			return wm.invoke_props_dialog(self)#,width=120)
		else:
			ctx.window_manager.modal_handler_add(self)
			return {'RUNNING_MODAL'}
示例#6
0
def get_extrude_mesh(curve, height, hsegs, csegs, segmode, capu, capl, start_height, end_height):
	verts,edges,faces = [],[],[]

	def get_csegs_count(spline,index,csegs,mode):
		return spline.resolution_u if mode == 'Curve' else csegs

	def get_segment_vertexes(spline,index,mode,count,offset):
		points = []
		seg = Segment(spline, index)
		for i in range(count):
			t = i/count
			newpoint = seg.get_point_on(t)
			newpoint += offset
			points.append(newpoint)
		return points

	if curve == None:
		""" create a default mesh if target not exist"""
		verts = [[0,0,0],[0,1,0],[1,0,0],[0,0,1]]
		faces = [[0,1,2],[1,2,3],[2,0,3],[0,1,3]]
	else:
		localcurve = Curve(curve)
		heights = get_heights(height,hsegs,start_height,end_height)
		first = 0
		for spline in localcurve.splines:
			sverts, length = [],0
			close = spline.use_cyclic_u
			""" create verts """
			hsegs += int(start_height > 0)
			hsegs += int(end_height > 0)
			for i in range(hsegs+1):	
				h = heights[i]
				for j in range(len(spline.bezier_points)):
					count = get_csegs_count(spline,j,csegs,segmode)
					offset = Vector((0,0,h))
					v = get_segment_vertexes(spline,j,segmode,count,offset)
					sverts += v
				if length == 0:
					length = len(sverts)
			verts += sverts
			""" create body faces """
			for i in range(hsegs):
				f = i*length+first
				for j in range(length):
					a = f+j
					if j < length-1:
						b = a+1
						c = b+length
						d = c-1
						faces.append([a,b,c,d])
					elif close:
						b = f
						c = b+length
						d = a+length
						faces.append([a,b,c,d])
			""" create upepr cap """
			if capl and close:
				newface = [first+i for i in range(length-1,-1,-1)]
				faces.append(newface)
			""" create lower cap """
			if capu and close:
				f = first+length*hsegs
				newface = [f+i for i in range(length)]
				faces.append(newface)
			first += len(sverts)
	return verts,edges,faces
示例#7
0
class Curve_OT_Refine(Operator):
    bl_idname = "curve.refine"
    bl_label = "Refine"
    obj, curve = None, None
    new_point_added = False

    @classmethod
    def poll(self, ctx):
        if ctx.area.type == 'VIEW_3D':
            if len(ctx.scene.objects) > 0:
                if ctx.object != None:
                    return ctx.mode == 'EDIT_CURVE'
        return False

    def get_nearest_point_on_line(self, line, point):
        intersect = intersect_point_line(point, line[0], line[1])
        return intersect[0]

    def get_nearest_point(self, points):
        if points:
            nearest_point = points[0]
            for point in points:
                if point.distance < nearest_point.distance:
                    nearest_point = point
        return nearest_point

    def divide_segment(self, ctx, segment, statr_time, end_time, count, coord):
        statr_time = 0 if statr_time < 0 else statr_time
        end_time = 1 if end_time > 1 else end_time
        step = (end_time - statr_time) / count
        points = []
        for i in range(count):
            time = statr_time + i * step
            point_on_curve = self.obj.matrix_world @ segment.get_point_on(time)
            point_on_view = region_2d_to_location_3d(ctx.region,
                                                     ctx.space_data.region_3d,
                                                     coord, point_on_curve)
            distance = get_distance(point_on_curve, point_on_view)
            points.append(Point(segment, time, distance, point_on_view))
        return points

    def modal(self, ctx, event):
        ctx.area.tag_redraw()
        x, y = event.mouse_region_x, event.mouse_region_y

        if ctx.mode != 'EDIT_CURVE':
            return {'CANCELLED'}

        if not event.type in {'LEFTMOUSE', 'RIGHTMOUSE', 'MOUSEMOVE', 'ESC'}:
            return {'PASS_THROUGH'}

        elif event.type == 'MOUSEMOVE':
            # if vert created:
            # 	slide on the segment or spline
            # else:
            # 	pass
            pass

        elif event.type == 'LEFTMOUSE':
            if event.value == 'PRESS':
                self.new_point_added = False
                self.curve = Curve(self.obj)
                """ Divide each segment to 10 part and collect distance from click point """
                points = []
                for spline in self.curve.splines:
                    for segment in spline.get_as_segments():
                        points += self.divide_segment(ctx, segment, 0, 1, 10,
                                                      (x, y))

                nearest_point = self.get_nearest_point(points)
                """ second division steps """
                for step in {0.1, 0.01, 0.001}:
                    points.clear()
                    start_time, end_time = nearest_point.time - step, nearest_point.time + step
                    points = self.divide_segment(ctx, nearest_point.segment,
                                                 start_time, end_time, 10,
                                                 (x, y))
                    nearest_point = self.get_nearest_point(points)
                """ get nearest point of curve on 2d screen """
                nearest_point_on_curve = self.obj.matrix_world @ nearest_point.segment.get_point_on(
                    nearest_point.time)
                pl = location_3d_to_region_2d(ctx.region,
                                              ctx.space_data.region_3d,
                                              nearest_point_on_curve)
                """ insert if distance les than 10 pixel """
                if abs(x - pl.x) < 10 and abs(y - pl.y) < 10:
                    nearest_point.segment.spline.divid(
                        nearest_point.segment.index, nearest_point.time)
                    self.new_point_added = True

            if event.value == 'RELEASE' and self.new_point_added:
                """ Update and Get new genarated curve data """
                self.curve.update()
                bpy.ops.ed.undo_push()

            return {'RUNNING_MODAL'}

        elif event.type in {'RIGHTMOUSE', 'ESC'}:
            return {'CANCELLED'}

        return {'RUNNING_MODAL'}

    def invoke(self, ctx, event):
        self.obj = ctx.active_object
        self.curve = Curve(self.obj)
        ctx.window_manager.modal_handler_add(self)
        return {'RUNNING_MODAL'}
示例#8
0
 def invoke(self, ctx, event):
     self.obj = ctx.active_object
     self.curve = Curve(self.obj)
     ctx.window_manager.modal_handler_add(self)
     return {'RUNNING_MODAL'}