Manual:Creating and manipulating geometry/ru: Difference between revisions

From FreeCAD Documentation
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, и что каждый из них реализует свои собственные инструменты и типы геометрии. То же самое касается работы из кода 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:

Other languages: