Программирование топологических данных
Введение
Здесь мы объясним вам как управлять Модулем Деталей напрямую из интепритатора python FreeCAD, или из любого внешнего сценария. Для уверенности , просмотрите раздел Написание Сценариев и страницу Основ сценариев в FreeCAD если вам необходимо больше информации, о том как работает написание сценариев в FreeCAD.
Для первого использования функциональности модуля Деталей вы должны загрузить модуль Деталей в интепретатор:
import Part
Диаграмма Классов
Это UML обзор наиболее важных классов модуля Деталей:
Геометрия
Геометрические объекты являются строительными блоками для всех топологических объектов:
- GEOM Базовый класс геометрических объектов
- LINE Прямая линия в 3D, задается начальной и конечной точкой
- CIRCLE Окружность или дуга задается центром, начальной и конечной точкой
- ...... И вскоре еще немного ;-)
Топология
Доступны нижеследующие топологические типы данных:
- COMPOUND Группа из топологических объектов любого типа.
- COMPSOLID Составное твердое тело, как набор твердых тел соединенными гранями. Он расширяет понятие Ломаной кривой(WIRE) и оболочки(SHELL) для твердых тел.
- SOLID Часть пространства ограниченная оболочкой. Она трехмерная.
- SHELL Набор граней соединенных между собой через ребра. Оболочки могут быть открытыми или закрытыми.
- FACE В 2D это часть плоскости; в 3D это часть поверхности. Это геометрия ограничена (обрезана) по контуам. Она двухмерная.
- WIRE Набор ребер соединенных через вершины. Он может быть как открытым, так и закрытым в зависимости от того связаны ли крайние ребра или нет.
- EDGE Топологический элемент соответствующий ограниченной кривой. Ребро как правило ограничивается вершинами. Оно одномерное.
- VERTEX Топологический элемент соответствующий точке. Обладает нулевой размерность.
- SHAPE общий термин охватывающий все выше сказанное.
Создание базовых типов
Краткое описание
Вы легко можете создать базовый топологический объект с помощью методов "make...()" содержащихся в модуле Деталей:
b = Part.makeBox(100,100,100) Part.show(b)
Куча других доступных make...() методов:
- makeBox(l,w,h,[p,d]) -- Создает коробку расположенную в точке p и в указанном направлении d с размерами (l,w,h). По умолчанию p установлен как Vector(0,0,0) и d установлен как Vector(0,0,1)
- makeCircle(radius,[p,d,angle1,angle2]) -- Создает окружность с заданным радиусом. По умолчанию p=Vector(0,0,0), d=Vector(0,0,1), angle1=0 и angle2=360
- makeCompound(list) -- Создает составное тело из списка форм
- makeCone(radius1,radius2,height,[p,d,angle]) -- Создает конус с заданным радиусами и высотой. По умолчанию p=Vector(0,0,0), d=Vector(0,0,1) и angle=360
- makeCylinder(radius,height,[p,d,angle]) -- Создает цилиндр с заданным радиусом и высотой. По умолчанию p=Vector(0,0,0), d=Vector(0,0,1) и angle=360
- makeLine((x1,y1,z1),(x2,y2,z2)) -- Создает линию проходящую через две точки
- makePlane(length,width,[p,d]) -- Создает плоскость с заданной длинной и шириной. По умолчанию p=Vector(0,0,0) и d=Vector(0,0,1)
- makePolygon(list) -- Создает многоугольник из списка точек
- makeSphere(radius,[p,d,angle1,angle2,angle3]) -- Создает сферу с заданным радиусом. По умолчанию p=Vector(0,0,0), d=Vector(0,0,1), angle1=0, angle2=90 и angle3=360
- makeTorus(radius1,radius2,[p,d,angle1,angle2,angle3]) -- Создает тор по заданными радиусамi.По умолчанию p=Vector(0,0,0), d=Vector(0,0,1), angle1=0, angle2=360 и angle3=360
Подробные объяснения
Сначала импортируем следующее:
>>> import Part >>> from FreeCAD import Base
Как создать Вершину?
>>> vertex = Part.Vertex((1,0,0))
Вершина это точка созданная в x=1,y=0,z=0 устанавливающая(задающая) объект вершины,вот так, вы можете найти её расположение:
>>> vertex.Point
Vector (1, 0, 0)
Как создать Ребро?
Ребра не что иное как линия с двумя вершинами:
>>> edge = Part.makeLine((0,0,0), (10,0,0))
>>> edge.Vertexes
[<Vertex object at 01877430>, <Vertex object at 014888E0>]
Примечание: Вы не можете создать ребро передав две вершины. Вы можете узнать длинну и центр ребра, вот так:
>>> edge.Length
10.0
>>> edge.CenterOfMass
Vector (5, 0, 0)
Как создать ломанную кривую?
Ломанная может быть создана из списка ребер или даже из списка ломаных:
>>> edge1 = Part.makeLine((0,0,0), (10,0,0))
>>> edge2 = Part.makeLine((10,0,0), (10,10,0))
>>> wire1 = Part.Wire([edge1,edge2])
>>> edge3 = Part.makeLine((10,10,0), (0,10,0))
>>> edge4 = Part.makeLine((0,10,0), (0,0,0))
>>> wire2 = Part.Wire([edge3,edge4])
>>> wire3 = Part.Wire([wire1,wire2])
>>> wire3.Edges
[<Edge object at 016695F8>, <Edge object at 0197AED8>, <Edge object at 01828B20>,
<Edge object at 0190A788>]
>>> Part.show(wire3)
Part.show(wire3) будет отображать четыре лини как квадарат:
>>> wire3.Length
40.0
>>> wire3.CenterOfMass
Vector (5, 5, 0)
>>> wire3.isClosed()
True
>>> wire2.isClosed()
False
Как создать Грань?
Действительны , только грани созданные из замкнутых ломаных. В данном примере, wire3 замкнутая ломанная,а wire2 не замкнута (смотри выше)
>>> face = Part.Face(wire3)
>>> face.Area
99.999999999999972
>>> face.CenterOfMass
Vector (5, 5, 0)
>>> face.Length
40.0
>>> face.isValid()
True
>>> sface = Part.Face(wire2)
>>> face.isValid()
False
Только грани обладают поверхностью, а не ломанные и ребра.
Как создать окружность?
circle = Part.makeCircle(radius,[center,dir_normal,angle1,angle2]) -- Создает окружность с заданным радиусом
По умолчанию, center=Vector(0,0,0), dir_normal=Vector(0,0,1), angle1=0 and angle2=360. Окружность может быть просто создана, как здесь:
>>> circle = Part.makeCircle(10)
>>> circle.Curve
Circle (Radius : 10, Position : (0, 0, 0), Direction : (0, 0, 1))
Если вы хотите создать её с определенным положением и в определенном направлении
>>> ccircle = Part.makeCircle(10, Base.Vector(10,0,0), Base.Vector(1,0,0))
>>> ccircle.Curve
Circle (Radius : 10, Position : (10, 0, 0), Direction : (1, 0, 0))
Окружность будет создана на расстоянии 10 от базовой(оригинальной) координаты х x и будет обращена в сторону оси x. Примечание: makeCircleпринимает только тип Base.Vector() в качестве позиции и нормали а не кортеж. Вы также можете создать часть окружности, задав угол начальный и конечный угол, как тут:
>>> from math import pi
>>> arc1 = Part.makeCircle(10, Base.Vector(0,0,0), Base.Vector(0,0,1), 0, 180)
>>> arc2 = Part.makeCircle(10, Base.Vector(0,0,0), Base.Vector(0,0,1), 180, 360)
Обе arc1 и arc2 вместе составляют окружность. Углы задаются в градусах, если вы хотите задать раддианами, просто преобразуйте используя формулу: degrees = radians * 180/PI или используя pythonовский math модуль (прежде, конечно, выполнив import math): degrees = math.degrees(radians)