Macro Align View to Face/cs: Difference between revisions

From FreeCAD Documentation
(Updating to match new version of source page)
(Updating to match new version of source page)
 
(12 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<languages/>
<languages/>
{{Macro/cs|Name=Macro Align View to Face|Name/cs=Macro Align View to Face|Description=This macro aligns the current view to a selected face|Author=Rockn|Version=1.0|Date=2014-03-12}}


<div class="mw-translate-fuzzy">
==Description==
{{Macro/cs
|Name=Macro Align View to Face
|Icone=Macro_Align_View_to_Face.png
|Translate=Macro Align View to Face
|Description=This macro aligns the current view to a selected face
|Author=Rockn
|Version=1.0
|Date=2014-03-12
|FCVersion=All
|Download=[https://www.freecadweb.org/wiki/images/d/d7/Macro_Align_View_to_Face.png ToolBar Icon]
}}
</div>


<span id="Description"></span>
This macro rotates the current view to point perpendicularly at a selected face of an existing object.
==Popis==


Toto makro otočí aktuální pohled na bod kolmo na vybranou plochu existujícího objektu.
==How to use==

# Select a face on an object
==Usage==
# Run the macro

<div class="mw-translate-fuzzy">
== Jak používat ==
# Vyberte objekt na objektu
# Spusťte makro
</div>


==Script==
==Script==


ToolBar Icon [[Image:Macro_Align_View_to_Face.png]]
{{Code|code=

'''Macro_Align_View_to_Face.FCMacro'''
{{MacroCode|code=


# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
# Set the current view perpendicular to the selected face
# Set the current view perpendicular to the selected line
# Place la vue perpendiculairement à la face selectionnee
# Place la vue perpendiculairement a la line selectionnee
# 2013 Jonathan Wiedemann, 2016 Werner Mayer
# 2013 Jonathan Wiedemann,
# 2016 Werner Mayer,
# 2022 tchernomax, https://forum.freecadweb.org/viewtopic.php?p=630019#p630019
# 2023 FreeCutter, modifications towards linked objects like in workbench Assembly 4 , https://forum.freecad.org/viewtopic.php?p=718516#p718516
#
__title__ = "Align_View_to_Face"
__author__ = "Jonathan Wiedemann (Rockn)"
__url__ = "https://www.freecadweb.org/"
__Wiki__ = "https://wiki.freecadweb.org/Macro_Align_View_to_Face"
__version__ = "3.1"
__date__ = "2023/11/12" #YYYY/MM/DD


from pivy import coin
from pivy import coin

import FreeCAD as app
import FreeCADGui as gui


def pointAt(normal, up):
def pointAt(normal, up):
Line 42: Line 76:
return App.Placement(rot).Rotation
return App.Placement(rot).Rotation


def get_selection_and_turn_view():
s=Gui.Selection.getSelectionEx()
doc = app.activeDocument()
obj=s[0]
if doc is None:
faceSel = obj.SubObjects[0]
app.Console.PrintWarning('Align_view_to_face: No file open, nothing to do\n')
dir = faceSel.normalAt(0,0)
return
cam = FreeCADGui.ActiveDocument.ActiveView.getCameraNode()

selection = gui.Selection.getSelectionEx('', 0) # Returns a vector of selection objects
if dir.z == 1 :
rot = pointAt(dir, App.Vector(0.0,1.0,0.0))
if not selection:
elif dir.z == -1 :
app.Console.PrintWarning('Align_view_to_face: Nothing selected, nothing to do\n')
rot = pointAt(dir, App.Vector(0.0,1.0,0.0))
return
else :
rot = pointAt(dir, App.Vector(0.0,0.0,1.0))
cam = FreeCADGui.ActiveDocument.ActiveView.getCameraNode()
''' used to understand the 'getSelection' results
for selection_object in selection:
object_ = selection_object.Object
sub_fullpaths = selection_object.SubElementNames
if not sub_fullpaths:
# An object is selected, not a face, edge, vertex.
print(object_.Name)
for sub_fullpath in sub_fullpaths:
# One or more subelements are selected.
print(object_.Name, sub_fullpath)
'''
sel = selection[0]
face = sel.SubObjects[0]
if face.Area == 0: # trying to avoid errors due to wrong selected objects
app.Console.PrintWarning('Align_view_to_face: Please select a face - not an edge or vertex\n')
return
dir = face.normalAt(0,0)
if dir.z == 1 :
rot = pointAt(dir, App.Vector(0.0,1.0,0.0))
elif dir.z == -1 :
rot = pointAt(dir, App.Vector(0.0,1.0,0.0))
else :
rot = pointAt(dir, App.Vector(0.0,0.0,1.0))
cam.orientation.setValue(rot.Q)
gui.SendMsgToActiveView("ViewSelection")
app.Console.PrintWarning('Align_view_to_face: Done\n')


if __name__ == '__main__':
cam.orientation.setValue(rot.Q)
get_selection_and_turn_view()
Gui.SendMsgToActiveView("ViewSelection")


}}
}}

Latest revision as of 12:00, 18 November 2023

Macro Align View to Face

Popis
This macro aligns the current view to a selected face

Version macro : 1.0
Date last modification : 2014-03-12
FreeCAD version : All
Download : ToolBar Icon
Autor: Rockn
Autor
Rockn
Download
ToolBar Icon
Odkazy
Verze
1.0
Datum poslední úpravy
2014-03-12
Verze FreeCAD
All
Výchozí zástupce
None
Viz též
None

Popis

Toto makro otočí aktuální pohled na bod kolmo na vybranou plochu existujícího objektu.

Usage

Jak používat

  1. Vyberte objekt na objektu
  2. Spusťte makro

Script

ToolBar Icon

Macro_Align_View_to_Face.FCMacro

# -*- coding: utf-8 -*-
# Set the current view perpendicular to the selected line
# Place la vue perpendiculairement a la line selectionnee
# 2013 Jonathan Wiedemann,
# 2016 Werner Mayer, 
# 2022 tchernomax, https://forum.freecadweb.org/viewtopic.php?p=630019#p630019
# 2023 FreeCutter, modifications towards linked objects like in workbench Assembly 4 , https://forum.freecad.org/viewtopic.php?p=718516#p718516
#
__title__   = "Align_View_to_Face"
__author__  = "Jonathan Wiedemann (Rockn)"
__url__     = "https://www.freecadweb.org/"
__Wiki__    = "https://wiki.freecadweb.org/Macro_Align_View_to_Face"
__version__ = "3.1"
__date__    = "2023/11/12"  #YYYY/MM/DD

from pivy import coin

import FreeCAD as app
import FreeCADGui as gui

def pointAt(normal, up):
    z = normal
    y = up
    x = y.cross(z)
    y = z.cross(x)
   
    rot = App.Matrix()
    rot.A11 = x.x
    rot.A21 = x.y
    rot.A31 = x.z
   
    rot.A12 = y.x
    rot.A22 = y.y
    rot.A32 = y.z
   
    rot.A13 = z.x
    rot.A23 = z.y
    rot.A33 = z.z

    return App.Placement(rot).Rotation

def get_selection_and_turn_view():
	doc = app.activeDocument()
	if doc is None:
		app.Console.PrintWarning('Align_view_to_face: No file open, nothing to do\n')
		return
	
	selection = gui.Selection.getSelectionEx('', 0) # Returns a vector of selection objects
	
	if not selection:
		app.Console.PrintWarning('Align_view_to_face: Nothing selected, nothing to do\n')
		return
	
	cam = FreeCADGui.ActiveDocument.ActiveView.getCameraNode()
	
	''' used to understand the 'getSelection' results
	for selection_object in selection:
		object_ = selection_object.Object
		sub_fullpaths = selection_object.SubElementNames
		if not sub_fullpaths:
			# An object is selected, not a face, edge, vertex.
			print(object_.Name)
		for sub_fullpath in sub_fullpaths:
			# One or more subelements are selected.
			print(object_.Name, sub_fullpath)
	'''
	
	sel = selection[0]
	face = sel.SubObjects[0]
	if face.Area == 0:			# trying to avoid errors due to wrong selected objects
		app.Console.PrintWarning('Align_view_to_face: Please select a face - not an edge or vertex\n')
		return
	dir = face.normalAt(0,0)
	
	if dir.z == 1 :
	    rot = pointAt(dir, App.Vector(0.0,1.0,0.0))
	elif dir.z == -1 :
	    rot = pointAt(dir, App.Vector(0.0,1.0,0.0))
	else :
	    rot = pointAt(dir, App.Vector(0.0,0.0,1.0))
	
	cam.orientation.setValue(rot.Q)
	gui.SendMsgToActiveView("ViewSelection")
	app.Console.PrintWarning('Align_view_to_face: Done\n')

if __name__ == '__main__':
	get_selection_and_turn_view()