Моя конечная цель такова:
У меня есть огромный набор данных из точек, представляющий, как часть будет печататься трехслойно. Мне нужно создать линию через эти точки и выдавить круг вдоль этой линии (так что перестройте часть, как она будет напечатана позже).
Сначала я попытался сделать сплайн, однако он пытается создать плавную линию и не следует за точками. Я попытался изменить параметры minDeg и maxDeg, но это все равно не помогло создать фактическую кривую, в которой я нуждаюсь.
Посмотрите этот результат для сплайна
См. здесь фактический путь (вышеупомянутый сплайн - одна из частей заполнения)
Итак, я попытался создать сплайн между двумя точками за раз, а затем, создав провод, добавьте их все вместе. Это выглядит многообещающим, так как теперь я получаю реальные острые углы и линии, проходящие через точные точки. Однако теперь, когда я пытаюсь выдавить его, нормаль экструдированного профиля не изменяется с углом провода.
Это то, что происходит с последней вещью, которую я пробовал.
Я провел последние 4 дня по этой проблеме, пробовал много форумов и вопросов, но чувствовал себя полностью потерянным в мире pythonocc (opencascade).
Мой код выглядит следующим образом:
from __future__ import print_function
from OCC.gp import gp_Pnt, gp_Ax2, gp_Dir, gp_Circ
from OCC.GeomAPI import GeomAPI_PointsToBSpline
from OCC.TColgp import TColgp_Array1OfPnt
from OCC.BRepBuilderAPI import BRepBuilderAPI_MakeEdge,
BRepBuilderAPI_MakeWire, BRepBuilderAPI_MakeFace
from OCC.BRepOffsetAPI import BRepOffsetAPI_MakePipe
from OCC.Display.SimpleGui import init_display
display, start_display, add_menu, add_function_to_menu = init_display()
def pipe():
# the bspline path, must be a wire
# This will later be in a for loop but this is merely to validate the method
using three different points.
array = TColgp_Array1OfPnt(1,2)
makeWire = BRepBuilderAPI_MakeWire()
point1 = gp_Pnt(0,0,0)
point2 = gp_Pnt(0,0,1)
array.SetValue(1, point1)
array.SetValue(2, point2)
spline = GeomAPI_PointsToBSpline(array).Curve()
edge = BRepBuilderAPI_MakeEdge(spline).Edge()
makeWire.Add(edge)
point1 = gp_Pnt(0, 0, 1)
point2 = gp_Pnt(0, 1, 2)
array.SetValue(1, point1)
array.SetValue(2, point2)
spline = GeomAPI_PointsToBSpline(array).Curve()
edge = BRepBuilderAPI_MakeEdge(spline).Edge()
makeWire.Add(edge)
point1 = gp_Pnt(0, 1, 2)
point2 = gp_Pnt(0, 2, 2)
array.SetValue(1, point1)
array.SetValue(2, point2)
spline = GeomAPI_PointsToBSpline(array).Curve()
edge = BRepBuilderAPI_MakeEdge(spline).Edge()
makeWire.Add(edge)
makeWire.Build()
wire = makeWire.Wire()
# the bspline profile. Profile mist be a wire/face
point = gp_Pnt(0,0,0)
dir = gp_Dir(0,0,1)
circle = gp_Circ(gp_Ax2(point,dir), 0.2)
profile_edge = BRepBuilderAPI_MakeEdge(circle).Edge()
profile_wire = BRepBuilderAPI_MakeWire(profile_edge).Wire()
profile_face = BRepBuilderAPI_MakeFace(profile_wire).Face()
# pipe
pipe = BRepOffsetAPI_MakePipe(wire, profile_face).Shape()
display.DisplayShape(profile_edge, update=False)
display.DisplayShape(wire, update=True)
display.DisplayShape(pipe, update=True)
if __name__ == '__main__':
pipe()
start_display()