Macro Perpendicular To Wire

From FreeCAD Documentation
Revision as of 18:13, 31 March 2020 by Kunda1 (talk | contribs) (grammar fixes + version bump)
Other languages:

Macro Perpendicular To Wire

Description
This macro positions an object perpendicularly to the selected wire.

Macro version: 00.03
Last modified: 2020-03-31
FreeCAD version: All
Download: ToolBar Icon.
Author: Mario52
Author
Mario52
Download
ToolBar Icon.
Links
Macro Version
00.03
Date last modified
2020-03-31
FreeCAD Version(s)
All
Default shortcut
None
See also
None

Description

This macro positions an object perpendicularly to the selected wire.

Usage

  1. Install the macro via the Addon Manager
  2. Select the path (may be an element or sub-element)
  3. Select the object to align
  4. Execute the macro

Script

The icon toolBar

Macro Perpendicular To Wire.FCMacro

# -*- coding: utf-8 -*-
__title__   = "Macro Perpendicular To Wire"
__author__  = "Mario52"
__url__     = "https://wiki.freecadweb.org/Macro_Perpendicular_To_Wire"
__version__ = "00.02"
__date__    = "06/04/2019"

import Draft, Part

try:
    sel = FreeCADGui.Selection.getSelection()                               # Select an object
    
    lineSelected = FreeCADGui.Selection.getSelectionEx()[0].SubObjects[0]   # first object the Path object or SubObjects
    myCircle     = sel[1]                                                   # second object
    
    pointsDirection  = []
    
    pointsDirection = lineSelected.discretize(Number=500)                   # discretize the path line first selection
    
    v=pointsDirection[0].sub(pointsDirection[1])                            # avec vecteurs 1 et 2 (direction debut ligne)
    r=App.Rotation(App.Vector(0,0,1),v)
    
    pl=FreeCAD.Placement()                                                  # placement object
    pl.Rotation.Q = r.Q
    pl.Base = pointsDirection[0]
    myCircle.Placement = pl
    
    del pointsDirection[:]
    FreeCAD.ActiveDocument.recompute()
except Exception:
    print( "Select two objects. 1:The path 2:The object to align" )

Options

Principle :

the line is cut in x points with "discretize()" (here Number=500 cuts begin 0 to 499 you can modify)

pointsDirection = lineSelected.Shape.discretize(Number=500)             # discretize the path line first selection

the perpendicularity is calculate between 2 points modify :

1:

v=pointsDirection[0].sub(pointsDirection[1])          # perpendicular of first > second point

2:

v=pointsDirection[-1].sub(pointsDirection[-2])       # perpendicular of last > before last point
pl.Base = pointsDirection[-1]                        # position base last point

3:

v=pointsDirection[100].sub(pointsDirection[101])   # perpendicular of point 100 > point 101
pl.Base = pointsDirection[100]                     # position base point 100

4:

v=pointsDirection[0].sub(pointsDirection[-1])         # perpendicular of first point > last point
pl.Base = pointsDirection[0]                          # position base first point

Example



for discretize other parameters

# Discretizes the edge and returns a list of points.
# Forum thread: http://forum.freecadweb.org/viewtopic.php?f=12&t=16336#p129468
# The function accepts keywords as argument:
# discretize(Number=n) => gives a list of 'n' equidistant points
# discretize(QuasiNumber=n) => gives a list of 'n' quasi equidistant points (is faster than the method above)
# discretize(Distance=d) => gives a list of equidistant points with distance 'd'
# discretize(Deflection=d) => gives a list of points with a maximum deflection 'd' to the edge
# discretize(QuasiDeflection=d) => gives a list of points with a maximum deflection 'd' to the edge (faster)
# discretize(Angular=a,Curvature=c,[Minimum=m]) => gives a list of points with an angular deflection of 'a'
# and a curvature deflection of 'c'. Optionally a minimum number of points
# can be set which by default is set to 2.

Disussions

Version

Ver 00.03 2020-03-21: Source and comment typo fixes Ver 00.02 2019-04-06: Python 3