Macro Perpendicular To Wire: Difference between revisions

From FreeCAD Documentation
m (Change section name to 'Usage')
m (grammar fixes + version bump)
Line 5: Line 5:
|Name=Macro Perpendicular To Wire
|Name=Macro Perpendicular To Wire
|Icon=Macro_Perpendicular_To_Wire.png
|Icon=Macro_Perpendicular_To_Wire.png
|Description=This macro positioned your object perpendicularly to wire selected.
|Description=This macro positions an object perpendicularly to the selected wire.
|Author=Mario52
|Author=Mario52
|Version=00.02
|Version=00.03
|Date=2019-04-06
|Date=2020-03-31
|FCVersion=All
|FCVersion=All
|Download=[https://www.freecadweb.org/wiki/images/0/0c/Macro_Perpendicular_To_Wire.png ToolBar Icon].
|Download=[https://www.freecadweb.org/wiki/images/0/0c/Macro_Perpendicular_To_Wire.png ToolBar Icon].
Line 14: Line 14:


==Description== <!--T:2-->
==Description== <!--T:2-->
This macro positioned your object perpendicularly to wire selected.
This macro positions an object perpendicularly to the selected wire.


==Usage== <!--T:3-->
==Usage== <!--T:3-->


<!--T:4-->
<!--T:4-->
# Install the macro via the [[Image:AddonManager.svg|24px|link=Addon Manager]] [[Addon Manager]]
# : select the path (May be an element or sub-element)
# Select the path (may be an element or sub-element)
# : select the object to align
# : run the macro
# Select the object to align
# Execute the macro


==Script== <!--T:5-->
==Script== <!--T:5-->
Line 35: Line 36:
__title__ = "Macro Perpendicular To Wire"
__title__ = "Macro Perpendicular To Wire"
__author__ = "Mario52"
__author__ = "Mario52"
__url__ = "https://www.freecadweb.org/wiki/index.php?title=Macro_Perpendicular_To_Wire"
__url__ = "https://wiki.freecadweb.org/Macro_Perpendicular_To_Wire"
__version__ = "00.02"
__version__ = "00.02"
__date__ = "06/04/2019"
__date__ = "06/04/2019"


import Draft, Part
import Draft, Part
Line 62: Line 63:
FreeCAD.ActiveDocument.recompute()
FreeCAD.ActiveDocument.recompute()
except Exception:
except Exception:
print( "Select twoo objects 1:The path 2:The objet to align" )
print( "Select two objects. 1:The path 2:The object to align" )


}}
}}
Line 129: Line 130:
</translate>
</translate>
{{Code|code=
{{Code|code=
# Discretizes the edge and returns a list of points.
#http://forum.freecadweb.org/viewtopic.php?f=12&t=16336#p129468
# Forum thread: http://forum.freecadweb.org/viewtopic.php?f=12&t=16336#p129468
#Discretizes the edge and returns a list of points.
#The function accepts keywords as argument:
# The function accepts keywords as argument:
#discretize(Number=n) => gives a list of 'n' equidistant points
# 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(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(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(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(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'
# 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
# and a curvature deflection of 'c'. Optionally a minimum number of points
#can be set which by default is set to 2.
# can be set which by default is set to 2.
}}
}}


<translate>
<translate>
== Disussions ==

<!--T:11-->
<!--T:11-->
The discussion on the forum [[https://forum.freecadweb.org/viewtopic.php?f=13&t=19899&start=20 Spiralbohrer]]
* [[https://forum.freecadweb.org/viewtopic.php?f=13&t=19899&start=20 Spiralbohrer]] discussion on the FC forum.
* http://forum.freecadweb.org/viewtopic.php?f=12&t=16336#p129468


==Version== <!--T:14-->
==Version== <!--T:14-->

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





Revision as of 18:13, 31 March 2020

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