Code snippets/ru: Difference between revisions
(Updating to match new version of source page) |
(Updating to match new version of source page) |
||
(46 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
<languages/> |
|||
{{Page in progress}} |
|||
<div class="mw-translate-fuzzy"> |
|||
{{docnav/ru|[[Embedding FreeCAD/ru|Embedding FreeCAD]]|[[Line drawing function/ru|Line drawing function]]}} |
|||
</div> |
|||
{{TutorialInfo/ru |
{{TutorialInfo/ru |
||
|Topic= Python |
|Topic= Python |
||
Line 8: | Line 14: | ||
}} |
}} |
||
== Introduction == |
|||
<div class="mw-translate-fuzzy"> |
|||
Эта страница содержит примеры, обрывки, куски FreeCAD python кода, собранный для получения пользователями оптыта и обсуждения на форумах. Читайте и используете их как начало для ваших собственных сценариев... |
Эта страница содержит примеры, обрывки, куски FreeCAD python кода, собранный для получения пользователями оптыта и обсуждения на форумах. Читайте и используете их как начало для ваших собственных сценариев... |
||
</div> |
|||
=== Обычный файл InitGui.py === |
=== Обычный файл InitGui.py === |
||
Каждый модуль должен содержать, помимо основного файла модуля, файл InitGui.py , ответственного за вставку модуля в главное Gui. Это простой пример |
Каждый модуль должен содержать, помимо основного файла модуля, файл InitGui.py , ответственного за вставку модуля в главное Gui. Это простой пример |
||
{{Code|code= |
{{Code|code= |
||
class ScriptWorkbench (Workbench): |
class ScriptWorkbench (Workbench): |
||
Line 28: | Line 38: | ||
Это пример головного файла модуля, содержащего всё что ваш модуль делает. Это Scripts.py файл вызванный в предыдущем примере. Вы можете установить здесь все ваши пользовательские команды. |
Это пример головного файла модуля, содержащего всё что ваш модуль делает. Это Scripts.py файл вызванный в предыдущем примере. Вы можете установить здесь все ваши пользовательские команды. |
||
{{Code|code= |
{{Code|code= |
||
import FreeCAD, FreeCADGui |
import FreeCAD, FreeCADGui |
||
Line 46: | Line 57: | ||
Это строка должна быть добавлена в InitGui.py файл для добавления нового расширения файлов в список: |
Это строка должна быть добавлена в InitGui.py файл для добавления нового расширения файлов в список: |
||
{{Code|code= |
{{Code|code= |
||
# Assumes Import_Ext.py is the file that has the code for opening and reading .ext files |
# Assumes Import_Ext.py is the file that has the code for opening and reading .ext files |
||
FreeCAD.addImportType("Your new File Type (*.ext)","Import_Ext") |
FreeCAD.addImportType("Your new File Type (*.ext)","Import_Ext") |
||
}} |
}} |
||
Тогда в файле Import_Ext.py: |
Тогда в файле Import_Ext.py: |
||
{{Code|code= |
{{Code|code= |
||
def open(filename): |
def open(filename): |
||
Line 57: | Line 71: | ||
doc.recompute() |
doc.recompute() |
||
}} |
}} |
||
Экспорт вашего документа в новые типы файлов работает схожим образом, исключая того что вы используете: |
Экспорт вашего документа в новые типы файлов работает схожим образом, исключая того что вы используете: |
||
FreeCAD.addExportType("Your new File Type (*.ext)","Export_Ext") |
FreeCAD.addExportType("Your new File Type (*.ext)","Export_Ext") |
||
Line 63: | Line 78: | ||
Простейшая линия через две точки. |
Простейшая линия через две точки. |
||
{{Code|code= |
{{Code|code= |
||
Line 78: | Line 94: | ||
Многоугольник это просто набор соединенных отрезков (polyline в AutoCAD). Он необязательно должен быть замкнутым. |
Многоугольник это просто набор соединенных отрезков (polyline в AutoCAD). Он необязательно должен быть замкнутым. |
||
{{Code|code= |
{{Code|code= |
||
import Part,PartGui |
import Part, PartGui |
||
doc=App.activeDocument() |
doc = App.activeDocument() |
||
n=list() |
n = list() |
||
# create a 3D vector, set its coordinates and add it to the list |
# create a 3D vector, set its coordinates and add it to the list |
||
v=App.Vector(0,0,0) |
v = App.Vector(0,0,0) |
||
n.append(v) |
n.append(v) |
||
v=App.Vector(10,0,0) |
v = App.Vector(10,0,0) |
||
n.append(v) |
n.append(v) |
||
#... repeat for all nodes |
#... repeat for all nodes |
||
# Create a polygon object and set its nodes |
# Create a polygon object and set its nodes |
||
p=doc.addObject("Part::Polygon","Polygon") |
p = doc.addObject("Part::Polygon","Polygon") |
||
p.Nodes=n |
p.Nodes = n |
||
doc.recompute() |
doc.recompute() |
||
}} |
}} |
||
=== Добавление и удаление объекта из группы === |
=== Добавление и удаление объекта из группы === |
||
{{Code|code= |
{{Code|code= |
||
doc=App.activeDocument() |
doc=App.activeDocument() |
||
Line 102: | Line 122: | ||
grp.removeObject(lin) # removes the lin object from the group grp |
grp.removeObject(lin) # removes the lin object from the group grp |
||
}} |
}} |
||
Примечание: Вы также можете добавлять другие группы в группу... |
Примечание: Вы также можете добавлять другие группы в группу... |
||
=== Добавление Полигиональной модели === |
=== Добавление Полигиональной модели === |
||
{{Code|code= |
{{Code|code= |
||
import Mesh |
import Mesh |
||
Line 131: | Line 153: | ||
=== Добавление дуги или огружности === |
=== Добавление дуги или огружности === |
||
{{Code|code= |
{{Code|code= |
||
import Part |
import Part |
||
Line 141: | Line 164: | ||
}} |
}} |
||
<div class="mw-translate-fuzzy"> |
|||
=== Получение доступа и изменение представления объекта === |
=== Получение доступа и изменение представления объекта === |
||
Каждый объект в FreeCAD документе оссоциируется с визуальным представлением объекта, которое хранит все параметры , определяющие как объект представлен, такие как цвет, длина линий, и.т.д... |
Каждый объект в FreeCAD документе оссоциируется с визуальным представлением объекта, которое хранит все параметры , определяющие как объект представлен, такие как цвет, длина линий, и.т.д... |
||
</div> |
|||
{{Code|code= |
{{Code|code= |
||
gad=Gui.activeDocument() |
gad = Gui.activeDocument() # access the active document containing all |
||
# view representations of the features in the |
# view representations of the features in the |
||
# corresponding App document |
# corresponding App document |
||
v=gad.getObject("Cube") |
v = gad.getObject("Cube") # access the view representation to the Mesh feature 'Cube' |
||
v.ShapeColor # prints the color to the console |
v.ShapeColor # prints the color to the console |
||
v.ShapeColor=(1.0,1.0,1.0) # sets the shape color to white |
v.ShapeColor=(1.0,1.0,1.0) # sets the shape color to white |
||
Line 157: | Line 183: | ||
Inventor позваляет добавить оди и более узлов обратного вызова(callback) в дерево сцен просмотрщика. По умолчанию в FreeCAD один узел обратного вызова установлен в кадое окно просмотра(просмотрщик), который позволяет добавить глобальные или статические C++ функции. Соответствуюе Python привязки, некоторые методы которых позволяют использовать эту технику (callback) в Python коде. |
Inventor позваляет добавить оди и более узлов обратного вызова(callback) в дерево сцен просмотрщика. По умолчанию в FreeCAD один узел обратного вызова установлен в кадое окно просмотра(просмотрщик), который позволяет добавить глобальные или статические C++ функции. Соответствуюе Python привязки, некоторые методы которых позволяют использовать эту технику (callback) в Python коде. |
||
{{Code|code= |
{{Code|code= |
||
App.newDocument() |
App.newDocument() |
||
Line 173: | Line 200: | ||
c = v.addEventCallback("SoMouseButtonEvent",o.logPosition) |
c = v.addEventCallback("SoMouseButtonEvent",o.logPosition) |
||
}} |
}} |
||
Теперь, выберите какую нибудь область в окне 3D-просмотра и наблюдайте сообщения в окне вывода. Для завершения наблюдения просто вызовите |
Теперь, выберите какую нибудь область в окне 3D-просмотра и наблюдайте сообщения в окне вывода. Для завершения наблюдения просто вызовите |
||
{{Code|code= |
{{Code|code= |
||
v.removeEventCallback("SoMouseButtonEvent",c) |
v.removeEventCallback("SoMouseButtonEvent",c) |
||
}} |
}} |
||
Поддерживаются следующие типы событий |
Поддерживаются следующие типы событий |
||
* SoEvent -- Все события |
* SoEvent -- Все события |
||
Line 214: | Line 244: | ||
===Display keys pressed and Events command=== |
===Display keys pressed and Events command=== |
||
This macro displays in the report view the keys pressed and all events command |
This macro displays in the report view the keys pressed and all events command |
||
<syntaxhighlight> |
|||
{{Code|code= |
|||
App.newDocument() |
App.newDocument() |
||
v=Gui.activeDocument().activeView() |
v=Gui.activeDocument().activeView() |
||
Line 231: | Line 262: | ||
#v.removeEventCallback("SoEvent",c) # remove ViewObserver |
#v.removeEventCallback("SoEvent",c) # remove ViewObserver |
||
}} |
|||
</syntaxhighlight> |
|||
=== Манипулирование scenegraph в Python === |
=== Манипулирование scenegraph в Python === |
||
Кроме того можно получить и изменить граф сцены в Python, с помощью модуля 'pivy' -- Python привязки к Coin. |
Кроме того можно получить и изменить граф сцены в Python, с помощью модуля 'pivy' -- Python привязки к Coin. |
||
{{Code|code= |
{{Code|code= |
||
from pivy.coin import * # load the pivy module |
from pivy.coin import * # load the pivy module |
||
Line 242: | Line 275: | ||
view.fitAll() |
view.fitAll() |
||
}} |
}} |
||
Python API для pivy создано используя инструмент SWIG. Так как мы используем в FreeCAD некоторые самостоятельно записанные узлы вы не можете создавать их напрямую через Python. |
Python API для pivy создано используя инструмент SWIG. Так как мы используем в FreeCAD некоторые самостоятельно записанные узлы вы не можете создавать их напрямую через Python. |
||
Однако, возможно создать узел в его внутренним именем. Экземпляр типа 'SoFCSelection' может быть создан |
Однако, возможно создать узел в его внутренним именем. Экземпляр типа 'SoFCSelection' может быть создан |
||
{{Code|code= |
{{Code|code= |
||
type = SoType.fromName("SoFCSelection") |
type = SoType.fromName("SoFCSelection") |
||
Line 252: | Line 287: | ||
Добавление новых узлов в граф сцены(scenegraph) может сделать таким образом. Всегда заботтесь о добавлении SoSeparator содержащего информацию о геометрии, координатах и материалах объекта. В следующем примере добавляется красная линия из точки (0,0,0) в (10,0,0): |
Добавление новых узлов в граф сцены(scenegraph) может сделать таким образом. Всегда заботтесь о добавлении SoSeparator содержащего информацию о геометрии, координатах и материалах объекта. В следующем примере добавляется красная линия из точки (0,0,0) в (10,0,0): |
||
{{Code|code= |
{{Code|code= |
||
from pivy import coin |
from pivy import coin |
||
Line 268: | Line 304: | ||
sg.addChild(no) |
sg.addChild(no) |
||
}} |
}} |
||
Чтобы удалить её, просто введите: |
Чтобы удалить её, просто введите: |
||
{{Code|code= |
{{Code|code= |
||
sg.removeChild(no) |
sg.removeChild(no) |
||
}} |
}} |
||
<div class="mw-collapsible mw-collapsed toccolours" style="width:800px"> |
|||
===Saves the sceneGraph with a rotation in a series of 36 files in the X Y Z axis=== |
===Saves the sceneGraph with a rotation in a series of 36 files in the X Y Z axis=== |
||
View the code snippet by expanding this section<div class="mw-collapsible-content"> |
|||
{{Code|code= |
{{Code|code= |
||
import math |
import math |
||
Line 348: | Line 387: | ||
view.saveImage(dirname+"z-%d.png" % i,*size) |
view.saveImage(dirname+"z-%d.png" % i,*size) |
||
}} |
}} |
||
</div> <!--END collapsible section. Do not remove! --> |
|||
</div> <!--END collapsible section. Do not remove! --> |
|||
<div class="mw-translate-fuzzy"> |
|||
===Добавление пользовательских виджетов к интерфейсу=== |
===Добавление пользовательских виджетов к интерфейсу=== |
||
Вы можете содать собственные виджеты с помощью Qt designer, превратив их в сценарии на python, с помощью |
Вы можете содать собственные виджеты с помощью Qt designer, превратив их в сценарии на python, с помощью PySide, и загрузив их в FreeCAD. |
||
</div> |
|||
Python код созданный с помощью Ui python compiler (это инструмент для конвертирования файлов ui. созданных qt-designer в python код) в основном выглядит так (это простой пример, вы также может писать этот код напряму с помощью python): |
Python код созданный с помощью Ui python compiler (это инструмент для конвертирования файлов ui. созданных qt-designer в python код) в основном выглядит так (это простой пример, вы также может писать этот код напряму с помощью python): |
||
{{Code|code= |
{{Code|code= |
||
class myWidget_Ui(object): |
class myWidget_Ui(object): |
||
def setupUi(self, myWidget): |
|||
myWidget.setObjectName("my Nice New Widget") |
myWidget.setObjectName("my Nice New Widget") |
||
myWidget.resize(QtCore.QSize(QtCore.QRect(0,0,300,100).size()).expandedTo(myWidget.minimumSizeHint())) # sets size of the widget |
myWidget.resize(QtCore.QSize(QtCore.QRect(0,0,300,100).size()).expandedTo(myWidget.minimumSizeHint())) # sets size of the widget |
||
self.label = QtGui.QLabel(myWidget) # creates a label |
self.label = QtGui.QLabel(myWidget) # creates a label |
||
self.label.setGeometry(QtCore.QRect(50,50,200,24)) # sets its size |
self.label.setGeometry(QtCore.QRect(50,50,200,24)) # sets its size |
||
self.label.setObjectName("label") # sets its name, so it can be found by name |
self.label.setObjectName("label") # sets its name, so it can be found by name |
||
def retranslateUi(self, draftToolbar): # built-in QT function that manages translations of widgets |
|||
myWidget.setWindowTitle(QtGui.QApplication.translate("myWidget", "My Widget", None, QtGui.QApplication.UnicodeUTF8)) |
myWidget.setWindowTitle(QtGui.QApplication.translate("myWidget", "My Widget", None, QtGui.QApplication.UnicodeUTF8)) |
||
self.label.setText(QtGui.QApplication.translate("myWidget", "Welcome to my new widget!", None, QtGui.QApplication.UnicodeUTF8)) |
self.label.setText(QtGui.QApplication.translate("myWidget", "Welcome to my new widget!", None, QtGui.QApplication.UnicodeUTF8)) |
||
}} |
}} |
||
Тогда все что вам нужно сделать, это создать ссылку на FreeCAD Qt окно, вставить виджет в него, и "преобразовать" этот виджет в ваш с Ui кодом который мы только что сделали: |
Тогда все что вам нужно сделать, это создать ссылку на FreeCAD Qt окно, вставить виджет в него, и "преобразовать" этот виджет в ваш с Ui кодом который мы только что сделали: |
||
{{Code|code= |
{{Code|code= |
||
app = QtGui.qApp |
app = QtGui.qApp |
||
Line 382: | Line 424: | ||
===Adding a Tab to the Combo View=== |
===Adding a Tab to the Combo View=== |
||
The following code allows you to add a tab to the |
The following code allows you to add a tab to the [[Combo view]], separate from the preexisting "Model" and "Tasks" tabs. It also uses the {{incode|uic}} module to load an UI file directly in that tab. |
||
{{Code|code= |
{{Code|code= |
||
# create new Tab in ComboView |
# create new Tab in ComboView |
||
Line 418: | Line 461: | ||
}} |
}} |
||
===Enable or disable a window=== |
===Enable or disable a window=== |
||
This script give the ability to manipulate the UI from the [[Python console]] to show/hide different components in the FreeCAD [[interface]] such as: |
|||
* [[Report view]] |
|||
* [[Tree view]] |
|||
* [[Property editor|Property view]] |
|||
* [[Selection view]] |
|||
* [[Combo View]] |
|||
* [[Python console]] |
|||
* draftToolbar |
|||
{{Code|code= |
{{Code|code= |
||
from PySide import QtGui |
from PySide import QtGui |
||
mw=FreeCADGui.getMainWindow() |
mw = FreeCADGui.getMainWindow() |
||
dws=mw.findChildren(QtGui.QDockWidget) |
dws = mw.findChildren(QtGui.QDockWidget) |
||
# objectName may be : |
# objectName may be : |
||
Line 435: | Line 489: | ||
for i in dws: |
for i in dws: |
||
if i.objectName() == "Report view": |
if i.objectName() == "Report view": |
||
dw=i |
dw = i |
||
break |
break |
||
va=dw.toggleViewAction() |
va = dw.toggleViewAction() |
||
va.setChecked(True) # True or False |
va.setChecked(True) # True or False |
||
dw.setVisible(True) # True or False |
dw.setVisible(True) # True or False |
||
Line 444: | Line 498: | ||
===Opening a custom webpage=== |
===Opening a custom webpage=== |
||
{{Code|code= |
{{Code|code= |
||
import WebGui |
import WebGui |
||
Line 450: | Line 505: | ||
===Getting the HTML contents of an opened webpage=== |
===Getting the HTML contents of an opened webpage=== |
||
{{Code|code= |
{{Code|code= |
||
from |
from PySide import QtGui,QtWebKit |
||
a = QtGui.qApp |
a = QtGui.qApp |
||
mw = a.activeWindow() |
mw = a.activeWindow() |
||
Line 460: | Line 516: | ||
===Retrieve and use the coordinates of 3 selected points or objects=== |
===Retrieve and use the coordinates of 3 selected points or objects=== |
||
{{Code|code= |
{{Code|code= |
||
# -*- coding: utf-8 -*- |
# -*- coding: utf-8 -*- |
||
Line 487: | Line 544: | ||
===List all objects=== |
===List all objects=== |
||
{{Code|code= |
{{Code|code= |
||
# -*- coding: utf-8 -*- |
# -*- coding: utf-8 -*- |
||
Line 507: | Line 565: | ||
#doc.removeObject("Box") # Clears the designated object |
#doc.removeObject("Box") # Clears the designated object |
||
}} |
}} |
||
===List the dimensions of an object, given its name=== |
===List the dimensions of an object, given its name=== |
||
<syntaxhighlight> |
|||
{{Code|code= |
|||
for edge in FreeCAD.ActiveDocument.MyObjectName.Shape.Edges: # replace "MyObjectName" for list |
for edge in FreeCAD.ActiveDocument.MyObjectName.Shape.Edges: # replace "MyObjectName" for list |
||
print edge.Length |
print edge.Length |
||
}} |
|||
</syntaxhighlight> |
|||
===Function resident with the mouse click action=== |
===Function resident with the mouse click action=== |
||
Here with '''SelObserver''' on a object select |
Here with '''SelObserver''' on a object select |
||
{{Code|code= |
{{Code|code= |
||
# -*- coding: utf-8 -*- |
# -*- coding: utf-8 -*- |
||
Line 547: | Line 608: | ||
Other example with '''ViewObserver''' on a object select or view |
Other example with '''ViewObserver''' on a object select or view |
||
<syntaxhighlight> |
|||
{{Code|code= |
|||
App.newDocument() |
App.newDocument() |
||
v=Gui.activeDocument().activeView() |
v=Gui.activeDocument().activeView() |
||
Line 570: | Line 632: | ||
c = v.addEventCallback("SoMouseButtonEvent",o.logPosition) |
c = v.addEventCallback("SoMouseButtonEvent",o.logPosition) |
||
}} |
|||
</syntaxhighlight> |
|||
===Finding-selecting all elements below cursor=== |
===Finding-selecting all elements below cursor=== |
||
{{Code|code= |
{{Code|code= |
||
from pivy import coin |
from pivy import coin |
||
Line 609: | Line 673: | ||
#FreeCADGui.Selection.addSelection(FreeCAD.ActiveDocument.Box,'Face2',21.0,8.604081153869629,8.553047180175781) |
#FreeCADGui.Selection.addSelection(FreeCAD.ActiveDocument.Box,'Face2',21.0,8.604081153869629,8.553047180175781) |
||
}} |
}} |
||
<div class="mw-collapsible mw-collapsed toccolours"> |
|||
===List the components of an object=== |
===List the components of an object=== |
||
This function list the components of an object and extracts: |
|||
* this object its XYZ coordinates, |
|||
* its edges and their lengths center of mass and coordinates |
|||
* its faces and their center of mass |
|||
* its faces and their surfaces and coordinates |
|||
<div class="mw-collapsible-content"> |
|||
{{Code|code= |
{{Code|code= |
||
# -*- coding: utf-8 -*- |
# -*- coding: utf-8 -*- |
||
Line 708: | Line 779: | ||
detail() |
detail() |
||
}} |
}} |
||
</div> <!-- End of collapsible div --> |
|||
</div> <!-- End of collapsible div --> |
|||
===List the PropertiesList=== |
===List the PropertiesList=== |
||
{{Code|code= |
{{Code|code= |
||
import FreeCADGui |
import FreeCADGui |
||
Line 718: | Line 792: | ||
Console.PrintMessage("Property: "+ str(p)+ " Value: " + str(o.getPropertyByName(p))+"\r\n") |
Console.PrintMessage("Property: "+ str(p)+ " Value: " + str(o.getPropertyByName(p))+"\r\n") |
||
}} |
}} |
||
===Adding one Property "Comment"=== |
|||
===Adding a single Property Comment=== |
|||
{{Code|code= |
{{Code|code= |
||
import Draft |
import Draft |
||
Line 725: | Line 801: | ||
App.activeDocument().recompute() |
App.activeDocument().recompute() |
||
}} |
}} |
||
<div class="mw-collapsible mw-collapsed toccolours"> |
|||
===Search and data extraction=== |
===Search and data extraction=== |
||
Line 732: | Line 810: | ||
Each section is independently and is separated by "############" can be copied directly into the Python console, or in a macro or use this macro. The description of the macro in the commentary. |
Each section is independently and is separated by "############" can be copied directly into the Python console, or in a macro or use this macro. The description of the macro in the commentary. |
||
Displaying it in the " |
Displaying it in the "Report View" window (View > Views > Report view) |
||
{{Code|code= |
|||
<div class="mw-collapsible-content"> |
|||
{{Code|code= |
|||
# -*- coding: utf-8 -*- |
# -*- coding: utf-8 -*- |
||
from __future__ import unicode_literals |
from __future__ import unicode_literals |
||
Line 746: | Line 825: | ||
# Each section can be copied directly into the Python console, or in a macro or uses this macro |
# Each section can be copied directly into the Python console, or in a macro or uses this macro |
||
# Certain commands as repeat alone approach is different |
# Certain commands as repeat alone approach is different |
||
# Displayed |
# Displayed in Report view: View > Views > report view |
||
# |
# |
||
# rev:30/08/2014:29/09/2014:17/09/2015 |
# rev:30/08/2014:29/09/2014:17/09/2015 22/11/2019 |
||
from FreeCAD import Base |
from FreeCAD import Base |
||
import DraftVecUtils, Draft, Part |
import DraftVecUtils, Draft, Part |
||
# search the name of the active document |
|||
mydoc = FreeCAD.activeDocument().Name # Name of active Document |
mydoc = FreeCAD.activeDocument().Name # Name of active Document |
||
App.Console.PrintMessage("Active docu : "+(mydoc)+"\n") |
App.Console.PrintMessage("Active docu : "+(mydoc)+"\n") |
||
################################################################################## |
################################################################################## |
||
# search the label of the object selected |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
||
object_Label = sel[0].Label # Label of the object (modifiable) |
object_Label = sel[0].Label # Label of the object (modifiable) |
||
App.Console.PrintMessage("object_Label : "+(object_Label)+"\n") |
App.Console.PrintMessage("object_Label : "+(object_Label)+"\n") |
||
################################################################################## |
################################################################################## |
||
#TypeID object FreeCAD selected |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
||
App.Console.PrintMessage("sel : "+str(sel[0])+"\n\n") # sel[0] first object selected |
App.Console.PrintMessage("sel : "+str(sel[0])+"\n\n") # sel[0] first object selected |
||
################################################################################## |
################################################################################## |
||
# search the Name of the object selected |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
||
object_Name = sel[0].Name # Name of the object (not modifiable) |
object_Name = sel[0].Name # Name of the object (not modifiable) |
||
App.Console.PrintMessage("object_Name : "+str(object_Name)+"\n\n") |
App.Console.PrintMessage("object_Name : "+str(object_Name)+"\n\n") |
||
################################################################################## |
################################################################################## |
||
# search the Sub Element Name of the sub object selected |
|||
try: |
try: |
||
SubElement = FreeCADGui.Selection.getSelectionEx() # sub element name with getSelectionEx() |
SubElement = FreeCADGui.Selection.getSelectionEx() # sub element name with getSelectionEx() |
||
Line 778: | Line 862: | ||
App.Console.PrintMessage("Oups"+"\n\n") |
App.Console.PrintMessage("Oups"+"\n\n") |
||
################################################################################## |
################################################################################## |
||
# give the length of the subObject selected |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
|||
SubElementLength = Gui.Selection.getSelectionEx()[0].SubObjects[0].Length # sub element or element name with getSelectionEx() |
|||
App.Console.PrintMessage("sel : "+str(sel[0])+"\n\n") # sel[0] first object selected |
|||
App.Console.PrintMessage("SubElement length: "+str(SubElementLength)+"\n")# length |
|||
################################################################################## |
################################################################################## |
||
# list the edges and the coordinates of the object[0] selected |
|||
SubElement = FreeCADGui.Selection.getSelectionEx() # sub element name with getSelectionEx() |
|||
App.Console.PrintMessage("SubElement : "+str(SubElement[0])+"\n\n") # name of sub element |
|||
################################################################################## |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
||
i = 0 |
i = 0 |
||
Line 794: | Line 876: | ||
a = sel[0].Shape.Edges[j[0]].Vertexes[0] |
a = sel[0].Shape.Edges[j[0]].Vertexes[0] |
||
App.Console.PrintMessage("X1 : "+str(a.Point.x)+"\n") # coordinate XYZ first point |
App.Console.PrintMessage("X1 : "+str(a.Point.x)+"\n") # coordinate XYZ first point |
||
App.Console.PrintMessage("Y1 : "+str(a.Point.y)+"\n") |
App.Console.PrintMessage("Y1 : "+str(a.Point.y)+"\n") # |
||
App.Console.PrintMessage("Z1 : "+str(a.Point.z)+"\n") |
App.Console.PrintMessage("Z1 : "+str(a.Point.z)+"\n") # |
||
try: |
try: |
||
a = sel[0].Shape.Edges[j[0]].Vertexes[1] |
a = sel[0].Shape.Edges[j[0]].Vertexes[1] |
||
App.Console.PrintMessage("X2 : "+str(a.Point.x)+"\n") # coordinate XYZ second point |
App.Console.PrintMessage("X2 : "+str(a.Point.x)+"\n") # coordinate XYZ second point |
||
App.Console.PrintMessage("Y2 : "+str(a.Point.y)+"\n") |
App.Console.PrintMessage("Y2 : "+str(a.Point.y)+"\n") # |
||
App.Console.PrintMessage("Z2 : "+str(a.Point.z)+"\n") |
App.Console.PrintMessage("Z2 : "+str(a.Point.z)+"\n") # |
||
except: |
except: |
||
App.Console.PrintMessage("Oups"+"\n") |
App.Console.PrintMessage("Oups"+"\n") |
||
App.Console.PrintMessage("\n") |
App.Console.PrintMessage("\n") |
||
################################################################################## |
################################################################################## |
||
# give the sub element name, length, coordinates, BoundBox, BoundBox.Center, Area of the SubObjects selected |
|||
try: |
try: |
||
SubElement = FreeCADGui.Selection.getSelectionEx() # sub element name with getSelectionEx() |
SubElement = FreeCADGui.Selection.getSelectionEx() # sub element name with getSelectionEx() |
||
Line 820: | Line 903: | ||
subObjectZ1 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[0].Point.z # sub element coordinate Z1 |
subObjectZ1 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[0].Point.z # sub element coordinate Z1 |
||
App.Console.PrintMessage("subObject_Z1 : "+str(subObjectZ1)+"\n\n") |
App.Console.PrintMessage("subObject_Z1 : "+str(subObjectZ1)+"\n\n") |
||
try: |
|||
subObjectX2 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[1].Point.x # sub element coordinate X2 |
|||
subObjectX2 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[1].Point.x # sub element coordinate X2 |
|||
App.Console.PrintMessage("subObject_X2 : "+str(subObjectX2)+"\n") |
|||
App.Console.PrintMessage("subObject_X2 : "+str(subObjectX2)+"\n") |
|||
subObjectY2 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[1].Point.y # sub element coordinate Y2 |
|||
subObjectY2 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[1].Point.y # sub element coordinate Y2 |
|||
App.Console.PrintMessage("subObject_Y2 : "+str(subObjectY2)+"\n") |
|||
App.Console.PrintMessage("subObject_Y2 : "+str(subObjectY2)+"\n") |
|||
subObjectZ2 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[1].Point.z # sub element coordinate Z2 |
|||
subObjectZ2 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[1].Point.z # sub element coordinate Z2 |
|||
App.Console.PrintMessage("subObject_Z2 : "+str(subObjectZ2)+"\n\n") |
|||
App.Console.PrintMessage("subObject_Z2 : "+str(subObjectZ2)+"\n\n") |
|||
except: |
|||
App.Console.PrintMessage("Oups"+"\n\n") |
|||
subObjectBoundBox = Gui.Selection.getSelectionEx()[0].SubObjects[0].BoundBox # sub element BoundBox coordinates |
subObjectBoundBox = Gui.Selection.getSelectionEx()[0].SubObjects[0].BoundBox # sub element BoundBox coordinates |
||
App.Console.PrintMessage("subObjectBBox : "+str(subObjectBoundBox)+"\n") |
App.Console.PrintMessage("subObjectBBox : "+str(subObjectBoundBox)+"\n") |
||
Line 839: | Line 925: | ||
App.Console.PrintMessage("Oups"+"\n\n") |
App.Console.PrintMessage("Oups"+"\n\n") |
||
################################################################################## |
################################################################################## |
||
# give the area of the object |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
||
surface = sel[0].Shape.Area # Area object complete |
surface = sel[0].Shape.Area # Area object complete |
||
App.Console.PrintMessage("surfaceObjet : "+str(surface)+"\n\n") |
App.Console.PrintMessage("surfaceObjet : "+str(surface)+"\n\n") |
||
################################################################################## |
################################################################################## |
||
# give the Center Of Mass and coordinates of the object |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
||
CenterOfMass = sel[0].Shape.CenterOfMass # Center of Mass of the object |
CenterOfMass = sel[0].Shape.CenterOfMass # Center of Mass of the object |
||
App.Console.PrintMessage("CenterOfMass : "+str(CenterOfMass)+"\n") |
App.Console.PrintMessage("CenterOfMass : "+str(CenterOfMass)+"\n") |
||
App.Console.PrintMessage("CenterOfMassX : "+str(CenterOfMass[0])+"\n") # coordinates [0]=X [1]=Y [2]=Z |
App.Console.PrintMessage("CenterOfMassX : "+str(CenterOfMass[0])+"\n") # coordinates [0]=X [1]=Y [2]=Z |
||
App.Console.PrintMessage("CenterOfMassY : "+str(CenterOfMass[1])+"\n") |
App.Console.PrintMessage("CenterOfMassY : "+str(CenterOfMass[1])+"\n") # or CenterOfMass.x, CenterOfMass.y, CenterOfMass.z |
||
App.Console.PrintMessage("CenterOfMassZ : "+str(CenterOfMass[2])+"\n\n") |
App.Console.PrintMessage("CenterOfMassZ : "+str(CenterOfMass[2])+"\n\n") |
||
################################################################################## |
################################################################################## |
||
# list the all faces of the object selected |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
||
for j in enumerate(sel[0].Shape.Faces): # List alles faces of the object |
for j in enumerate(sel[0].Shape.Faces): # List alles faces of the object |
||
Line 858: | Line 947: | ||
App.Console.PrintMessage("\n\n") |
App.Console.PrintMessage("\n\n") |
||
################################################################################## |
################################################################################## |
||
# give the volume of the object selected |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
||
volume_ = sel[0].Shape.Volume # Volume of the object |
volume_ = sel[0].Shape.Volume # Volume of the object |
||
Line 864: | Line 954: | ||
################################################################################## |
################################################################################## |
||
# give the BoundBox of the oject selected all type |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
|||
objs = FreeCADGui.Selection.getSelection() # select object with getSelection() |
|||
if len(objs) >= 1: # serch the object type |
|||
App.Console.PrintMessage("boundBox_ : "+str(boundBox_)+"\n") |
|||
if hasattr(objs[0], "Shape"): |
|||
s = objs[0].Shape |
|||
elif hasattr(objs[0], "Mesh"): # upgrade with wmayer thanks #http://forum.freecadweb.org/viewtopic.php?f=13&t=22331 |
|||
s = objs[0].Mesh |
|||
elif hasattr(objs[0], "Points"): |
|||
s = objs[0].Points |
|||
boundBox_= s.BoundBox # BoundBox of the object |
|||
App.Console.PrintMessage("boundBox_ : "+str(boundBox_)+"\n") # |
|||
boundBoxLX = boundBox_.XLength |
boundBoxLX = boundBox_.XLength # Length x boundBox rectangle |
||
boundBoxLY = boundBox_.YLength |
boundBoxLY = boundBox_.YLength # Length y boundBox rectangle |
||
boundBoxLZ = boundBox_.ZLength |
boundBoxLZ = boundBox_.ZLength # Length z boundBox rectangle |
||
boundBoxXMin = boundBox_.XMin # coordonate XMin |
|||
boundBoxYMin = boundBox_.YMin # coordonate YMin |
|||
boundBoxZMin = boundBox_.ZMin # coordonate ZMin |
|||
boundBoxXMax = boundBox_.XMax # coordonate XMax |
|||
boundBoxYMax = boundBox_.YMax # coordonate YMax |
|||
boundBoxZMax = boundBox_.ZMax # coordonate ZMax |
|||
boundBoxDiag= boundBox_.DiagonalLength # Diagonal Length boundBox rectangle |
boundBoxDiag= boundBox_.DiagonalLength # Diagonal Length boundBox rectangle |
||
boundBoxCenter = boundBox_.Center # BoundBox Center |
|||
App.Console.PrintMessage("boundBoxLX : "+str(boundBoxLX)+"\n") |
App.Console.PrintMessage("boundBoxLX : "+str(boundBoxLX)+"\n") |
||
App.Console.PrintMessage("boundBoxLY : "+str(boundBoxLY)+"\n") |
App.Console.PrintMessage("boundBoxLY : "+str(boundBoxLY)+"\n") |
||
App.Console.PrintMessage("boundBoxLZ : "+str(boundBoxLZ)+"\n") |
App.Console.PrintMessage("boundBoxLZ : "+str(boundBoxLZ)+"\n\n") |
||
App.Console.PrintMessage("boundBoxDiag : "+str(boundBoxDiag)+"\n\n") |
|||
App.Console.PrintMessage("boundBoxXMin : "+str(boundBoxXMin)+"\n") |
|||
App.Console.PrintMessage("boundBoxYMin : "+str(boundBoxYMin)+"\n") |
|||
App.Console.PrintMessage("boundBoxZMin : "+str(boundBoxZMin)+"\n") |
|||
App.Console.PrintMessage("boundBoxXMax : "+str(boundBoxXMax)+"\n") |
|||
App.Console.PrintMessage("boundBoxYMax : "+str(boundBoxYMax)+"\n") |
|||
App.Console.PrintMessage("boundBoxZMax : "+str(boundBoxZMax)+"\n\n") |
|||
App.Console.PrintMessage("boundBoxDiag : "+str(boundBoxDiag)+"\n") |
|||
App.Console.PrintMessage("boundBoxCenter : "+str(boundBoxCenter)+"\n\n") |
|||
################################################################################## |
################################################################################## |
||
# give the complete placement of the object selected |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
||
pl = sel[0].Shape.Placement # Placement Vector XYZ and Yaw-Pitch-Roll |
pl = sel[0].Shape.Placement # Placement Vector XYZ and Yaw-Pitch-Roll |
||
App.Console.PrintMessage("Placement : "+str(pl)+"\n") |
App.Console.PrintMessage("Placement : "+str(pl)+"\n") |
||
################################################################################## |
################################################################################## |
||
# give the placement Base (xyz) of the object selected |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
||
pl = sel[0].Shape.Placement.Base # Placement Vector XYZ |
pl = sel[0].Shape.Placement.Base # Placement Vector XYZ |
||
Line 889: | Line 1,009: | ||
################################################################################## |
################################################################################## |
||
# give the placement Base (xyz) of the object selected |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
|||
Yaw = sel[0].Shape.Placement.Rotation.toEuler()[0] # decode angle Euler Yaw |
|||
App.Console.PrintMessage("Yaw : "+str(Yaw)+"\n") |
|||
Pitch = sel[0].Shape.Placement.Rotation.toEuler()[1] # decode angle Euler Pitch |
|||
App.Console.PrintMessage("Pitch : "+str(Pitch)+"\n") |
|||
Roll = sel[0].Shape.Placement.Rotation.toEuler()[2] # decode angle Euler Yaw |
|||
App.Console.PrintMessage("Roll : "+str(Roll)+"\n\n") |
|||
################################################################################## |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
||
oripl_X = sel[0].Placement.Base[0] # decode Placement X |
oripl_X = sel[0].Placement.Base[0] # decode Placement X |
||
oripl_Y = sel[0].Placement.Base[1] # decode Placement Y |
oripl_Y = sel[0].Placement.Base[1] # decode Placement Y |
||
oripl_Z = sel[0].Placement.Base[2] # decode Placement Z |
oripl_Z = sel[0].Placement.Base[2] # decode Placement Z |
||
# same |
|||
#oripl_X = sel[0].Placement.Base.x # decode Placement X |
|||
#oripl_Y = sel[0].Placement.Base.y # decode Placement Y |
|||
#oripl_Z = sel[0].Placement.Base.z # decode Placement Z |
|||
App.Console.PrintMessage("oripl_X : "+str(oripl_X)+"\n") |
App.Console.PrintMessage("oripl_X : "+str(oripl_X)+"\n") |
||
Line 907: | Line 1,024: | ||
App.Console.PrintMessage("oripl_Z : "+str(oripl_Z)+"\n\n") |
App.Console.PrintMessage("oripl_Z : "+str(oripl_Z)+"\n\n") |
||
################################################################################## |
################################################################################## |
||
# give the placement rotation of the object selected (x, y, z, angle rotation) |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
||
rotation = sel[0].Placement.Rotation # decode Placement Rotation |
rotation = sel[0].Placement.Rotation # decode Placement Rotation |
||
App.Console.PrintMessage("rotation : "+str(rotation)+"\n\n") |
App.Console.PrintMessage("rotation : "+str(rotation)+"\n\n") |
||
################################################################################## |
################################################################################## |
||
# give the placement rotation of the object selected (x, y, z, angle rotation) |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
||
pl = sel[0].Shape.Placement.Rotation # decode Placement Rotation other method |
pl = sel[0].Shape.Placement.Rotation # decode Placement Rotation other method |
||
App.Console.PrintMessage("Placement Rot : "+str(pl)+"\n\n") |
App.Console.PrintMessage("Placement Rot : "+str(pl)+"\n\n") |
||
################################################################################## |
################################################################################## |
||
# give the rotation of the object selected (angle rotation) |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
||
pl = sel[0].Shape.Placement.Rotation.Angle # decode Placement Rotation Angle |
pl = sel[0].Shape.Placement.Rotation.Angle # decode Placement Rotation Angle |
||
App.Console.PrintMessage("Placement Rot Angle : "+str(pl)+"\n\n") |
App.Console.PrintMessage("Placement Rot Angle : "+str(pl)+"\n\n") |
||
################################################################################## |
################################################################################## |
||
# give the rotation.Q of the object selected (angle rotation in Radian) for convert: math.degrees(angleInRadian) |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
||
Rot = sel[0].Placement.Rotation.Q # Placement Rotation Q |
|||
App.Console.PrintMessage(" |
App.Console.PrintMessage("Rot : "+str(Rot)+ "\n") |
||
Rot_0 = sel[0].Placement.Rotation.Q[0] # decode Placement Rotation Q |
|||
App.Console.PrintMessage("Rot_0 : "+str(Rot_0)+ " rad , "+str(180 * Rot_0 / 3.1416)+" deg "+"\n") # or math.degrees(angle) |
|||
Rot_1 = sel[0].Placement.Rotation.Q[1] # decode Placement Rotation 1 |
Rot_1 = sel[0].Placement.Rotation.Q[1] # decode Placement Rotation 1 |
||
App.Console.PrintMessage("Rot_1 : "+str(Rot_1)+ " rad , "+str(180 * Rot_1 / 3.1416)+" deg "+"\n") |
App.Console.PrintMessage("Rot_1 : "+str(Rot_1)+ " rad , "+str(180 * Rot_1 / 3.1416)+" deg "+"\n") # or math.degrees(angle) |
||
Rot_2 = sel[0].Placement.Rotation.Q[2] # decode Placement Rotation 2 |
Rot_2 = sel[0].Placement.Rotation.Q[2] # decode Placement Rotation 2 |
||
App.Console.PrintMessage("Rot_2 : "+str(Rot_2)+ " rad , "+str(180 * Rot_2 / 3.1416)+" deg "+"\n") |
App.Console.PrintMessage("Rot_2 : "+str(Rot_2)+ " rad , "+str(180 * Rot_2 / 3.1416)+" deg "+"\n") # or math.degrees(angle) |
||
Rot_3 = sel[0].Placement.Rotation.Q[3] # decode Placement Rotation 3 |
Rot_3 = sel[0].Placement.Rotation.Q[3] # decode Placement Rotation 3 |
||
App.Console.PrintMessage("Rot_3 : "+str(Rot_3)+"\n\n") |
App.Console.PrintMessage("Rot_3 : "+str(Rot_3)+"\n\n") |
||
Rot_Axis = sel[0].Placement.Rotation.Axis # Placement Rotation .Axis |
|||
App.Console.PrintMessage("Rot_Axis : "+str(Rot_Axis)+ "\n") |
|||
Rot_Angle = sel[0].Placement.Rotation.Angle # Placement Rotation .Angle |
|||
App.Console.PrintMessage("Rot_Angle : "+str(Rot_Angle)+ "\n\n") |
|||
################################################################################## |
################################################################################## |
||
# give the rotation of the object selected toEuler (angle rotation in degrees) |
|||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection() |
|||
angle = sel[0].Shape.Placement.Rotation.toEuler() # angle Euler |
|||
App.Console.PrintMessage("Angle : "+str(angle)+"\n") |
|||
Yaw = sel[0].Shape.Placement.Rotation.toEuler()[0] # decode angle Euler Yaw (Z) lacet (alpha) |
|||
App.Console.PrintMessage("Yaw : "+str(Yaw)+"\n") |
|||
Pitch = sel[0].Shape.Placement.Rotation.toEuler()[1] # decode angle Euler Pitch (Y) tangage (beta) |
|||
App.Console.PrintMessage("Pitch : "+str(Pitch)+"\n") |
|||
Roll = sel[0].Shape.Placement.Rotation.toEuler()[2] # decode angle Euler Roll (X) roulis (gamma) |
|||
App.Console.PrintMessage("Roll : "+str(Roll)+"\n\n") |
|||
################################################################################## |
|||
# find Midpoint of the selected line |
|||
import Draft, DraftGeomUtils |
|||
sel = FreeCADGui.Selection.getSelection() |
|||
vecteur = DraftGeomUtils.findMidpoint(sel[0].Shape.Edges[0]) # find Midpoint |
|||
App.Console.PrintMessage(vecteur) |
|||
Draft.makePoint(vecteur) |
|||
################################################################################## |
|||
}} |
}} |
||
</div> <!-- End of collapsible div --> |
|||
</div> <!-- End of collapsible div --> |
|||
===Manual search of an element with label=== |
===Manual search of an element with label=== |
||
{{Code|code= |
{{Code|code= |
||
# Extract the coordinate X,Y,Z and Angle giving the label |
# Extract the coordinate X,Y,Z and Angle giving the label (here "Cylindre") |
||
App.Console.PrintMessage("Base.x : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Base.x)+"\n") |
App.Console.PrintMessage("Base.x : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Base.x)+"\n") |
||
App.Console.PrintMessage("Base.y : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Base.y)+"\n") |
App.Console.PrintMessage("Base.y : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Base.y)+"\n") |
||
Line 963: | Line 1,116: | ||
Change the value of "numberOfPoints" if you want a different number of points (precision) |
Change the value of "numberOfPoints" if you want a different number of points (precision) |
||
{{Code|code= |
{{Code|code= |
||
numberOfPoints = 100 # Decomposition number (or precision you can change) |
numberOfPoints = 100 # Decomposition number (or precision you can change) |
||
Line 972: | Line 1,126: | ||
print i, " X", p.x, " Y", p.y, " Z", p.z |
print i, " X", p.x, " Y", p.y, " Z", p.z |
||
}} |
}} |
||
Other method display on "Int" and "Float" |
Other method display on "Int" and "Float" |
||
{{Code|code= |
{{Code|code= |
||
import Part |
import Part |
||
Line 1,028: | Line 1,184: | ||
}} |
}} |
||
===Select all objects in the document=== |
===Select all objects in the document=== |
||
{{Code|code= |
{{Code|code= |
||
import FreeCAD |
import FreeCAD |
||
Line 1,037: | Line 1,195: | ||
Gui.Selection.addSelection(obj) # select the object |
Gui.Selection.addSelection(obj) # select the object |
||
}} |
}} |
||
===Selecting a face of an object=== |
===Selecting a face of an object=== |
||
{{Code|code= |
{{Code|code= |
||
# select one face of the object |
# select one face of the object |
||
Line 1,050: | Line 1,210: | ||
#Draft.makeFacebinder(s) # |
#Draft.makeFacebinder(s) # |
||
}} |
}} |
||
===Create one object to the position of the Camera=== |
===Create one object to the position of the Camera=== |
||
{{Code|code= |
{{Code|code= |
||
# create one object of the position to camera with "getCameraOrientation()" |
# create one object of the position to camera with "getCameraOrientation()" |
||
Line 1,085: | Line 1,247: | ||
print rec.Name |
print rec.Name |
||
}} |
}} |
||
here same code simplified |
here same code simplified |
||
{{Code|code= |
{{Code|code= |
||
import Draft |
import Draft |
||
Line 1,097: | Line 1,261: | ||
This example show how to find normal vector on the surface by find the u,v parameters of one point on the surface and use u,v parameters to find normal vector |
This example show how to find normal vector on the surface by find the u,v parameters of one point on the surface and use u,v parameters to find normal vector |
||
{{Code|code= |
{{Code|code= |
||
def normal(self): |
def normal(self): |
||
Line 1,114: | Line 1,279: | ||
Part.show(line) |
Part.show(line) |
||
}} |
}} |
||
===Read And write one Expression=== |
===Read And write one Expression=== |
||
{{Code|code= |
{{Code|code= |
||
import Draft |
import Draft |
||
Line 1,139: | Line 1,306: | ||
}} |
}} |
||
===Get the normal vector of a surface from a STL file=== |
|||
{{Code|code= |
|||
{{docnav/ru|Embedding FreeCAD/ru|Line drawing function/ru}} |
|||
def getNormal(cb): |
|||
if cb.getEvent().getState() == coin.SoButtonEvent.UP: |
|||
pp = cb.getPickedPoint() |
|||
if pp: |
|||
vec = pp.getNormal().getValue() |
|||
index = coin.cast(pp.getDetail(), "SoFaceDetail").getFaceIndex() |
|||
print ("Normal: {}, Face index: {}".format(str(vec), index)) |
|||
from pivy import coin |
|||
[[Category:Poweruser Documentation/ru]] |
|||
meth=Gui.ActiveDocument.ActiveView.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), getNormal) |
|||
[[Category:Python Code/ru]] |
|||
}} |
|||
[[Category:Tutorials/ru]] |
|||
you are done then run for quit: |
|||
{{Code|code= |
|||
Gui.ActiveDocument.ActiveView.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), meth) |
|||
}} |
|||
===Create a Sketch on a Surface in PartDesign=== |
|||
This snippet can be useful, if you want to create a sketch on a surface in PartDesign from inside a macro. |
|||
Note, that body might be None, if no active body is selected and that the Selection might be empty. |
|||
{{Code|code= |
|||
body = Gui.ActiveDocument.ActiveView.getActiveObject('pdbody') |
|||
first_selection = Gui.Selection.getSelectionEx()[0] |
|||
feature = first_selection.Object |
|||
face_name = first_selection.SubElementNames[0] |
|||
sketch = App.ActiveDocument.addObject('Sketcher::SketchObject','MySketch') |
|||
body.addObject(sketch) |
|||
sketch.MapMode = 'FlatFace' |
|||
sketch.Support = (feature, face_name) |
|||
App.ActiveDocument.recompute() |
|||
}} |
|||
===How to Simulate a Mouse Click at a given Coordinate=== |
|||
The position is relative to the GL widget. See [https://forum.freecadweb.org/viewtopic.php?f=22&t=44008 forum thread]. |
|||
{{Code|code= |
|||
from PySide2 import QtCore |
|||
from PySide2 import QtGui |
|||
from PySide2 import QtWidgets |
|||
mw = Gui.getMainWindow() |
|||
gl = mw.findChild(QtWidgets.QOpenGLWidget) |
|||
me = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonRelease, QtCore.QPoint(800,300), QtCore.Qt.LeftButton, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier) |
|||
app = QtWidgets.QApplication.instance() |
|||
app.sendEvent(gl, me) |
|||
}} |
|||
== Related == |
|||
* [[Scripted objects]] |
|||
* [[Macros]] |
|||
<div class="mw-translate-fuzzy"> |
|||
{{docnav/ru|[[Embedding FreeCAD/ru|Embedding FreeCAD]]|[[Line drawing function/ru|Line drawing function]]}} |
|||
</div> |
|||
{{Powerdocnavi{{#translation:}}}} |
|||
[[Category:Python Code{{#translation:}}]] |
|||
{{clear}} |
{{clear}} |
||
<languages/> |
Revision as of 11:35, 15 May 2020
Руководство |
Тема |
---|
Python |
Уровень |
Beginner |
Время для завершения |
Авторы |
FreeCAD версия |
Примеры файлов |
Смотрите также |
None |
Introduction
Эта страница содержит примеры, обрывки, куски FreeCAD python кода, собранный для получения пользователями оптыта и обсуждения на форумах. Читайте и используете их как начало для ваших собственных сценариев...
Обычный файл InitGui.py
Каждый модуль должен содержать, помимо основного файла модуля, файл InitGui.py , ответственного за вставку модуля в главное Gui. Это простой пример
class ScriptWorkbench (Workbench):
MenuText = "Scripts"
def Initialize(self):
import Scripts # assuming Scripts.py is your module
list = ["Script_Cmd"] # That list must contain command names, that can be defined in Scripts.py
self.appendToolbar("My Scripts",list)
Gui.addWorkbench(ScriptWorkbench())
Обычный файл модуля
Это пример головного файла модуля, содержащего всё что ваш модуль делает. Это Scripts.py файл вызванный в предыдущем примере. Вы можете установить здесь все ваши пользовательские команды.
import FreeCAD, FreeCADGui
class ScriptCmd:
def Activated(self):
# Here your write what your ScriptCmd does...
FreeCAD.Console.PrintMessage('Hello, World!')
def GetResources(self):
return {'Pixmap' : 'path_to_an_icon/myicon.png', 'MenuText': 'Short text', 'ToolTip': 'More detailed text'}
FreeCADGui.addCommand('Script_Cmd', ScriptCmd())
Импорт нового типа файлов
Создание ипортировщика в нового типа файлов в FreeCAD, просто. FreeCAD не считает что вы импортируете данные в открытый документ, а скорее что вы просто можете непосредственно открыть новый тип файла. Так что все что вам нужно сделать, это добавить новое расширение файла в список известных расширений FreeCAD , и написать код, который будет читать файл и создавать FreeCAD объекты:
Это строка должна быть добавлена в InitGui.py файл для добавления нового расширения файлов в список:
# Assumes Import_Ext.py is the file that has the code for opening and reading .ext files
FreeCAD.addImportType("Your new File Type (*.ext)","Import_Ext")
Тогда в файле Import_Ext.py:
def open(filename):
doc=App.newDocument()
# here you do all what is needed with filename, read, classify data, create corresponding FreeCAD objects
doc.recompute()
Экспорт вашего документа в новые типы файлов работает схожим образом, исключая того что вы используете:
FreeCAD.addExportType("Your new File Type (*.ext)","Export_Ext")
Добавление линии
Простейшая линия через две точки.
import Part,PartGui
doc=App.activeDocument()
# add a line element to the document and set its points
l=Part.LineSegment()
l.StartPoint=(0.0,0.0,0.0)
l.EndPoint=(1.0,1.0,1.0)
doc.addObject("Part::Feature","Line").Shape=l.toShape()
doc.recompute()
Добавление многоугольника
Многоугольник это просто набор соединенных отрезков (polyline в AutoCAD). Он необязательно должен быть замкнутым.
import Part, PartGui
doc = App.activeDocument()
n = list()
# create a 3D vector, set its coordinates and add it to the list
v = App.Vector(0,0,0)
n.append(v)
v = App.Vector(10,0,0)
n.append(v)
#... repeat for all nodes
# Create a polygon object and set its nodes
p = doc.addObject("Part::Polygon","Polygon")
p.Nodes = n
doc.recompute()
Добавление и удаление объекта из группы
doc=App.activeDocument()
grp=doc.addObject("App::DocumentObjectGroup", "Group")
lin=doc.addObject("Part::Feature", "Line")
grp.addObject(lin) # adds the lin object to the group grp
grp.removeObject(lin) # removes the lin object from the group grp
Примечание: Вы также можете добавлять другие группы в группу...
Добавление Полигиональной модели
import Mesh
doc=App.activeDocument()
# create a new empty mesh
m = Mesh.Mesh()
# build up box out of 12 facets
m.addFacet(0.0,0.0,0.0, 0.0,0.0,1.0, 0.0,1.0,1.0)
m.addFacet(0.0,0.0,0.0, 0.0,1.0,1.0, 0.0,1.0,0.0)
m.addFacet(0.0,0.0,0.0, 1.0,0.0,0.0, 1.0,0.0,1.0)
m.addFacet(0.0,0.0,0.0, 1.0,0.0,1.0, 0.0,0.0,1.0)
m.addFacet(0.0,0.0,0.0, 0.0,1.0,0.0, 1.0,1.0,0.0)
m.addFacet(0.0,0.0,0.0, 1.0,1.0,0.0, 1.0,0.0,0.0)
m.addFacet(0.0,1.0,0.0, 0.0,1.0,1.0, 1.0,1.0,1.0)
m.addFacet(0.0,1.0,0.0, 1.0,1.0,1.0, 1.0,1.0,0.0)
m.addFacet(0.0,1.0,1.0, 0.0,0.0,1.0, 1.0,0.0,1.0)
m.addFacet(0.0,1.0,1.0, 1.0,0.0,1.0, 1.0,1.0,1.0)
m.addFacet(1.0,1.0,0.0, 1.0,1.0,1.0, 1.0,0.0,1.0)
m.addFacet(1.0,1.0,0.0, 1.0,0.0,1.0, 1.0,0.0,0.0)
# scale to a edge langth of 100
m.scale(100.0)
# add the mesh to the active document
me=doc.addObject("Mesh::Feature","Cube")
me.Mesh=m
Добавление дуги или огружности
import Part
doc = App.activeDocument()
c = Part.Circle()
c.Radius=10.0
f = doc.addObject("Part::Feature", "Circle") # create a document with a circle feature
f.Shape = c.toShape() # Assign the circle shape to the shape property
doc.recompute()
Получение доступа и изменение представления объекта
Каждый объект в FreeCAD документе оссоциируется с визуальным представлением объекта, которое хранит все параметры , определяющие как объект представлен, такие как цвет, длина линий, и.т.д...
gad = Gui.activeDocument() # access the active document containing all
# view representations of the features in the
# corresponding App document
v = gad.getObject("Cube") # access the view representation to the Mesh feature 'Cube'
v.ShapeColor # prints the color to the console
v.ShapeColor=(1.0,1.0,1.0) # sets the shape color to white
Наблюдение за поведение мыши в 3D окне через Python
Inventor позваляет добавить оди и более узлов обратного вызова(callback) в дерево сцен просмотрщика. По умолчанию в FreeCAD один узел обратного вызова установлен в кадое окно просмотра(просмотрщик), который позволяет добавить глобальные или статические C++ функции. Соответствуюе Python привязки, некоторые методы которых позволяют использовать эту технику (callback) в Python коде.
App.newDocument()
v=Gui.activeDocument().activeView()
#This class logs any mouse button events. As the registered callback function fires twice for 'down' and
#'up' events we need a boolean flag to handle this.
class ViewObserver:
def logPosition(self, info):
down = (info["State"] == "DOWN")
pos = info["Position"]
if (down):
FreeCAD.Console.PrintMessage("Clicked on position: ("+str(pos[0])+", "+str(pos[1])+")\n")
o = ViewObserver()
c = v.addEventCallback("SoMouseButtonEvent",o.logPosition)
Теперь, выберите какую нибудь область в окне 3D-просмотра и наблюдайте сообщения в окне вывода. Для завершения наблюдения просто вызовите
v.removeEventCallback("SoMouseButtonEvent",c)
Поддерживаются следующие типы событий
- SoEvent -- Все события
- SoButtonEvent -- Все события клавиш клавиатуры и мыши
- SoLocation2Event -- события 2D перемещений (обычно движение мыши)
- SoMotion3Event -- события 3D перемещений (обычно spaceball)
- SoKeyboradEvent -- события нажатие и отпускание клавиш клавиатуры
- SoMouseButtonEvent -- события нажатия и отпускания клавиш мыши
- SoSpaceballButtonEvent -- события нажатия и отпускания клавиш spaceball
Python функции которые могут быть зарегистрированы в addEventCallback() предлагающем словарь(dictionary). В зависимости от наблюдателя события словарь может содержать различные ключи.
Для всех событий существуют ключи:
- Type -- Имя типа события т.е. SoMouseEvent, SoLocation2Event, ...
- Time -- текущие время в виде строки
- Position -- набор из двух целых чисел как позиция курсорa мыши
- ShiftDown -- логическая(boolean) переменная, true если Shift нажат, в противном случае false
- CtrlDown -- логическая(boolean) переменная, true если Ctrl нажат, в противном случае false
- AltDown -- логическая(boolean) переменная, true если Alt нажат, в противном случае false
Для всех клавишных событий, т.e. для событий клавиатуры, мыши или spaceball
- State -- Строка 'UP' если кнопка была вверху, 'DOWN' если кнопка была внизу или 'UNKNOWN' во всех остальных случаях
Для событий связанных с клавиатурой:
- Key -- значение нажатоой клаывиши
Для событий связанных с мышью
- Button -- Нажаты клавиши, могут быть BUTTON1, ..., BUTTON5 или ANY
Для событий spaceball:
- Button -- Нажатые клавиши, могут быть BUTTON1, ..., BUTTON7 или ANY
и наконец события движения:
- Translation -- набор из трех переменных floats
- Rotation -- кватернион поворота, т.е. набор из четырех переменных floats
Display keys pressed and Events command
This macro displays in the report view the keys pressed and all events command
App.newDocument()
v=Gui.activeDocument().activeView()
class ViewObserver:
def logPosition(self, info):
try:
down = (info["Key"])
FreeCAD.Console.PrintMessage(str(down)+"\n") # here the character pressed
FreeCAD.Console.PrintMessage(str(info)+"\n") # list all events command
FreeCAD.Console.PrintMessage("_______________________________________"+"\n")
except Exception:
None
o = ViewObserver()
c = v.addEventCallback("SoEvent",o.logPosition)
#v.removeEventCallback("SoEvent",c) # remove ViewObserver
Манипулирование scenegraph в Python
Кроме того можно получить и изменить граф сцены в Python, с помощью модуля 'pivy' -- Python привязки к Coin.
from pivy.coin import * # load the pivy module
view = Gui.ActiveDocument.ActiveView # get the active viewer
root = view.getSceneGraph() # the root is an SoSeparator node
root.addChild(SoCube())
view.fitAll()
Python API для pivy создано используя инструмент SWIG. Так как мы используем в FreeCAD некоторые самостоятельно записанные узлы вы не можете создавать их напрямую через Python. Однако, возможно создать узел в его внутренним именем. Экземпляр типа 'SoFCSelection' может быть создан
type = SoType.fromName("SoFCSelection")
node = type.createInstance()
Добавление и удаление объектов в/из графа сцены
Добавление новых узлов в граф сцены(scenegraph) может сделать таким образом. Всегда заботтесь о добавлении SoSeparator содержащего информацию о геометрии, координатах и материалах объекта. В следующем примере добавляется красная линия из точки (0,0,0) в (10,0,0):
from pivy import coin
sg = Gui.ActiveDocument.ActiveView.getSceneGraph()
co = coin.SoCoordinate3()
pts = [[0,0,0],[10,0,0]]
co.point.setValues(0,len(pts),pts)
ma = coin.SoBaseColor()
ma.rgb = (1,0,0)
li = coin.SoLineSet()
li.numVertices.setValue(2)
no = coin.SoSeparator()
no.addChild(co)
no.addChild(ma)
no.addChild(li)
sg.addChild(no)
Чтобы удалить её, просто введите:
sg.removeChild(no)
Saves the sceneGraph with a rotation in a series of 36 files in the X Y Z axis
View the code snippet by expanding this sectionimport math
import time
from FreeCAD import Base
from pivy import coin
size=(1000,1000)
dirname = "C:/Temp/animation/"
steps=36
angle=2*math.pi/steps
matX=Base.Matrix()
matX.rotateX(angle)
stepsX=Base.Placement(matX).Rotation
matY=Base.Matrix()
matY.rotateY(angle)
stepsY=Base.Placement(matY).Rotation
matZ=Base.Matrix()
matZ.rotateZ(angle)
stepsZ=Base.Placement(matZ).Rotation
view=Gui.ActiveDocument.ActiveView
cam=view.getCameraNode()
rotCamera=Base.Rotation(*cam.orientation.getValue().getValue())
# this sets the lookat point to the center of circumsphere of the global bounding box
view.fitAll()
# the camera's position, i.e. the user's eye point
position=Base.Vector(*cam.position.getValue().getValue())
distance=cam.focalDistance.getValue()
# view direction
vec=rotCamera.multVec(Base.Vector(0,0,-1))
# this is the point on the screen the camera looks at
# when rotating the camera we should make this point fix
lookat=position+vec*distance
# around x axis
for i in range(steps):
rotCamera=stepsX.multiply(rotCamera)
cam.orientation.setValue(*rotCamera.Q)
vec=rotCamera.multVec(Base.Vector(0,0,-1))
pos=lookat-vec*distance
cam.position.setValue(pos.x,pos.y,pos.z)
Gui.updateGui()
time.sleep(0.3)
view.saveImage(dirname+"x-%d.png" % i,*size)
# around y axis
for i in range(steps):
rotCamera=stepsY.multiply(rotCamera)
cam.orientation.setValue(*rotCamera.Q)
vec=rotCamera.multVec(Base.Vector(0,0,-1))
pos=lookat-vec*distance
cam.position.setValue(pos.x,pos.y,pos.z)
Gui.updateGui()
time.sleep(0.3)
view.saveImage(dirname+"y-%d.png" % i,*size)
# around z axis
for i in range(steps):
rotCamera=stepsZ.multiply(rotCamera)
cam.orientation.setValue(*rotCamera.Q)
vec=rotCamera.multVec(Base.Vector(0,0,-1))
pos=lookat-vec*distance
cam.position.setValue(pos.x,pos.y,pos.z)
Gui.updateGui()
time.sleep(0.3)
view.saveImage(dirname+"z-%d.png" % i,*size)
Добавление пользовательских виджетов к интерфейсу
Вы можете содать собственные виджеты с помощью Qt designer, превратив их в сценарии на python, с помощью PySide, и загрузив их в FreeCAD.
Python код созданный с помощью Ui python compiler (это инструмент для конвертирования файлов ui. созданных qt-designer в python код) в основном выглядит так (это простой пример, вы также может писать этот код напряму с помощью python):
class myWidget_Ui(object):
def setupUi(self, myWidget):
myWidget.setObjectName("my Nice New Widget")
myWidget.resize(QtCore.QSize(QtCore.QRect(0,0,300,100).size()).expandedTo(myWidget.minimumSizeHint())) # sets size of the widget
self.label = QtGui.QLabel(myWidget) # creates a label
self.label.setGeometry(QtCore.QRect(50,50,200,24)) # sets its size
self.label.setObjectName("label") # sets its name, so it can be found by name
def retranslateUi(self, draftToolbar): # built-in QT function that manages translations of widgets
myWidget.setWindowTitle(QtGui.QApplication.translate("myWidget", "My Widget", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("myWidget", "Welcome to my new widget!", None, QtGui.QApplication.UnicodeUTF8))
Тогда все что вам нужно сделать, это создать ссылку на FreeCAD Qt окно, вставить виджет в него, и "преобразовать" этот виджет в ваш с Ui кодом который мы только что сделали:
app = QtGui.qApp
FCmw = app.activeWindow() # the active qt window, = the freecad window since we are inside it
# FCmw = FreeCADGui.getMainWindow() # use this line if the 'addDockWidget' error is declared
myNewFreeCADWidget = QtGui.QDockWidget() # create a new dckwidget
myNewFreeCADWidget.ui = myWidget_Ui() # load the Ui script
myNewFreeCADWidget.ui.setupUi(myNewFreeCADWidget) # setup the ui
FCmw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myNewFreeCADWidget) # add the widget to the main window
Adding a Tab to the Combo View
The following code allows you to add a tab to the Combo view, separate from the preexisting "Model" and "Tasks" tabs. It also uses the uic
module to load an UI file directly in that tab.
# create new Tab in ComboView
from PySide import QtGui,QtCore
#from PySide import uic
def getMainWindow():
"returns the main window"
# using QtGui.qApp.activeWindow() isn't very reliable because if another
# widget than the mainwindow is active (e.g. a dialog) the wrong widget is
# returned
toplevel = QtGui.qApp.topLevelWidgets()
for i in toplevel:
if i.metaObject().className() == "Gui::MainWindow":
return i
raise Exception("No main window found")
def getComboView(mw):
dw=mw.findChildren(QtGui.QDockWidget)
for i in dw:
if str(i.objectName()) == "Combo View":
return i.findChild(QtGui.QTabWidget)
elif str(i.objectName()) == "Python Console":
return i.findChild(QtGui.QTabWidget)
raise Exception ("No tab widget found")
mw = getMainWindow()
tab = getComboView(getMainWindow())
tab2=QtGui.QDialog()
tab.addTab(tab2,"A Special Tab")
#uic.loadUi("/myTaskPanelforTabs.ui",tab2)
tab2.show()
#tab.removeTab(2)
Enable or disable a window
This script give the ability to manipulate the UI from the Python console to show/hide different components in the FreeCAD interface such as:
- Report view
- Tree view
- Property view
- Selection view
- Combo View
- Python console
- draftToolbar
from PySide import QtGui
mw = FreeCADGui.getMainWindow()
dws = mw.findChildren(QtGui.QDockWidget)
# objectName may be :
# "Report view"
# "Tree view"
# "Property view"
# "Selection view"
# "Combo View"
# "Python console"
# "draftToolbar"
for i in dws:
if i.objectName() == "Report view":
dw = i
break
va = dw.toggleViewAction()
va.setChecked(True) # True or False
dw.setVisible(True) # True or False
Opening a custom webpage
import WebGui
WebGui.openBrowser("http://www.example.com")
Getting the HTML contents of an opened webpage
from PySide import QtGui,QtWebKit
a = QtGui.qApp
mw = a.activeWindow()
v = mw.findChild(QtWebKit.QWebFrame)
html = unicode(v.toHtml())
print html
Retrieve and use the coordinates of 3 selected points or objects
# -*- coding: utf-8 -*-
# the line above to put the accentuated in the remarks
# If this line is missing, an error will be returned
# extract and use the coordinates of 3 objects selected
import Part, FreeCAD, math, PartGui, FreeCADGui
from FreeCAD import Base, Console
sel = FreeCADGui.Selection.getSelection() # " sel " contains the items selected
if len(sel)!=3 :
# If there are no 3 objects selected, an error is displayed in the report view
# The \r and \n at the end of line mean return and the newline CR + LF.
Console.PrintError("Select 3 points exactly\r\n")
else :
points=[]
for obj in sel:
points.append(obj.Shape.BoundBox.Center)
for pt in points:
# display of the coordinates in the report view
Console.PrintMessage(str(pt.x)+"\r\n")
Console.PrintMessage(str(pt.y)+"\r\n")
Console.PrintMessage(str(pt.z)+"\r\n")
Console.PrintMessage(str(pt[1]) + "\r\n")
List all objects
# -*- coding: utf-8 -*-
import FreeCAD,Draft
# List all objects of the document
doc = FreeCAD.ActiveDocument
objs = FreeCAD.ActiveDocument.Objects
#App.Console.PrintMessage(str(objs) + "\n")
#App.Console.PrintMessage(str(len(FreeCAD.ActiveDocument.Objects)) + " Objects" + "\n")
for obj in objs:
a = obj.Name # list the Name of the object (not modifiable)
b = obj.Label # list the Label of the object (modifiable)
try:
c = obj.LabelText # list the LabeText of the text (modifiable)
App.Console.PrintMessage(str(a) +" "+ str(b) +" "+ str(c) + "\n") # Displays the Name the Label and the text
except:
App.Console.PrintMessage(str(a) +" "+ str(b) + "\n") # Displays the Name and the Label of the object
#doc.removeObject("Box") # Clears the designated object
List the dimensions of an object, given its name
for edge in FreeCAD.ActiveDocument.MyObjectName.Shape.Edges: # replace "MyObjectName" for list
print edge.Length
Function resident with the mouse click action
Here with SelObserver on a object select
# -*- coding: utf-8 -*-
# causes an action to the mouse click on an object
# This function remains resident (in memory) with the function "addObserver(s)"
# "removeObserver(s) # Uninstalls the resident function
class SelObserver:
def setPreselection(self,doc,obj,sub): # Preselection object
App.Console.PrintMessage(str(sub)+ "\n") # The part of the object name
def addSelection(self,doc,obj,sub,pnt): # Selection object
App.Console.PrintMessage("addSelection"+ "\n")
App.Console.PrintMessage(str(doc)+ "\n") # Name of the document
App.Console.PrintMessage(str(obj)+ "\n") # Name of the object
App.Console.PrintMessage(str(sub)+ "\n") # The part of the object name
App.Console.PrintMessage(str(pnt)+ "\n") # Coordinates of the object
App.Console.PrintMessage("______"+ "\n")
def removeSelection(self,doc,obj,sub): # Delete the selected object
App.Console.PrintMessage("removeSelection"+ "\n")
def setSelection(self,doc): # Selection in ComboView
App.Console.PrintMessage("setSelection"+ "\n")
def clearSelection(self,doc): # If click on the screen, clear the selection
App.Console.PrintMessage("clearSelection"+ "\n") # If click on another object, clear the previous object
s =SelObserver()
FreeCADGui.Selection.addObserver(s) # install the function mode resident
#FreeCADGui.Selection.removeObserver(s) # Uninstall the resident function
Other example with ViewObserver on a object select or view
App.newDocument()
v=Gui.activeDocument().activeView()
#This class logs any mouse button events. As the registered callback function fires twice for 'down' and
#'up' events we need a boolean flag to handle this.
class ViewObserver:
def __init__(self, view):
self.view = view
def logPosition(self, info):
down = (info["State"] == "DOWN")
pos = info["Position"]
if (down):
FreeCAD.Console.PrintMessage("Clicked on position: ("+str(pos[0])+", "+str(pos[1])+")\n")
pnt = self.view.getPoint(pos)
FreeCAD.Console.PrintMessage("World coordinates: " + str(pnt) + "\n")
info = self.view.getObjectInfo(pos)
FreeCAD.Console.PrintMessage("Object info: " + str(info) + "\n")
o = ViewObserver(v)
c = v.addEventCallback("SoMouseButtonEvent",o.logPosition)
Finding-selecting all elements below cursor
from pivy import coin
import FreeCADGui
def mouse_over_cb( event_callback):
event = event_callback.getEvent()
pos = event.getPosition().getValue()
listObjects = FreeCADGui.ActiveDocument.ActiveView.getObjectsInfo((int(pos[0]),int(pos[1])))
obj = []
if listObjects:
FreeCAD.Console.PrintMessage("\n *** Objects under mouse pointer ***")
for o in listObjects:
label = str(o["Object"])
if not label in obj:
obj.append(label)
FreeCAD.Console.PrintMessage("\n"+str(obj))
view = FreeCADGui.ActiveDocument.ActiveView
mouse_over = view.addEventCallbackPivy( coin.SoLocation2Event.getClassTypeId(), mouse_over_cb )
# to remove Callback :
#view.removeEventCallbackPivy( coin.SoLocation2Event.getClassTypeId(), mouse_over)
####
#The easy way is probably to use FreeCAD's selection.
#FreeCADGui.ActiveDocument.ActiveView.getObjectsInfo(mouse_coords)
####
#you get that kind of result :
#'Document': 'Unnamed', 'Object': 'Box', 'Component': 'Face2', 'y': 8.604081153869629, 'x': 21.0, 'z': 8.553047180175781
####
#You can use this data to add your element to FreeCAD's selection :
#FreeCADGui.Selection.addSelection(FreeCAD.ActiveDocument.Box,'Face2',21.0,8.604081153869629,8.553047180175781)
List the components of an object
This function list the components of an object and extracts:
- this object its XYZ coordinates,
- its edges and their lengths center of mass and coordinates
- its faces and their center of mass
- its faces and their surfaces and coordinates
# -*- coding: utf-8 -*-
# This function list the components of an object
# and extract this object its XYZ coordinates,
# its edges and their lengths center of mass and coordinates
# its faces and their center of mass
# its faces and their surfaces and coordinates
# 8/05/2014
import Draft,Part
def detail():
sel = FreeCADGui.Selection.getSelection() # Select an object
if len(sel) != 0: # If there is a selection then
Vertx=[]
Edges=[]
Faces=[]
compt_V=0
compt_E=0
compt_F=0
pas =0
perimetre = 0.0
EdgesLong = []
# Displays the "Name" and the "Label" of the selection
App.Console.PrintMessage("Selection > " + str(sel[0].Name) + " " + str(sel[0].Label) +"\n"+"\n")
for j in enumerate(sel[0].Shape.Edges): # Search the "Edges" and their lengths
compt_E+=1
Edges.append("Edge%d" % (j[0]+1))
EdgesLong.append(str(sel[0].Shape.Edges[compt_E-1].Length))
perimetre += (sel[0].Shape.Edges[compt_E-1].Length) # calculates the perimeter
# Displays the "Edge" and its length
App.Console.PrintMessage("Edge"+str(compt_E)+" Length > "+str(sel[0].Shape.Edges[compt_E-1].Length)+"\n")
# Displays the "Edge" and its center mass
App.Console.PrintMessage("Edge"+str(compt_E)+" Center > "+str(sel[0].Shape.Edges[compt_E-1].CenterOfMass)+"\n")
num = sel[0].Shape.Edges[compt_E-1].Vertexes[0]
Vertx.append("X1: "+str(num.Point.x))
Vertx.append("Y1: "+str(num.Point.y))
Vertx.append("Z1: "+str(num.Point.z))
# Displays the coordinates 1
App.Console.PrintMessage("X1: "+str(num.Point[0])+" Y1: "+str(num.Point[1])+" Z1: "+str(num.Point[2])+"\n")
try:
num = sel[0].Shape.Edges[compt_E-1].Vertexes[1]
Vertx.append("X2: "+str(num.Point.x))
Vertx.append("Y2: "+str(num.Point.y))
Vertx.append("Z2: "+str(num.Point.z))
except:
Vertx.append("-")
Vertx.append("-")
Vertx.append("-")
# Displays the coordinates 2
App.Console.PrintMessage("X2: "+str(num.Point[0])+" Y2: "+str(num.Point[1])+" Z2: "+str(num.Point[2])+"\n")
App.Console.PrintMessage("\n")
App.Console.PrintMessage("Perimeter of the form : "+str(perimetre)+"\n")
App.Console.PrintMessage("\n")
FacesSurf = []
for j in enumerate(sel[0].Shape.Faces): # Search the "Faces" and their surface
compt_F+=1
Faces.append("Face%d" % (j[0]+1))
FacesSurf.append(str(sel[0].Shape.Faces[compt_F-1].Area))
# Displays 'Face' and its surface
App.Console.PrintMessage("Face"+str(compt_F)+" > Surface "+str(sel[0].Shape.Faces[compt_F-1].Area)+"\n")
# Displays 'Face' and its CenterOfMass
App.Console.PrintMessage("Face"+str(compt_F)+" > Center "+str(sel[0].Shape.Faces[compt_F-1].CenterOfMass)+"\n")
# Displays 'Face' and its Coordinates
FacesCoor = []
fco = 0
for f0 in sel[0].Shape.Faces[compt_F-1].Vertexes: # Search the Vertexes of the face
fco += 1
FacesCoor.append("X"+str(fco)+": "+str(f0.Point.x))
FacesCoor.append("Y"+str(fco)+": "+str(f0.Point.y))
FacesCoor.append("Z"+str(fco)+": "+str(f0.Point.z))
# Displays 'Face' and its Coordinates
App.Console.PrintMessage("Face"+str(compt_F)+" > Coordinate"+str(FacesCoor)+"\n")
# Displays 'Face' and its Volume
App.Console.PrintMessage("Face"+str(compt_F)+" > Volume "+str(sel[0].Shape.Faces[compt_F-1].Volume)+"\n")
App.Console.PrintMessage("\n")
# Displays the total surface of the form
App.Console.PrintMessage("Surface of the form : "+str(sel[0].Shape.Area)+"\n")
# Displays the total Volume of the form
App.Console.PrintMessage("Volume of the form : "+str(sel[0].Shape.Volume)+"\n")
detail()
List the PropertiesList
import FreeCADGui
from FreeCAD import Console
o = App.ActiveDocument.ActiveObject
op = o.PropertiesList
for p in op:
Console.PrintMessage("Property: "+ str(p)+ " Value: " + str(o.getPropertyByName(p))+"\r\n")
Adding a single Property Comment
import Draft
obj = FreeCADGui.Selection.getSelection()[0]
obj.addProperty("App::PropertyString","GComment","Draft","Font name").GComment = "Comment here"
App.activeDocument().recompute()
Search and data extraction
Examples of research and decoding information on an object.
Each section is independently and is separated by "############" can be copied directly into the Python console, or in a macro or use this macro. The description of the macro in the commentary.
Displaying it in the "Report View" window (View > Views > Report view)
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
# Exemples de recherche et de decodage d'informations sur un objet
# Chaque section peut etre copiee directement dans la console Python ou dans une macro ou utilisez la macro tel quel
# Certaines commandes se repetent seul l'approche est differente
# L'affichage se fait dans la Vue rapport : Menu Affichage > Vues > Vue rapport
#
# Examples of research and decoding information on an object
# Each section can be copied directly into the Python console, or in a macro or uses this macro
# Certain commands as repeat alone approach is different
# Displayed in Report view: View > Views > report view
#
# rev:30/08/2014:29/09/2014:17/09/2015 22/11/2019
from FreeCAD import Base
import DraftVecUtils, Draft, Part
# search the name of the active document
mydoc = FreeCAD.activeDocument().Name # Name of active Document
App.Console.PrintMessage("Active docu : "+(mydoc)+"\n")
##################################################################################
# search the label of the object selected
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
object_Label = sel[0].Label # Label of the object (modifiable)
App.Console.PrintMessage("object_Label : "+(object_Label)+"\n")
##################################################################################
#TypeID object FreeCAD selected
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
App.Console.PrintMessage("sel : "+str(sel[0])+"\n\n") # sel[0] first object selected
##################################################################################
# search the Name of the object selected
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
object_Name = sel[0].Name # Name of the object (not modifiable)
App.Console.PrintMessage("object_Name : "+str(object_Name)+"\n\n")
##################################################################################
# search the Sub Element Name of the sub object selected
try:
SubElement = FreeCADGui.Selection.getSelectionEx() # sub element name with getSelectionEx()
element_ = SubElement[0].SubElementNames[0] # name of 1 element selected
App.Console.PrintMessage("elementSelec : "+str(element_)+"\n\n")
except:
App.Console.PrintMessage("Oups"+"\n\n")
##################################################################################
# give the length of the subObject selected
SubElementLength = Gui.Selection.getSelectionEx()[0].SubObjects[0].Length # sub element or element name with getSelectionEx()
App.Console.PrintMessage("SubElement length: "+str(SubElementLength)+"\n")# length
##################################################################################
# list the edges and the coordinates of the object[0] selected
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
i = 0
for j in enumerate(sel[0].Shape.Edges): # list all Edges
i += 1
App.Console.PrintMessage("Edges n : "+str(i)+"\n")
a = sel[0].Shape.Edges[j[0]].Vertexes[0]
App.Console.PrintMessage("X1 : "+str(a.Point.x)+"\n") # coordinate XYZ first point
App.Console.PrintMessage("Y1 : "+str(a.Point.y)+"\n") #
App.Console.PrintMessage("Z1 : "+str(a.Point.z)+"\n") #
try:
a = sel[0].Shape.Edges[j[0]].Vertexes[1]
App.Console.PrintMessage("X2 : "+str(a.Point.x)+"\n") # coordinate XYZ second point
App.Console.PrintMessage("Y2 : "+str(a.Point.y)+"\n") #
App.Console.PrintMessage("Z2 : "+str(a.Point.z)+"\n") #
except:
App.Console.PrintMessage("Oups"+"\n")
App.Console.PrintMessage("\n")
##################################################################################
# give the sub element name, length, coordinates, BoundBox, BoundBox.Center, Area of the SubObjects selected
try:
SubElement = FreeCADGui.Selection.getSelectionEx() # sub element name with getSelectionEx()
subElementName = Gui.Selection.getSelectionEx()[0].SubElementNames[0] # sub element name with getSelectionEx()
App.Console.PrintMessage("subElementName : "+str(subElementName)+"\n")
subObjectLength = Gui.Selection.getSelectionEx()[0].SubObjects[0].Length # sub element Length
App.Console.PrintMessage("subObjectLength: "+str(subObjectLength)+"\n\n")
subObjectX1 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[0].Point.x # sub element coordinate X1
App.Console.PrintMessage("subObject_X1 : "+str(subObjectX1)+"\n")
subObjectY1 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[0].Point.y # sub element coordinate Y1
App.Console.PrintMessage("subObject_Y1 : "+str(subObjectY1)+"\n")
subObjectZ1 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[0].Point.z # sub element coordinate Z1
App.Console.PrintMessage("subObject_Z1 : "+str(subObjectZ1)+"\n\n")
try:
subObjectX2 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[1].Point.x # sub element coordinate X2
App.Console.PrintMessage("subObject_X2 : "+str(subObjectX2)+"\n")
subObjectY2 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[1].Point.y # sub element coordinate Y2
App.Console.PrintMessage("subObject_Y2 : "+str(subObjectY2)+"\n")
subObjectZ2 = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes[1].Point.z # sub element coordinate Z2
App.Console.PrintMessage("subObject_Z2 : "+str(subObjectZ2)+"\n\n")
except:
App.Console.PrintMessage("Oups"+"\n\n")
subObjectBoundBox = Gui.Selection.getSelectionEx()[0].SubObjects[0].BoundBox # sub element BoundBox coordinates
App.Console.PrintMessage("subObjectBBox : "+str(subObjectBoundBox)+"\n")
subObjectBoundBoxCenter = Gui.Selection.getSelectionEx()[0].SubObjects[0].BoundBox.Center # sub element BoundBoxCenter
App.Console.PrintMessage("subObjectBBoxCe: "+str(subObjectBoundBoxCenter)+"\n")
surfaceFace = Gui.Selection.getSelectionEx()[0].SubObjects[0].Area # Area of the face selected
App.Console.PrintMessage("surfaceFace : "+str(surfaceFace)+"\n\n")
except:
App.Console.PrintMessage("Oups"+"\n\n")
##################################################################################
# give the area of the object
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
surface = sel[0].Shape.Area # Area object complete
App.Console.PrintMessage("surfaceObjet : "+str(surface)+"\n\n")
##################################################################################
# give the Center Of Mass and coordinates of the object
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
CenterOfMass = sel[0].Shape.CenterOfMass # Center of Mass of the object
App.Console.PrintMessage("CenterOfMass : "+str(CenterOfMass)+"\n")
App.Console.PrintMessage("CenterOfMassX : "+str(CenterOfMass[0])+"\n") # coordinates [0]=X [1]=Y [2]=Z
App.Console.PrintMessage("CenterOfMassY : "+str(CenterOfMass[1])+"\n") # or CenterOfMass.x, CenterOfMass.y, CenterOfMass.z
App.Console.PrintMessage("CenterOfMassZ : "+str(CenterOfMass[2])+"\n\n")
##################################################################################
# list the all faces of the object selected
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
for j in enumerate(sel[0].Shape.Faces): # List alles faces of the object
App.Console.PrintMessage("Face : "+str("Face%d" % (j[0]+1))+"\n")
App.Console.PrintMessage("\n\n")
##################################################################################
# give the volume of the object selected
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
volume_ = sel[0].Shape.Volume # Volume of the object
App.Console.PrintMessage("volume_ : "+str(volume_)+"\n\n")
##################################################################################
# give the BoundBox of the oject selected all type
objs = FreeCADGui.Selection.getSelection() # select object with getSelection()
if len(objs) >= 1: # serch the object type
if hasattr(objs[0], "Shape"):
s = objs[0].Shape
elif hasattr(objs[0], "Mesh"): # upgrade with wmayer thanks #http://forum.freecadweb.org/viewtopic.php?f=13&t=22331
s = objs[0].Mesh
elif hasattr(objs[0], "Points"):
s = objs[0].Points
boundBox_= s.BoundBox # BoundBox of the object
App.Console.PrintMessage("boundBox_ : "+str(boundBox_)+"\n") #
boundBoxLX = boundBox_.XLength # Length x boundBox rectangle
boundBoxLY = boundBox_.YLength # Length y boundBox rectangle
boundBoxLZ = boundBox_.ZLength # Length z boundBox rectangle
boundBoxXMin = boundBox_.XMin # coordonate XMin
boundBoxYMin = boundBox_.YMin # coordonate YMin
boundBoxZMin = boundBox_.ZMin # coordonate ZMin
boundBoxXMax = boundBox_.XMax # coordonate XMax
boundBoxYMax = boundBox_.YMax # coordonate YMax
boundBoxZMax = boundBox_.ZMax # coordonate ZMax
boundBoxDiag= boundBox_.DiagonalLength # Diagonal Length boundBox rectangle
boundBoxCenter = boundBox_.Center # BoundBox Center
App.Console.PrintMessage("boundBoxLX : "+str(boundBoxLX)+"\n")
App.Console.PrintMessage("boundBoxLY : "+str(boundBoxLY)+"\n")
App.Console.PrintMessage("boundBoxLZ : "+str(boundBoxLZ)+"\n\n")
App.Console.PrintMessage("boundBoxXMin : "+str(boundBoxXMin)+"\n")
App.Console.PrintMessage("boundBoxYMin : "+str(boundBoxYMin)+"\n")
App.Console.PrintMessage("boundBoxZMin : "+str(boundBoxZMin)+"\n")
App.Console.PrintMessage("boundBoxXMax : "+str(boundBoxXMax)+"\n")
App.Console.PrintMessage("boundBoxYMax : "+str(boundBoxYMax)+"\n")
App.Console.PrintMessage("boundBoxZMax : "+str(boundBoxZMax)+"\n\n")
App.Console.PrintMessage("boundBoxDiag : "+str(boundBoxDiag)+"\n")
App.Console.PrintMessage("boundBoxCenter : "+str(boundBoxCenter)+"\n\n")
##################################################################################
# give the complete placement of the object selected
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
pl = sel[0].Shape.Placement # Placement Vector XYZ and Yaw-Pitch-Roll
App.Console.PrintMessage("Placement : "+str(pl)+"\n")
##################################################################################
# give the placement Base (xyz) of the object selected
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
pl = sel[0].Shape.Placement.Base # Placement Vector XYZ
App.Console.PrintMessage("PlacementBase : "+str(pl)+"\n\n")
##################################################################################
# give the placement Base (xyz) of the object selected
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
oripl_X = sel[0].Placement.Base[0] # decode Placement X
oripl_Y = sel[0].Placement.Base[1] # decode Placement Y
oripl_Z = sel[0].Placement.Base[2] # decode Placement Z
# same
#oripl_X = sel[0].Placement.Base.x # decode Placement X
#oripl_Y = sel[0].Placement.Base.y # decode Placement Y
#oripl_Z = sel[0].Placement.Base.z # decode Placement Z
App.Console.PrintMessage("oripl_X : "+str(oripl_X)+"\n")
App.Console.PrintMessage("oripl_Y : "+str(oripl_Y)+"\n")
App.Console.PrintMessage("oripl_Z : "+str(oripl_Z)+"\n\n")
##################################################################################
# give the placement rotation of the object selected (x, y, z, angle rotation)
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
rotation = sel[0].Placement.Rotation # decode Placement Rotation
App.Console.PrintMessage("rotation : "+str(rotation)+"\n\n")
##################################################################################
# give the placement rotation of the object selected (x, y, z, angle rotation)
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
pl = sel[0].Shape.Placement.Rotation # decode Placement Rotation other method
App.Console.PrintMessage("Placement Rot : "+str(pl)+"\n\n")
##################################################################################
# give the rotation of the object selected (angle rotation)
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
pl = sel[0].Shape.Placement.Rotation.Angle # decode Placement Rotation Angle
App.Console.PrintMessage("Placement Rot Angle : "+str(pl)+"\n\n")
##################################################################################
# give the rotation.Q of the object selected (angle rotation in Radian) for convert: math.degrees(angleInRadian)
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
Rot = sel[0].Placement.Rotation.Q # Placement Rotation Q
App.Console.PrintMessage("Rot : "+str(Rot)+ "\n")
Rot_0 = sel[0].Placement.Rotation.Q[0] # decode Placement Rotation Q
App.Console.PrintMessage("Rot_0 : "+str(Rot_0)+ " rad , "+str(180 * Rot_0 / 3.1416)+" deg "+"\n") # or math.degrees(angle)
Rot_1 = sel[0].Placement.Rotation.Q[1] # decode Placement Rotation 1
App.Console.PrintMessage("Rot_1 : "+str(Rot_1)+ " rad , "+str(180 * Rot_1 / 3.1416)+" deg "+"\n") # or math.degrees(angle)
Rot_2 = sel[0].Placement.Rotation.Q[2] # decode Placement Rotation 2
App.Console.PrintMessage("Rot_2 : "+str(Rot_2)+ " rad , "+str(180 * Rot_2 / 3.1416)+" deg "+"\n") # or math.degrees(angle)
Rot_3 = sel[0].Placement.Rotation.Q[3] # decode Placement Rotation 3
App.Console.PrintMessage("Rot_3 : "+str(Rot_3)+"\n\n")
Rot_Axis = sel[0].Placement.Rotation.Axis # Placement Rotation .Axis
App.Console.PrintMessage("Rot_Axis : "+str(Rot_Axis)+ "\n")
Rot_Angle = sel[0].Placement.Rotation.Angle # Placement Rotation .Angle
App.Console.PrintMessage("Rot_Angle : "+str(Rot_Angle)+ "\n\n")
##################################################################################
# give the rotation of the object selected toEuler (angle rotation in degrees)
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
angle = sel[0].Shape.Placement.Rotation.toEuler() # angle Euler
App.Console.PrintMessage("Angle : "+str(angle)+"\n")
Yaw = sel[0].Shape.Placement.Rotation.toEuler()[0] # decode angle Euler Yaw (Z) lacet (alpha)
App.Console.PrintMessage("Yaw : "+str(Yaw)+"\n")
Pitch = sel[0].Shape.Placement.Rotation.toEuler()[1] # decode angle Euler Pitch (Y) tangage (beta)
App.Console.PrintMessage("Pitch : "+str(Pitch)+"\n")
Roll = sel[0].Shape.Placement.Rotation.toEuler()[2] # decode angle Euler Roll (X) roulis (gamma)
App.Console.PrintMessage("Roll : "+str(Roll)+"\n\n")
##################################################################################
# find Midpoint of the selected line
import Draft, DraftGeomUtils
sel = FreeCADGui.Selection.getSelection()
vecteur = DraftGeomUtils.findMidpoint(sel[0].Shape.Edges[0]) # find Midpoint
App.Console.PrintMessage(vecteur)
Draft.makePoint(vecteur)
##################################################################################
Manual search of an element with label
# Extract the coordinate X,Y,Z and Angle giving the label (here "Cylindre")
App.Console.PrintMessage("Base.x : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Base.x)+"\n")
App.Console.PrintMessage("Base.y : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Base.y)+"\n")
App.Console.PrintMessage("Base.z : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Base.z)+"\n")
App.Console.PrintMessage("Base.Angle : "+str(FreeCAD.ActiveDocument.getObjectsByLabel("Cylindre")[0].Placement.Rotation.Angle)+"\n\n")
##################################################################################
PS: Usually the angles are given in Radian to convert :
- angle in Degrees to Radians :
- Angle in radian = pi * (angle in degree) / 180
- Angle in radian = math.radians(angle in degree)
- angle in Radians to Degrees :
- Angle in degree = 180 * (angle in radian) / pi
- Angle in degree = math.degrees(angle in radian)
Cartesian coordinates
This code displays the Cartesian coordinates of the selected item.
Change the value of "numberOfPoints" if you want a different number of points (precision)
numberOfPoints = 100 # Decomposition number (or precision you can change)
selectedEdge = FreeCADGui.Selection.getSelectionEx()[0].SubObjects[0].copy() # select one element
points = selectedEdge.discretize(numberOfPoints) # discretize the element
i=0
for p in points: # list and display the coordinates
i+=1
print i, " X", p.x, " Y", p.y, " Z", p.z
Other method display on "Int" and "Float"
import Part
from FreeCAD import Base
c=Part.makeCylinder(2,10) # create the circle
Part.show(c) # display the shape
# slice accepts two arguments:
#+ the normal of the cross section plane
#+ the distance from the origin to the cross section plane. Here you have to find a value so that the plane intersects your object
s=c.slice(Base.Vector(0,1,0),0) #
# here the result is a single wire
# depending on the source object this can be several wires
s=s[0]
# if you only need the vertexes of the shape you can use
v=[]
for i in s.Vertexes:
v.append(i.Point)
# but you can also sub-sample the section to have a certain number of points (int) ...
p1=s.discretize(20)
ii=0
for i in p1:
ii+=1
print i # Vector()
print ii, ": X:", i.x, " Y:", i.y, " Z:", i.z # Vector decode
Draft.makeWire(p1,closed=False,face=False,support=None) # to see the difference accuracy (20)
## uncomment to use
#import Draft
#Draft.downgrade(App.ActiveDocument.ActiveObject,delete=True) # first transform the DWire in Wire "downgrade"
#Draft.downgrade(App.ActiveDocument.ActiveObject,delete=True) # second split the Wire in single objects "downgrade"
#
##Draft.upgrade(FreeCADGui.Selection.getSelection(),delete=True) # to attach lines contiguous SELECTED use "upgrade"
# ... or define a sampling distance (float)
p2=s.discretize(0.5)
ii=0
for i in p2:
ii+=1
print i # Vector()
print ii, ": X:", i.x, " Y:", i.y, " Z:", i.z # Vector decode
Draft.makeWire(p2,closed=False,face=False,support=None) # to see the difference accuracy (0.5)
## uncomment to use
#import Draft
#Draft.downgrade(App.ActiveDocument.ActiveObject,delete=True) # first transform the DWire in Wire "downgrade"
#Draft.downgrade(App.ActiveDocument.ActiveObject,delete=True) # second split the Wire in single objects "downgrade"
#
##Draft.upgrade(FreeCADGui.Selection.getSelection(),delete=True) # to attach lines contiguous SELECTED use "upgrade"
Select all objects in the document
import FreeCAD
for obj in FreeCAD.ActiveDocument.Objects:
print obj.Name # display the object Name
objName = obj.Name
obj = App.ActiveDocument.getObject(objName)
Gui.Selection.addSelection(obj) # select the object
Selecting a face of an object
# select one face of the object
import FreeCAD, Draft
App=FreeCAD
nameObject = "Box" # objet
faceSelect = "Face3" # face to selection
loch=App.ActiveDocument.getObject(nameObject) # objet
Gui.Selection.clearSelection() # clear all selection
Gui.Selection.addSelection(loch,faceSelect) # select the face specified
s = Gui.Selection.getSelectionEx()
#Draft.makeFacebinder(s) #
Create one object to the position of the Camera
# create one object of the position to camera with "getCameraOrientation()"
# the object is still facing the screen
import Draft
plan = FreeCADGui.ActiveDocument.ActiveView.getCameraOrientation()
plan = str(plan)
###### extract data
a = ""
for i in plan:
if i in ("0123456789e.- "):
a+=i
a = a.strip(" ")
a = a.split(" ")
####### extract data
#print a
#print a[0]
#print a[1]
#print a[2]
#print a[3]
xP = float(a[0])
yP = float(a[1])
zP = float(a[2])
qP = float(a[3])
pl = FreeCAD.Placement()
pl.Rotation.Q = (xP,yP,zP,qP) # rotation of object
pl.Base = FreeCAD.Vector(0.0,0.0,0.0) # here coordinates XYZ of Object
rec = Draft.makeRectangle(length=10.0,height=10.0,placement=pl,face=False,support=None) # create rectangle
#rec = Draft.makeCircle(radius=5,placement=pl,face=False,support=None) # create circle
print rec.Name
here same code simplified
import Draft
pl = FreeCAD.Placement()
pl.Rotation = FreeCADGui.ActiveDocument.ActiveView.getCameraOrientation()
pl.Base = FreeCAD.Vector(0.0,0.0,0.0)
rec = Draft.makeRectangle(length=10.0,height=10.0,placement=pl,face=False,support=None)
Find normal vector on the surface
This example show how to find normal vector on the surface by find the u,v parameters of one point on the surface and use u,v parameters to find normal vector
def normal(self):
ss=FreeCADGui.Selection.getSelectionEx()[0].SubObjects[0].copy()#SubObjects[0] is the edge list
points = ss.discretize(3.0)#points on the surface edge,
#this example just use points on the edge for example.
#However point is not necessary on the edge, it can be anywhere on the surface.
face=FreeCADGui.Selection.getSelectionEx()[0].SubObjects[1]
for pp in points:
pt=FreeCAD.Base.Vector(pp.x,pp.y,pp.z)#a point on the surface edge
uv=face.Surface.parameter(pt)# find the surface u,v parameter of a point on the surface edge
u=uv[0]
v=uv[1]
normal=face.normalAt(u,v)#use u,v to find normal vector
print normal
line=Part.makeLine((pp.x,pp.y,pp.z), (normal.x,normal.y,normal.z))
Part.show(line)
Read And write one Expression
import Draft
doc = FreeCAD.ActiveDocument
pl=FreeCAD.Placement()
pl.Rotation.Q=(0.0,-0.0,-0.0,1.0)
pl.Base=FreeCAD.Vector(0.0,0.0,0.0)
obj = Draft.makeCircle(radius=1.0,placement=pl,face=False,support=None) # create circle
print obj.PropertiesList # properties disponible in the obj
doc.getObject(obj.Name).setExpression('Radius', u'2mm') # modify the radius
doc.getObject(obj.Name).setExpression('Placement.Base.x', u'10mm') # modify the placement
doc.getObject(obj.Name).setExpression('FirstAngle', u'90') # modify the first angle
doc.recompute()
expressions = obj.ExpressionEngine # read the expression list
print expressions
for i in expressions: # list and separate the data expression
print i[0]," = ",i[1]
Get the normal vector of a surface from a STL file
def getNormal(cb):
if cb.getEvent().getState() == coin.SoButtonEvent.UP:
pp = cb.getPickedPoint()
if pp:
vec = pp.getNormal().getValue()
index = coin.cast(pp.getDetail(), "SoFaceDetail").getFaceIndex()
print ("Normal: {}, Face index: {}".format(str(vec), index))
from pivy import coin
meth=Gui.ActiveDocument.ActiveView.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), getNormal)
you are done then run for quit:
Gui.ActiveDocument.ActiveView.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), meth)
Create a Sketch on a Surface in PartDesign
This snippet can be useful, if you want to create a sketch on a surface in PartDesign from inside a macro. Note, that body might be None, if no active body is selected and that the Selection might be empty.
body = Gui.ActiveDocument.ActiveView.getActiveObject('pdbody')
first_selection = Gui.Selection.getSelectionEx()[0]
feature = first_selection.Object
face_name = first_selection.SubElementNames[0]
sketch = App.ActiveDocument.addObject('Sketcher::SketchObject','MySketch')
body.addObject(sketch)
sketch.MapMode = 'FlatFace'
sketch.Support = (feature, face_name)
App.ActiveDocument.recompute()
How to Simulate a Mouse Click at a given Coordinate
The position is relative to the GL widget. See forum thread.
from PySide2 import QtCore
from PySide2 import QtGui
from PySide2 import QtWidgets
mw = Gui.getMainWindow()
gl = mw.findChild(QtWidgets.QOpenGLWidget)
me = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonRelease, QtCore.QPoint(800,300), QtCore.Qt.LeftButton, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier)
app = QtWidgets.QApplication.instance()
app.sendEvent(gl, me)
Related
- FreeCAD scripting: Python, Introduction to Python, Python scripting tutorial, FreeCAD Scripting Basics
- Modules: Builtin modules, Units, Quantity
- Workbenches: Workbench creation, Gui Commands, Commands, Installing more workbenches
- Meshes and Parts: Mesh Scripting, Topological data scripting, Mesh to Part, PythonOCC
- Parametric objects: Scripted objects, Viewproviders (Custom icon in tree view)
- Scenegraph: Coin (Inventor) scenegraph, Pivy
- Graphical interface: Interface creation, Interface creation completely in Python (1, 2, 3, 4, 5), PySide, PySide examples beginner, intermediate, advanced
- Macros: Macros, How to install macros
- Embedding: Embedding FreeCAD, Embedding FreeCADGui
- Other: Expressions, Code snippets, Line drawing function, FreeCAD vector math library (deprecated)
- Hubs: User hub, Power users hub, Developer hub