1128 lines
68 KiB
HTML
1128 lines
68 KiB
HTML
<html><head><title>Code snippets/ru</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><link type='text/css' href='wiki.css' rel='stylesheet'></head><body><h1>Code snippets/ru</h1></div>
|
||
|
||
<div id="mw-content-text" lang="ru" dir="ltr" class="mw-content-ltr"><hr/>
|
||
<div class="mw-parser-output"><table class="fcinfobox wikitable ct" style="width: 230px; float: right; margin-left: 1em">
|
||
<tr>
|
||
<td class="ctTitle">
|
||
<h3><span class="mw-headline" id="Tutorial"><a href="https://www.freecadweb.org/wiki/index.php?title=File:Base_ExampleCommandModel.png" class="image"><img alt="Base ExampleCommandModel.png" src="32px-Base_ExampleCommandModel.png" width="32" height="30" srcset="/wiki/images/thumb/9/93/Base_ExampleCommandModel.png/48px-Base_ExampleCommandModel.png 1.5x, /wiki/images/9/93/Base_ExampleCommandModel.png 2x" /></a> Tutorial</span></h3>
|
||
</td></tr>
|
||
<tr>
|
||
<th class="ctOdd">Topic
|
||
</th></tr>
|
||
<tr>
|
||
<td class="ctEven">Python
|
||
</td></tr>
|
||
<tr>
|
||
<th class="ctOdd">Level
|
||
</th></tr>
|
||
<tr>
|
||
<td class="ctEven">Beginner
|
||
</td></tr>
|
||
<tr>
|
||
<th class="ctOdd">Time to complete
|
||
</th></tr>
|
||
<tr>
|
||
<td class="ctEven">
|
||
</td></tr>
|
||
<tr>
|
||
<th class="ctOdd">Author
|
||
</th></tr>
|
||
<tr>
|
||
<td class="ctEven">
|
||
</td></tr>
|
||
<tr>
|
||
<th class="ctOdd">FreeCAD version
|
||
</th></tr>
|
||
<tr>
|
||
<td class="ctEven">
|
||
</td></tr>
|
||
<tr>
|
||
<th class="ctOdd">Example File(s)
|
||
</th></tr>
|
||
<tr>
|
||
<td class="ctEven">
|
||
</td></tr>
|
||
<tr>
|
||
<td class="ctToc"><br /><div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
|
||
<ul>
|
||
<li class="toclevel-1"><a href="#Tutorial"><span class="tocnumber">1</span> <span class="toctext">Tutorial</span></a></li>
|
||
<li class="toclevel-1 tocsection-1"><a href="#.D0.9E.D0.B1.D1.8B.D1.87.D0.BD.D1.8B.D0.B9_.D1.84.D0.B0.D0.B9.D0.BB_InitGui.py"><span class="tocnumber">2</span> <span class="toctext">Обычный файл InitGui.py</span></a></li>
|
||
<li class="toclevel-1 tocsection-2"><a href="#.D0.9E.D0.B1.D1.8B.D1.87.D0.BD.D1.8B.D0.B9_.D1.84.D0.B0.D0.B9.D0.BB_.D0.BC.D0.BE.D0.B4.D1.83.D0.BB.D1.8F"><span class="tocnumber">3</span> <span class="toctext">Обычный файл модуля</span></a></li>
|
||
<li class="toclevel-1 tocsection-3"><a href="#.D0.98.D0.BC.D0.BF.D0.BE.D1.80.D1.82_.D0.BD.D0.BE.D0.B2.D0.BE.D0.B3.D0.BE_.D1.82.D0.B8.D0.BF.D0.B0_.D1.84.D0.B0.D0.B9.D0.BB.D0.BE.D0.B2"><span class="tocnumber">4</span> <span class="toctext">Импорт нового типа файлов</span></a></li>
|
||
<li class="toclevel-1 tocsection-4"><a href="#.D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BB.D0.B8.D0.BD.D0.B8.D0.B8"><span class="tocnumber">5</span> <span class="toctext">Добавление линии</span></a></li>
|
||
<li class="toclevel-1 tocsection-5"><a href="#.D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BC.D0.BD.D0.BE.D0.B3.D0.BE.D1.83.D0.B3.D0.BE.D0.BB.D1.8C.D0.BD.D0.B8.D0.BA.D0.B0"><span class="tocnumber">6</span> <span class="toctext">Добавление многоугольника</span></a></li>
|
||
<li class="toclevel-1 tocsection-6"><a href="#.D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.B8_.D1.83.D0.B4.D0.B0.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D0.B0_.D0.B8.D0.B7_.D0.B3.D1.80.D1.83.D0.BF.D0.BF.D1.8B"><span class="tocnumber">7</span> <span class="toctext">Добавление и удаление объекта из группы</span></a></li>
|
||
<li class="toclevel-1 tocsection-7"><a href="#.D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.9F.D0.BE.D0.BB.D0.B8.D0.B3.D0.B8.D0.BE.D0.BD.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D0.B9_.D0.BC.D0.BE.D0.B4.D0.B5.D0.BB.D0.B8"><span class="tocnumber">8</span> <span class="toctext">Добавление Полигиональной модели</span></a></li>
|
||
<li class="toclevel-1 tocsection-8"><a href="#.D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.B4.D1.83.D0.B3.D0.B8_.D0.B8.D0.BB.D0.B8_.D0.BE.D0.B3.D1.80.D1.83.D0.B6.D0.BD.D0.BE.D1.81.D1.82.D0.B8"><span class="tocnumber">9</span> <span class="toctext">Добавление дуги или огружности</span></a></li>
|
||
<li class="toclevel-1 tocsection-9"><a href="#.D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.B4.D0.BE.D1.81.D1.82.D1.83.D0.BF.D0.B0_.D0.B8_.D0.B8.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BF.D1.80.D0.B5.D0.B4.D1.81.D1.82.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D1.8F_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D0.B0"><span class="tocnumber">10</span> <span class="toctext">Получение доступа и изменение представления объекта</span></a></li>
|
||
<li class="toclevel-1 tocsection-10"><a href="#.D0.9D.D0.B0.D0.B1.D0.BB.D1.8E.D0.B4.D0.B5.D0.BD.D0.B8.D0.B5_.D0.B7.D0.B0_.D0.BF.D0.BE.D0.B2.D0.B5.D0.B4.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BC.D1.8B.D1.88.D0.B8_.D0.B2_3D_.D0.BE.D0.BA.D0.BD.D0.B5_.D1.87.D0.B5.D1.80.D0.B5.D0.B7_Python"><span class="tocnumber">11</span> <span class="toctext">Наблюдение за поведение мыши в 3D окне через Python</span></a></li>
|
||
<li class="toclevel-1 tocsection-11"><a href="#Display_keys_pressed_and_Events_command"><span class="tocnumber">12</span> <span class="toctext">Display keys pressed and Events command</span></a></li>
|
||
<li class="toclevel-1 tocsection-12"><a href="#.D0.9C.D0.B0.D0.BD.D0.B8.D0.BF.D1.83.D0.BB.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_scenegraph_.D0.B2_Python"><span class="tocnumber">13</span> <span class="toctext">Манипулирование scenegraph в Python</span></a></li>
|
||
<li class="toclevel-1 tocsection-13"><a href="#.D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.B8_.D1.83.D0.B4.D0.B0.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D0.BE.D0.B2_.D0.B2.2F.D0.B8.D0.B7_.D0.B3.D1.80.D0.B0.D1.84.D0.B0_.D1.81.D1.86.D0.B5.D0.BD.D1.8B"><span class="tocnumber">14</span> <span class="toctext">Добавление и удаление объектов в/из графа сцены</span></a></li>
|
||
<li class="toclevel-1 tocsection-14"><a href="#Saves_the_sceneGraph_with_a_rotation_in_a_series_of_36_files_in_the_X_Y_Z_axis"><span class="tocnumber">15</span> <span class="toctext">Saves the sceneGraph with a rotation in a series of 36 files in the X Y Z axis</span></a></li>
|
||
<li class="toclevel-1 tocsection-15"><a href="#.D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D1.81.D0.BA.D0.B8.D1.85_.D0.B2.D0.B8.D0.B4.D0.B6.D0.B5.D1.82.D0.BE.D0.B2_.D0.BA_.D0.B8.D0.BD.D1.82.D0.B5.D1.80.D1.84.D0.B5.D0.B9.D1.81.D1.83"><span class="tocnumber">16</span> <span class="toctext">Добавление пользовательских виджетов к интерфейсу</span></a></li>
|
||
<li class="toclevel-1 tocsection-16"><a href="#Adding_a_Tab_to_the_Combo_View"><span class="tocnumber">17</span> <span class="toctext">Adding a Tab to the Combo View</span></a></li>
|
||
<li class="toclevel-1 tocsection-17"><a href="#Enable_or_disable_a_window"><span class="tocnumber">18</span> <span class="toctext">Enable or disable a window</span></a></li>
|
||
<li class="toclevel-1 tocsection-18"><a href="#Opening_a_custom_webpage"><span class="tocnumber">19</span> <span class="toctext">Opening a custom webpage</span></a></li>
|
||
<li class="toclevel-1 tocsection-19"><a href="#Getting_the_HTML_contents_of_an_opened_webpage"><span class="tocnumber">20</span> <span class="toctext">Getting the HTML contents of an opened webpage</span></a></li>
|
||
<li class="toclevel-1 tocsection-20"><a href="#Retrieve_and_use_the_coordinates_of_3_selected_points_or_objects"><span class="tocnumber">21</span> <span class="toctext">Retrieve and use the coordinates of 3 selected points or objects</span></a></li>
|
||
<li class="toclevel-1 tocsection-21"><a href="#List_all_objects"><span class="tocnumber">22</span> <span class="toctext">List all objects</span></a></li>
|
||
<li class="toclevel-1 tocsection-22"><a href="#List_the_dimensions_of_an_object.2C_given_its_name"><span class="tocnumber">23</span> <span class="toctext">List the dimensions of an object, given its name</span></a></li>
|
||
<li class="toclevel-1 tocsection-23"><a href="#Function_resident_with_the_mouse_click_action"><span class="tocnumber">24</span> <span class="toctext">Function resident with the mouse click action</span></a></li>
|
||
<li class="toclevel-1 tocsection-24"><a href="#Finding-selecting_all_elements_below_cursor"><span class="tocnumber">25</span> <span class="toctext">Finding-selecting all elements below cursor</span></a></li>
|
||
<li class="toclevel-1 tocsection-25"><a href="#List_the_components_of_an_object"><span class="tocnumber">26</span> <span class="toctext">List the components of an object</span></a></li>
|
||
<li class="toclevel-1 tocsection-26"><a href="#List_the_PropertiesList"><span class="tocnumber">27</span> <span class="toctext">List the PropertiesList</span></a></li>
|
||
<li class="toclevel-1 tocsection-27"><a href="#Adding_one_Property_.22Comment.22"><span class="tocnumber">28</span> <span class="toctext">Adding one Property "Comment"</span></a></li>
|
||
<li class="toclevel-1 tocsection-28"><a href="#Search_and_data_extraction"><span class="tocnumber">29</span> <span class="toctext">Search and data extraction</span></a></li>
|
||
<li class="toclevel-1 tocsection-29"><a href="#Manual_search_of_an_element_with_label"><span class="tocnumber">30</span> <span class="toctext">Manual search of an element with label</span></a></li>
|
||
<li class="toclevel-1 tocsection-30"><a href="#Cartesian_coordinates"><span class="tocnumber">31</span> <span class="toctext">Cartesian coordinates</span></a></li>
|
||
<li class="toclevel-1 tocsection-31"><a href="#Select_all_objects_in_the_document"><span class="tocnumber">32</span> <span class="toctext">Select all objects in the document</span></a></li>
|
||
<li class="toclevel-1 tocsection-32"><a href="#Selecting_a_face_of_an_object"><span class="tocnumber">33</span> <span class="toctext">Selecting a face of an object</span></a></li>
|
||
<li class="toclevel-1 tocsection-33"><a href="#Create_one_object_to_the_position_of_the_Camera"><span class="tocnumber">34</span> <span class="toctext">Create one object to the position of the Camera</span></a></li>
|
||
<li class="toclevel-1 tocsection-34"><a href="#Find_normal_vector_on_the_surface"><span class="tocnumber">35</span> <span class="toctext">Find normal vector on the surface</span></a></li>
|
||
<li class="toclevel-1 tocsection-35"><a href="#Read_And_write_one_Expression"><span class="tocnumber">36</span> <span class="toctext">Read And write one Expression</span></a></li>
|
||
</ul>
|
||
</div>
|
||
|
||
</td></tr></table>
|
||
<p><br />
|
||
</p><p>Эта страница содержит примеры, обрывки, куски FreeCAD python кода, собранный для получения пользователями оптыта и обсуждения на форумах. Читайте и используете их как начало для ваших собственных сценариев...
|
||
</p><p><br />
|
||
</p>
|
||
<h3><span class="mw-headline" id=".D0.9E.D0.B1.D1.8B.D1.87.D0.BD.D1.8B.D0.B9_.D1.84.D0.B0.D0.B9.D0.BB_InitGui.py">Обычный файл InitGui.py</span></h3>
|
||
<p>Каждый модуль должен содержать, помимо основного файла модуля, файл InitGui.py , ответственного за вставку модуля в главное Gui. Это простой пример
|
||
</p>
|
||
<pre>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()) </pre>
|
||
<h3><span class="mw-headline" id=".D0.9E.D0.B1.D1.8B.D1.87.D0.BD.D1.8B.D0.B9_.D1.84.D0.B0.D0.B9.D0.BB_.D0.BC.D0.BE.D0.B4.D1.83.D0.BB.D1.8F">Обычный файл модуля</span></h3>
|
||
<p>Это пример головного файла модуля, содержащего всё что ваш модуль делает. Это Scripts.py файл вызванный в предыдущем примере. Вы можете установить здесь все ваши пользовательские команды.
|
||
</p>
|
||
<pre>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()) </pre>
|
||
<h3><span class="mw-headline" id=".D0.98.D0.BC.D0.BF.D0.BE.D1.80.D1.82_.D0.BD.D0.BE.D0.B2.D0.BE.D0.B3.D0.BE_.D1.82.D0.B8.D0.BF.D0.B0_.D1.84.D0.B0.D0.B9.D0.BB.D0.BE.D0.B2">Импорт нового типа файлов</span></h3>
|
||
<p>Создание ипортировщика в нового типа файлов в FreeCAD, просто. FreeCAD не считает что вы импортируете данные в открытый документ, а скорее что вы просто можете непосредственно открыть новый тип файла. Так что все что вам нужно сделать, это добавить новое расширение файла в список известных расширений FreeCAD , и написать код, который будет читать файл и создавать FreeCAD объекты:
|
||
</p><p>Это строка должна быть добавлена в InitGui.py файл для добавления нового расширения файлов в список:
|
||
</p>
|
||
<pre># 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") </pre>
|
||
<p>Тогда в файле Import_Ext.py:
|
||
</p>
|
||
<pre>def open(filename):
|
||
doc=App.newDocument()
|
||
# here you do all what is needed with filename, read, classify data, create corresponding FreeCAD objects
|
||
doc.recompute() </pre>
|
||
<p>Экспорт вашего документа в новые типы файлов работает схожим образом, исключая того что вы используете:
|
||
</p>
|
||
<pre>FreeCAD.addExportType("Your new File Type (*.ext)","Export_Ext")
|
||
</pre>
|
||
<h3><span class="mw-headline" id=".D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BB.D0.B8.D0.BD.D0.B8.D0.B8">Добавление линии</span></h3>
|
||
<p>Простейшая линия через две точки.
|
||
</p>
|
||
<pre>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() </pre>
|
||
<h3><span class="mw-headline" id=".D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BC.D0.BD.D0.BE.D0.B3.D0.BE.D1.83.D0.B3.D0.BE.D0.BB.D1.8C.D0.BD.D0.B8.D0.BA.D0.B0">Добавление многоугольника</span></h3>
|
||
<p>Многоугольник это просто набор соединенных отрезков (polyline в AutoCAD). Он необязательно должен быть замкнутым.
|
||
</p>
|
||
<pre>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() </pre>
|
||
<h3><span class="mw-headline" id=".D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.B8_.D1.83.D0.B4.D0.B0.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D0.B0_.D0.B8.D0.B7_.D0.B3.D1.80.D1.83.D0.BF.D0.BF.D1.8B">Добавление и удаление объекта из группы</span></h3>
|
||
<pre>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 </pre>
|
||
<p>Примечание: Вы также можете добавлять другие группы в группу...
|
||
</p>
|
||
<h3><span class="mw-headline" id=".D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.9F.D0.BE.D0.BB.D0.B8.D0.B3.D0.B8.D0.BE.D0.BD.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D0.B9_.D0.BC.D0.BE.D0.B4.D0.B5.D0.BB.D0.B8">Добавление Полигиональной модели</span></h3>
|
||
<pre>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 </pre>
|
||
<h3><span class="mw-headline" id=".D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.B4.D1.83.D0.B3.D0.B8_.D0.B8.D0.BB.D0.B8_.D0.BE.D0.B3.D1.80.D1.83.D0.B6.D0.BD.D0.BE.D1.81.D1.82.D0.B8">Добавление дуги или огружности</span></h3>
|
||
<pre>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() </pre>
|
||
<h3><span class="mw-headline" id=".D0.9F.D0.BE.D0.BB.D1.83.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D0.B4.D0.BE.D1.81.D1.82.D1.83.D0.BF.D0.B0_.D0.B8_.D0.B8.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BF.D1.80.D0.B5.D0.B4.D1.81.D1.82.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D1.8F_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D0.B0">Получение доступа и изменение представления объекта</span></h3>
|
||
<p>Каждый объект в FreeCAD документе оссоциируется с визуальным представлением объекта, которое хранит все параметры , определяющие как объект представлен, такие как цвет, длина линий, и.т.д...
|
||
</p>
|
||
<pre>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 </pre>
|
||
<h3><span class="mw-headline" id=".D0.9D.D0.B0.D0.B1.D0.BB.D1.8E.D0.B4.D0.B5.D0.BD.D0.B8.D0.B5_.D0.B7.D0.B0_.D0.BF.D0.BE.D0.B2.D0.B5.D0.B4.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BC.D1.8B.D1.88.D0.B8_.D0.B2_3D_.D0.BE.D0.BA.D0.BD.D0.B5_.D1.87.D0.B5.D1.80.D0.B5.D0.B7_Python">Наблюдение за поведение мыши в 3D окне через Python</span></h3>
|
||
<p>Inventor позваляет добавить оди и более узлов обратного вызова(callback) в дерево сцен просмотрщика. По умолчанию в FreeCAD один узел обратного вызова установлен в кадое окно просмотра(просмотрщик), который позволяет добавить глобальные или статические C++ функции. Соответствуюе Python привязки, некоторые методы которых позволяют использовать эту технику (callback) в Python коде.
|
||
</p>
|
||
<pre>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) </pre>
|
||
<p>Теперь, выберите какую нибудь область в окне 3D-просмотра и наблюдайте сообщения в окне вывода. Для завершения наблюдения просто вызовите
|
||
</p>
|
||
<pre>v.removeEventCallback("SoMouseButtonEvent",c) </pre>
|
||
<p>Поддерживаются следующие типы событий
|
||
</p>
|
||
<ul><li> SoEvent -- Все события</li>
|
||
<li> SoButtonEvent -- Все события клавиш клавиатуры и мыши</li>
|
||
<li> SoLocation2Event -- события 2D перемещений (обычно движение мыши)</li>
|
||
<li> SoMotion3Event -- события 3D перемещений (обычно spaceball)</li>
|
||
<li> SoKeyboradEvent -- события нажатие и отпускание клавиш клавиатуры</li>
|
||
<li> SoMouseButtonEvent -- события нажатия и отпускания клавиш мыши</li>
|
||
<li> SoSpaceballButtonEvent -- события нажатия и отпускания клавиш spaceball</li></ul>
|
||
<p>Python функции которые могут быть зарегистрированы в addEventCallback() предлагающем словарь(dictionary). В зависимости от наблюдателя события словарь может содержать различные ключи.
|
||
</p><p>Для всех событий существуют ключи:
|
||
</p>
|
||
<ul><li> Type -- Имя типа события т.е. SoMouseEvent, SoLocation2Event, ... </li>
|
||
<li> Time -- текущие время в виде строки</li>
|
||
<li> Position -- набор из двух целых чисел как позиция курсорa мыши</li>
|
||
<li> ShiftDown -- логическая(boolean) переменная, true если Shift нажат, в противном случае false </li>
|
||
<li> CtrlDown -- логическая(boolean) переменная, true если Ctrl нажат, в противном случае false </li>
|
||
<li> AltDown -- логическая(boolean) переменная, true если Alt нажат, в противном случае false </li></ul>
|
||
<p>Для всех клавишных событий, т.e. для событий клавиатуры, мыши или spaceball
|
||
</p>
|
||
<ul><li> State -- Строка 'UP' если кнопка была вверху, 'DOWN' если кнопка была внизу или 'UNKNOWN' во всех остальных случаях</li></ul>
|
||
<p>Для событий связанных с клавиатурой:
|
||
</p>
|
||
<ul><li> Key -- значение нажатоой клаывиши</li></ul>
|
||
<p>Для событий связанных с мышью
|
||
</p>
|
||
<ul><li> Button -- Нажаты клавиши, могут быть BUTTON1, ..., BUTTON5 или ANY </li></ul>
|
||
<p>Для событий spaceball:
|
||
</p>
|
||
<ul><li> Button -- Нажатые клавиши, могут быть BUTTON1, ..., BUTTON7 или ANY </li></ul>
|
||
<p>и наконец события движения:
|
||
</p>
|
||
<ul><li> Translation -- набор из трех переменных floats </li>
|
||
<li> Rotation -- кватернион поворота, т.е. набор из четырех переменных floats</li></ul>
|
||
<h3><span class="mw-headline" id="Display_keys_pressed_and_Events_command">Display keys pressed and Events command</span></h3>
|
||
<p>This macro displays in the report view the keys pressed and all events command
|
||
</p>
|
||
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>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</pre></div>
|
||
<h3><span class="mw-headline" id=".D0.9C.D0.B0.D0.BD.D0.B8.D0.BF.D1.83.D0.BB.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_scenegraph_.D0.B2_Python">Манипулирование scenegraph в Python</span></h3>
|
||
<p>Кроме того можно получить и изменить граф сцены в Python, с помощью модуля 'pivy' -- Python привязки к Coin.
|
||
</p>
|
||
<pre>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() </pre>
|
||
<p>Python API для pivy создано используя инструмент SWIG. Так как мы используем в FreeCAD некоторые самостоятельно записанные узлы вы не можете создавать их напрямую через Python.
|
||
Однако, возможно создать узел в его внутренним именем. Экземпляр типа 'SoFCSelection' может быть создан
|
||
</p>
|
||
<pre>type = SoType.fromName("SoFCSelection")
|
||
node = type.createInstance() </pre>
|
||
<h3><span class="mw-headline" id=".D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.B8_.D1.83.D0.B4.D0.B0.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D0.BE.D0.B2_.D0.B2.2F.D0.B8.D0.B7_.D0.B3.D1.80.D0.B0.D1.84.D0.B0_.D1.81.D1.86.D0.B5.D0.BD.D1.8B">Добавление и удаление объектов в/из графа сцены</span></h3>
|
||
<p>Добавление новых узлов в граф сцены(scenegraph) может сделать таким образом. Всегда заботтесь о добавлении SoSeparator содержащего информацию о геометрии, координатах и материалах объекта. В следующем примере добавляется красная линия из точки (0,0,0) в (10,0,0):
|
||
</p>
|
||
<pre>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) </pre>
|
||
<p>Чтобы удалить её, просто введите:
|
||
</p>
|
||
<pre>sg.removeChild(no) </pre>
|
||
<h3><span class="mw-headline" id="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</span></h3>
|
||
<pre>import 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) </pre>
|
||
<div class="mw-translate-fuzzy">
|
||
<h3><span class="mw-headline" id=".D0.94.D0.BE.D0.B1.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D1.81.D0.BA.D0.B8.D1.85_.D0.B2.D0.B8.D0.B4.D0.B6.D0.B5.D1.82.D0.BE.D0.B2_.D0.BA_.D0.B8.D0.BD.D1.82.D0.B5.D1.80.D1.84.D0.B5.D0.B9.D1.81.D1.83">Добавление пользовательских виджетов к интерфейсу</span></h3>
|
||
<p>Вы можете содать собственные виджеты с помощью Qt designer, превратив их в сценарии на python, с помощью PyQt4, и загрузив их в FreeCAD.
|
||
</p>
|
||
</div>
|
||
<p>Python код созданный с помощью Ui python compiler (это инструмент для конвертирования файлов ui. созданных qt-designer в python код) в основном выглядит так (это простой пример, вы также может писать этот код напряму с помощью python):
|
||
</p>
|
||
<pre>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)) </pre>
|
||
<p>Тогда все что вам нужно сделать, это создать ссылку на FreeCAD Qt окно, вставить виджет в него, и "преобразовать" этот виджет в ваш с Ui кодом который мы только что сделали:
|
||
</p>
|
||
<pre>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 </pre>
|
||
<h3><span class="mw-headline" id="Adding_a_Tab_to_the_Combo_View">Adding a Tab to the Combo View</span></h3>
|
||
<p>The following code allows you to add a tab to the FreeCAD ComboView, besides the "Project" and "Tasks" tabs. It also uses the uic module to load an ui file directly in that tab.
|
||
</p>
|
||
<pre># 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) </pre>
|
||
<h3><span class="mw-headline" id="Enable_or_disable_a_window">Enable or disable a window</span></h3>
|
||
<pre>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 </pre>
|
||
<h3><span class="mw-headline" id="Opening_a_custom_webpage">Opening a custom webpage</span></h3>
|
||
<pre>import WebGui
|
||
WebGui.openBrowser("http://www.example.com") </pre>
|
||
<h3><span class="mw-headline" id="Getting_the_HTML_contents_of_an_opened_webpage">Getting the HTML contents of an opened webpage</span></h3>
|
||
<pre>from PyQt4 import QtGui,QtWebKit
|
||
a = QtGui.qApp
|
||
mw = a.activeWindow()
|
||
v = mw.findChild(QtWebKit.QWebFrame)
|
||
html = unicode(v.toHtml())
|
||
print html </pre>
|
||
<h3><span class="mw-headline" id="Retrieve_and_use_the_coordinates_of_3_selected_points_or_objects">Retrieve and use the coordinates of 3 selected points or objects</span></h3>
|
||
<pre># -*- 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") </pre>
|
||
<h3><span class="mw-headline" id="List_all_objects">List all objects</span></h3>
|
||
<pre># -*- 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 </pre>
|
||
<h3><span class="mw-headline" id="List_the_dimensions_of_an_object.2C_given_its_name">List the dimensions of an object, given its name</span></h3>
|
||
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>for edge in FreeCAD.ActiveDocument.MyObjectName.Shape.Edges: # replace "MyObjectName" for list
|
||
print edge.Length</pre></div>
|
||
<p><br />
|
||
</p>
|
||
<h3><span class="mw-headline" id="Function_resident_with_the_mouse_click_action">Function resident with the mouse click action</span></h3>
|
||
<p>Here with <b>SelObserver</b> on a object select
|
||
</p>
|
||
<pre># -*- 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 </pre>
|
||
<p>Other example with <b>ViewObserver</b> on a object select or view
|
||
</p>
|
||
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre>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)</pre></div>
|
||
<h3><span class="mw-headline" id="Finding-selecting_all_elements_below_cursor">Finding-selecting all elements below cursor</span></h3>
|
||
<pre>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) </pre>
|
||
<h3><span class="mw-headline" id="List_the_components_of_an_object">List the components of an object</span></h3>
|
||
<pre># -*- 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() </pre>
|
||
<h3><span class="mw-headline" id="List_the_PropertiesList">List the PropertiesList</span></h3>
|
||
<pre>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") </pre>
|
||
<h3><span class="mw-headline" id="Adding_one_Property_.22Comment.22">Adding one Property "Comment"</span></h3>
|
||
<pre>import Draft
|
||
obj = FreeCADGui.Selection.getSelection()[0]
|
||
obj.addProperty("App::PropertyString","GComment","Draft","Font name").GComment = "Comment here"
|
||
App.activeDocument().recompute() </pre>
|
||
<h3><span class="mw-headline" id="Search_and_data_extraction">Search and data extraction</span></h3>
|
||
<p>Examples of research and decoding information on an object.
|
||
</p><p>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.
|
||
</p><p>Displaying it in the "View Report" window (View > Views > View report)
|
||
</p>
|
||
<pre># -*- 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 on Report view : Menu View > Views > report view
|
||
#
|
||
# rev:30/08/2014:29/09/2014:17/09/2015
|
||
|
||
from FreeCAD import Base
|
||
import DraftVecUtils, Draft, Part
|
||
|
||
mydoc = FreeCAD.activeDocument().Name # Name of active Document
|
||
App.Console.PrintMessage("Active docu  : "+(mydoc)+"\n")
|
||
##################################################################################
|
||
|
||
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")
|
||
##################################################################################
|
||
|
||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
|
||
App.Console.PrintMessage("sel  : "+str(sel[0])+"\n\n") # sel[0] first 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")
|
||
##################################################################################
|
||
|
||
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")
|
||
##################################################################################
|
||
|
||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
|
||
App.Console.PrintMessage("sel  : "+str(sel[0])+"\n\n") # sel[0] first object 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()
|
||
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")
|
||
##################################################################################
|
||
|
||
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")
|
||
|
||
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")
|
||
|
||
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")
|
||
##################################################################################
|
||
|
||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
|
||
surface = sel[0].Shape.Area # Area object complete
|
||
App.Console.PrintMessage("surfaceObjet  : "+str(surface)+"\n\n")
|
||
##################################################################################
|
||
|
||
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")
|
||
App.Console.PrintMessage("CenterOfMassZ  : "+str(CenterOfMass[2])+"\n\n")
|
||
##################################################################################
|
||
|
||
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")
|
||
##################################################################################
|
||
|
||
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")
|
||
##################################################################################
|
||
|
||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
|
||
boundBox_= sel[0].Shape.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
|
||
boundBoxDiag= boundBox_.DiagonalLength # Diagonal Length boundBox rectangle
|
||
|
||
App.Console.PrintMessage("boundBoxLX  : "+str(boundBoxLX)+"\n")
|
||
App.Console.PrintMessage("boundBoxLY  : "+str(boundBoxLY)+"\n")
|
||
App.Console.PrintMessage("boundBoxLZ  : "+str(boundBoxLZ)+"\n")
|
||
App.Console.PrintMessage("boundBoxDiag  : "+str(boundBoxDiag)+"\n\n")
|
||
##################################################################################
|
||
|
||
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")
|
||
##################################################################################
|
||
|
||
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")
|
||
##################################################################################
|
||
|
||
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()
|
||
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
|
||
|
||
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")
|
||
##################################################################################
|
||
|
||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
|
||
rotation = sel[0].Placement.Rotation # decode Placement Rotation
|
||
App.Console.PrintMessage("rotation  : "+str(rotation)+"\n\n")
|
||
##################################################################################
|
||
|
||
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")
|
||
##################################################################################
|
||
|
||
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")
|
||
##################################################################################
|
||
|
||
sel = FreeCADGui.Selection.getSelection() # select object with getSelection()
|
||
Rot_0 = sel[0].Placement.Rotation.Q[0] # decode Placement Rotation 0
|
||
App.Console.PrintMessage("Rot_0  : "+str(Rot_0)+ " rad , "+str(180 * Rot_0 / 3.1416)+" deg "+"\n")
|
||
|
||
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")
|
||
|
||
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")
|
||
|
||
Rot_3 = sel[0].Placement.Rotation.Q[3] # decode Placement Rotation 3
|
||
App.Console.PrintMessage("Rot_3  : "+str(Rot_3)+"\n\n")
|
||
################################################################################## </pre>
|
||
<h3><span class="mw-headline" id="Manual_search_of_an_element_with_label">Manual search of an element with label</span></h3>
|
||
<pre># Extract the coordinate X,Y,Z and Angle giving the label
|
||
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")
|
||
################################################################################## </pre>
|
||
<p><b>PS:</b> Usually the angles are given in Radian to convert :
|
||
</p>
|
||
<ol><li>angle in Degrees to Radians :
|
||
<ul><li>Angle in radian = <b>pi * (angle in degree) / 180</b></li>
|
||
<li>Angle in radian = math.radians(angle in degree)</li></ul></li>
|
||
<li>angle in Radians to Degrees :
|
||
<ul><li>Angle in degree = <b>180 * (angle in radian) / pi</b></li>
|
||
<li>Angle in degree = math.degrees(angle in radian)</li></ul></li></ol>
|
||
<h3><span class="mw-headline" id="Cartesian_coordinates">Cartesian coordinates</span></h3>
|
||
<p>This code displays the Cartesian coordinates of the selected item.
|
||
</p><p>Change the value of "numberOfPoints" if you want a different number of points (precision)
|
||
</p>
|
||
<pre>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 </pre>
|
||
<p>Other method display on "Int" and "Float"
|
||
</p>
|
||
<pre>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" </pre>
|
||
<h3><span class="mw-headline" id="Select_all_objects_in_the_document">Select all objects in the document</span></h3>
|
||
<pre>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 </pre>
|
||
<h3><span class="mw-headline" id="Selecting_a_face_of_an_object">Selecting a face of an object</span></h3>
|
||
<pre># 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) # </pre>
|
||
<h3><span class="mw-headline" id="Create_one_object_to_the_position_of_the_Camera">Create one object to the position of the Camera</span></h3>
|
||
<pre># 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 </pre>
|
||
<p>here same code simplified
|
||
</p>
|
||
<pre>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) </pre>
|
||
<h3><span class="mw-headline" id="Find_normal_vector_on_the_surface">Find normal vector on the surface</span></h3>
|
||
<p>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
|
||
</p>
|
||
<pre>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) </pre>
|
||
<h3><span class="mw-headline" id="Read_And_write_one_Expression">Read And write one Expression</span></h3>
|
||
<pre>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] </pre>
|
||
<p><br />
|
||
</p>
|
||
|
||
<div style="clear:both"></div>
|
||
</div>
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div><div class="printfooter">
|
||
Online version: "<a dir="ltr" href="https://www.freecadweb.org/wiki/index.php?title=Code_snippets/ru&oldid=289227">http://www.freecadweb.org/wiki/index.php?title=Code_snippets/ru&oldid=289227</a>"</div>
|
||
<div id="catlinks" class="catlinks" data-mw="interface"></div><div class="visualClear"></div>
|
||
</div>
|
||
</div>
|
||
<div id="mw-navigation">
|
||
<h2>Navigation menu</h2>
|
||
|
||
</body></html> |