Принципиальное недопонимание перевода и ротации в PythonOCC (OpenCascade) - PullRequest
0 голосов
/ 30 мая 2018

Может быть, это поможет другим, пытающимся учиться через руководства / документацию / stackoverflow.

Как я могу вращать или переводить TopoDS_Shape (или любой объект), предоставляя координаты, углы и оси?Например: если моя часть на (5.0, 1.0, 0.0), могу ли я переместить ее на (0.0, 0.0, 0.0)?Или сделать это в новом направлении?

Попытки методов (не считая того, что я считаю неважным кодом).Я попытался включить некоторые вещи, на которые я потратил большую часть своего времени.Не могу вспомнить все другие попытки, которые я предпринял.Может быть, кто-то, имеющий опыт работы с PythonOCC или OpenCascade, может увидеть, в чем я ошибаюсь.

display, start_display, add_menu, add_function_to_menu = init_display()

aResShape = openFile.open(fileToOpen) #RETURNS SHAPE FROM STEP FILE

aResShape.Orientable(True)

#EXAMPLE
aResShape.Location().Transformation().SetRotation(gp_Quaternion(1., 1., 0., 1.))

#EXAMPLE
aResShape.Location().Transformation().SetTransformation(a,b)

#EXAMPLE
aResShape.Move(TopLoc_Location(gp_Trsf( gp_Trsf2d(1., 0.) )))

#EXAMPLE
aResShape.Reverse()

#EXAMPLE
p1 = gp_Pnt(700., 10., 80.)
d1 = gp_Dir(50., 50., 60.)
a = gp_Ax3(p1, d1)

p2 = gp_Pnt(2., 3., 4.)
d2 = gp_Dir(4., 5., 6.)
b = gp_Ax3(p2, d2)
print(aResShape.Location().Transformation().Transforms())
aResShape.Location().Transformation().SetTransformation(a,b)
print(aResShape.Location().Transformation().Transforms()) #RETURNS SAME VALUES

#EXAMPLE (TRYING TO SEE WHAT WORKS)
transform = gp_Trsf
transform.SetRotation(
    gp_Ax1(
        gp_Pnt(0.,0.,0.),
        gp_Dir(0.,0.,1.)
    ),
    1.570796
)
print(transform)


display.DisplayShape(aResShape, color='Black', update=True)
display.FitAll()
display.SetModeWireFrame()
start_display()

Иногда я получаю такие ошибки:

NotImplementedError: Wrong number or type of arguments for overloaded function 'new_gp_Trsf2d'.
  Possible C/C++ prototypes are:
    gp_Trsf2d::gp_Trsf2d()
    gp_Trsf2d::gp_Trsf2d(gp_Trsf const &)

Но большую часть времени я получаюничего, и форма не меняется на дисплее.

Провел здесь дней: https://cdn.rawgit.com/tpaviot/pythonocc-core/804f7f3/doc/apidoc/0.18.1/index.html

https://dev.opencascade.org/doc/refman/html/index.html

https://github.com/tpaviot/pythonocc-demos/tree/master/examples

Поэтому я знаю, какие функции передать, я думаю, но ничего не получается.

Может быть, на дисплее просто не отображаются изменения, которые на самом деле происходят?

Я задал другой вопрос PythonOCCранее ( pythonOCC установил единицы измерения по умолчанию в дюймы ), но я думаю, что на самом деле мне просто не хватает чего-то базового.

Может кто-нибудь подумать, почему мне не удается внести какие-либо реальные изменения?Спасибо за ваше время!

1 Ответ

0 голосов
/ 17 ноября 2018

Я использовал Open Cascade с C ++, а BRepBuilderAPI_Transform(const TopoDS_Shape &S, const gp_Trsf &T, const Standard_Boolean Copy=Standard_False) выполняет преобразование.Смотрите: https://www.opencascade.com/doc/occt-6.9.1/refman/html/class_b_rep_builder_a_p_i___transform.html

Вот как я это использовал:

gp_Trsf trsf;
trsf.SetTransformation(gp_Quaternion(gp_Mat(gp_XYZ(d.x1, d.y1, d.z1), gp_XYZ(d.x2, d.y2, d.z2), gp_XYZ(d.x1, d.y1, d.z1).Crossed(gp_XYZ(d.x2, d.y2, d.z2)))), gp_Vec(d.x, d.y, d.z));                               
*d.shape = BRepBuilderAPI_Transform(*d.shape, trsf, true);
...