Macro Make Cube/fr: Difference between revisions

From FreeCAD Documentation
(Updating to match new version of source page)
(Updating to match new version of source page)
 
(One intermediate revision by the same user not shown)
(No difference)

Latest revision as of 09:24, 21 December 2021

Other languages:

Make Cube

Description
Cette macro créé un cube à partir de 4 points définis à l'écran

Version macro : 2.0
Date dernière modification : 2011-08-01
Version FreeCAD : <=0.11
Téléchargement : ToolBar Icon
Auteur: Yorik
Auteur
Yorik
Téléchargement
ToolBar Icon
Liens
Version Macro
2.0
Dernière modification
2011-08-01
Version(s) FreeCAD
<=0.11
Raccourci clavier
None
Voir aussi
None

Description

Cette macro crée un cube en donnant 4 points

Script

Icône de la barre d'outils

Macro_Make_Cube.FCMacro

# first we import the needed Draft modules
import draftTools, WorkingPlane
from draftlibs import fcvec

class myCommand(draftTools.Creator):
	"A class to define our custom command"
	# this command is based on the generic draftTools Creator template
	# it will ask for 4 points, defining our cube

	def __init__(self):
		# general setup, we define everything we'll need at startup
		print "Starting command..."
		# The Activated function of the Creator defines several variables such as self.view
		draftTools.Creator.Activated(self,"Cube")
		# we use the point UI of the draft Toolbar, which has X,Y and Z input fields
		self.ui.pointUi()
		self.points = [] # here we will store our points
		self.linetracker = draftTools.lineTracker()
		# we build a special cube tracker which is a list of 4 rectangle trackers
		self.cubetracker = []
		for i in range(4): 
			self.cubetracker.append(draftTools.rectangleTracker())
		self.constraintracker = draftTools.lineTracker(dotted=True)
		self.call = self.view.addEventCallback("SoEvent",self.action)

	def action(self,arg):
		# 3D scene handler. This function will be called by the 3D view on
		# special events such as keypress or mouse movements. We must take
		# care of treating what we want. All the hard work will be here!
		point,ctrlPoint = draftTools.getPoint(self,arg)
		if arg["Type"] == "SoKeyboardEvent": 
			if arg["Key"] == "ESCAPE":
				# important! if ESC is pressed, we cancel everything
				self.finish()
		elif arg["Type"] == "SoLocation2Event":
			# this will be executed in case of mouse movement
			if len(self.points) == 1:
				# this will be executed after we got our first point
				self.linetracker.p2(point)
				self.length = self.linetracker.getLength()
				self.ui.setRadiusValue(self.length)
			elif len(self.points) == 2:
				# now we already have our base line, we update the 1st rectangle
				self.cubetracker[0].p3(point)
				self.width = self.cubetracker[0].getSize()[1]
				self.ui.setRadiusValue(self.width)
			elif len(self.points) == 3:
				# we must first find our height point by projecting on the normal
				w = fcvec.project(point,self.normal)
				# then we update all rectangles
				self.cubetracker[1].p3((self.cubetracker[0].p2()).add(w))
				self.cubetracker[2].p3((self.cubetracker[0].p4()).add(w))
				self.cubetracker[3].p1((self.cubetracker[0].p1()).add(w))
				self.cubetracker[3].p3((self.cubetracker[0].p3()).add(w))
				self.height = w.Length
				self.ui.setRadiusValue(self.height)

		elif arg["Type"] == "SoMouseButtonEvent":
			if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"):
				# this will be executed in case of mouse button 1 pressed
				print "Got point: ",point
				if len(self.points) == 0:
					# this is our first clicked point	
					self.linetracker.p1(point)
					self.linetracker.on()
					# we set the radius UI, which has only a length input field
					# but we change the "radius" name
					self.ui.radiusUi()
					self.ui.labelRadius.setText("Width")
				elif len(self.points) == 1:
					# this is our second point
					# first we turn off our line tracker
					self.linetracker.off()
					# then we turn on only one of the rectangles
					baseline = point.sub(self.points[0])
					self.cubetracker[0].setPlane(baseline)
					self.cubetracker[0].p1(self.linetracker.p1())
					self.cubetracker[0].on()
					self.ui.labelRadius.setText("Length")
				elif len(self.points) == 2:
					# this is our third point
					# we can get the cubes Z axis from our first rectangle
					self.normal = self.cubetracker[0].getNormal()
					# we can therefore define the (u,v) planes of all rectangles
					u = self.cubetracker[0].u
					v = self.cubetracker[0].v
					self.cubetracker[1].setPlane(u,self.normal)
					self.cubetracker[2].setPlane(u,self.normal)
					self.cubetracker[3].setPlane(u,v)
					# and the origin points of the vertical rectangles
					self.cubetracker[1].p1(self.cubetracker[0].p1())
					self.cubetracker[2].p1(self.cubetracker[0].p3())
					# finally we turn all rectangles on
					for r in self.cubetracker:
						r.on()
					self.ui.labelRadius.setText("Heigth")
				elif len(self.points) == 3:
					# finally we have all our points! Let's create the actual cube.
					cube = self.doc.addObject("Part::Box","Cube")
					cube.Length = self.length
					cube.Width = self.width
					cube.Height = self.height
					# we get 3 points that define our cube orientation
					p1 = self.cubetracker[0].p1()
					p2 = self.cubetracker[0].p2()
					p3 = self.cubetracker[0].p4()
					cube.Placement = WorkingPlane.getPlacementFromPoints([p1,p2,p3])
					self.finish()
				self.points.append(point)

	def finish(self):
		# this will be executed when finishing the command
		# first thing, we remove our callback function
		self.view.removeEventCallback("SoEvent",self.call)
		# then we turn off the draft toolbar
		self.ui.offUi()
		# important! we must remove all coin stuff
		self.linetracker.finalize()
		for r in self.cubetracker:
			r.finalize()
		# then we call the generic finish function of our creator object
		draftTools.Creator.finish(self)
		print "Finished!"

#  finally, we execute our code!
myCommand()