Manual:Creating and manipulating geometry/ru: Difference between revisions
No edit summary |
(Created page with "Иначе, базовая геометрия так же имеет функцию toShape(), которая делает то же самое:") |
||
Line 103: | Line 103: | ||
E4 = Part.Edge(C2) |
E4 = Part.Edge(C2) |
||
Иначе, базовая геометрия так же имеет функцию toShape(), которая делает то же самое: |
|||
Alternatively, base geometries also have a toShape() function that do exactly the same thing: |
|||
E1 = L1.toShape() |
E1 = L1.toShape() |
Revision as of 11:06, 17 April 2017
- Введение
- Открываем для себя FreeCAD
- Работа с FreeCAD
- Все верстаки одним взглядом
- Традиционное моделирование методом КБГ
- Традиционное двумерное черчение
- Моделирование для проектирования продукта
- Подготовка для объёмной печати
- Создание двумерных чертежей
- Моделирование BIM
- Использование электронных таблиц
- Создание анализа методом конечных элементов
- Визуализация проекта
- Написание скриптов на Python
- Сообщество
В предыдущих главах мы узнали о различных верстаках FreeCAD, и что каждый из них реализует свои собственные инструменты и типы геометрии. То же самое касается работы из кода Python.
Мы так же видели, что большинство верстаков FreeCAD зависит от находящегося в фундаменте верстака Part. Фактически, некоторые другие верстаки, Draft или Arch, делают то, что мы делаем в этой главе: используют код Python для создания и манипуляции геометрией Part.
Поэтому первая вещь, которую надо сделать для работы с геометрией Part, это импортирование модуля Part как эквивалент перехода к верстаку Part в Python:
import Part
Уделите минутку для исследования содержимого модуля Part, напечатав Part. и просмотрев предлагаемые им методы. Модуль Part предлагает некоторые общие функции, такие как makeBox, makeCircle, и так далее, которые мгновенно создают объекты для Вас. Попробуйте это, например:
Part.makeBox(3,5,7)
Когда вы после ввода строки выше нажмёте Enter, в окне трёхмерного вида ничего не появится, но в консоли Python будет напечатано нечто вроде этого:
<Solid object at 0x5f43600>
Здесь вступает в силу важная концепция. Мы создали форму Part. Это не объект документа FreeCAD (пока). Объекты и их геометрия в FreeCAD независимы. Считайте объект документа FreeCAD контейнером, который содержит форму. Параметрические объекты так же имеют параметры вроде Length и Width, и пересчитывают их форму на лету, когда один из параметров изменяется. Что мы сделали здесь - это вычислили форму вручную.
Теперь мы можем просто сделать "общий" объект документа в текущем документе (убедитесь что у Вас открыт хотя бы один новый объект), и дать ему форму куба вроде того, что мы только что сделали:
boxShape = Part.makeBox(3,5,7) myObj = FreeCAD.ActiveDocument.addObject("Part::Feature","MyNewBox") myObj.Shape = boxShape FreeCAD.ActiveDocument.recompute()
Обратите внимание на то, как мы обрабатывали myObj.Shape , мы сделали это в точности как в предыдущей главе мы меняли другие параметры объекта, такие как box.Height = 5 . Фактически, Shape это так же параметр, подобно Height. Но его тип Part Shape, а не число. В следующей главе мы рассмотрим глубже конструкцию этих параметрических объектов.
Теперь изучим наши формы Part детальнее. В конце главы о [Manual:Traditional modeling, the CSG way/ru|традиционном моделировании с помощью верстака Part] мы показали стол, показывающий как конструируются формы Part, и их различные компоненты (вершины, грани, рёбра и так далее). Точно такие же компоненты существуют и могут быть доступны через Python. Все формы Part всегда имеют следующие атрибуты: Vertexes, Edges, Wires, Faces, Shells и Solids. Все они списки, содержащие любое число элементов или пустые:
print(boxShape.Vertexes) print(boxShape.Edges) print(boxShape.Wires) print(boxShape.Faces) print(boxShape.Shells) print(boxShape.Solids)
Например, найдём площадь каждой грани нашей формы куба:
for f in boxShape.Faces: print(f.Area)
Или, для каждого ребра, начальную и конечную точку:
for e in boxShape.Edges: print("New edge") print("Start point:") print(e.Vertexes[0].Point) print("End point:") print(e.Vertexes[1].Point)
Как Вы видите, если boxShape имеет атрибут "Vertexes", каждый Edge в boxShape так же имеет атрибут "Vertexes". Как мы можем ожидать, у boxShape будет 8 вершин, когда ребро имеет 2, которые включены в число этих восьми.
Мы всегда можем проверить, каков тип формы:
print(boxShape.ShapeType) print(boxShape.Faces[0].ShapeType) print (boxShape.Vertexes[2].ShapeType)
Так что возобновим полную диаграмму Part Shapes: всё начинается с вершин (Vertice). С одной или двумя вершинами (окружность имеет только одну вершину) формируется ребро (Edge). С несколькими рёбрами формируется ломаная (Wire). С одной или несколькими замкнутыми ломаными формируется грань (Face) (дополнительные ломаные образуют в грани "отверстия"). Несколько граней создают оболочку (Shell). Когда оболочка замкнута (водонепроницаемо), из неё можно создать тело (Solid). И в конце можно соединить несколько форм (Shape) различных видов, это называется соединение (Compound).
Теперь мы попробуем создать сложные формы с нуля, конструируя все их компоненты один за другим. Например, попробуем создать объём вроде этого:
Начнём с создания плоской формы вроде этой:
Сначала создадим четыре базовые точки:
V1 = FreeCAD.Vector(0,10,0) V2 = FreeCAD.Vector(30,10,0) V3 = FreeCAD.Vector(30,-10,0) V4 = FreeCAD.Vector(0,-10,0)
Затем создадим два линейных сегмента
L1 = Part.Line(V1,V2) L2 = Part.Line(V4,V3)
Заметили, что нам не надо создавать Vertices? Мы можем сразу создать Part.Lines из FreeCAD Vectors, потому, что у нес ещё не созданы Edges. Part.Line (как и Part.Circle, Part.Arc, Part.Ellipse или Part.BSpline) создают не Edge, а базовую геометрию, на которой будут созданы Edge. Edges всегда делаются из такой базовой геометрии, сохраняемой в её атрибуте Curve. Так что если у Вас есть Edge, команда:
print(Edge.Curve)
покажет Вам, какого типа этот Edge, базируется ли он на линии, дуге или ещё чем... Но вернёмся к нашему примеру, и свяжем сегменты дуги. Для этого нам нужна третья точка, поэтому мы можем использовать подходящий Part.Arc, у которого 3 точки:
VC1 = FreeCAD.Vector(-10,0,0) C1 = Part.Arc(V1,VC1,V4) VC2 = FreeCAD.Vector(40,0,0) C2 = Part.Arc(V2,VC2,V3)
Теперь у нас 2 линии (L1 и L2) и 2 дуги (C1 и C2). Их надо превратить в ребро (Edge):
E1 = Part.Edge(L1) E2 = Part.Edge(L2) E3 = Part.Edge(C1) E4 = Part.Edge(C2)
Иначе, базовая геометрия так же имеет функцию toShape(), которая делает то же самое:
E1 = L1.toShape() E2 = L2.toShape() ...
Once we have a series of Edges, we can now form a Wire, by giving it a list of Edges. We do need to take care of the order.
W = Part.Wire([E1,E4,E2,E3])
And we can check if our Wire was correctly understood, and that it is correctly closed:
print( W.isClosed() )
Which will print "True" or "False". In order to make a Face, we need closed Wires, so it is always a good idea to check that before creating the Face. Now we can create a Face, by giving it a single Wire (or a list of Wires if we had holes):
F = Part.Face(W)
Then we extrude it:
P = F.extrude(FreeCAD.Vector(0,0,10))
Note that P is already a Solid:
print(P.ShapeType)
Because when extruding a single Face, we always get a Solid. This wouldn't be the case, for example, if we had extruded the Wire instead:
S = W.extrude(FreeCAD.Vector(0,0,10)) print(s.ShapeType)
Which will of course give us a hollow shell, with the top and bottom faces missing.
Now that we have our final Shape, we are anxious to see it on screen! So let's create a generic object, and attribute it our new Solid:
myObj2 = FreeCAD.ActiveDocument.addObject("Part::Feature","My_Strange_Solid") myObj2.Shape = P FreeCAD.ActiveDocument.recompute()
Alternatively, the Part module also provides a shortcut that does the above operation quicker (but you cannot choose the name of the object):
Part.show(P)
All of the above, and much more, is explained in detail on the Part Scripting page, together with examples.
Read more: