Manual:Creating and manipulating geometry/ru

В предыдущих главах мы узнали о различных верстаках 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 будет напечатано нечто вроде этого:



Здесь вступает в силу важная концепция. Мы создали форму 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, потому, что у нес ещё не созданы рёбра (Edge). Part.Line (как и Part.Circle, Part.Arc, Part.Ellipse или Part.BSpline) создают не ребро (Edge), а базовую геометрию, на которой будут созданы рёбра. Рёбра всегда делаются из такой базовой геометрии, сохраняемой в её атрибуте 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:


 * Верстак Part
 * Написание скриптов обработки топологии