pythonOCC устанавливает единицы измерения по умолчанию в дюймы - PullRequest
0 голосов
/ 25 мая 2018

ПОЖАЛУЙСТА, СМОТРИТЕ РЕДАКТИРОВАТЬ ДЛЯ КРАТКОЙ ВЕРСИИ

Для этого я изучил документацию по pythonOCC.

У меня есть файл .step в дюймах.Вот строки в файле .step для подтверждения:

#50 =  ( CONVERSION_BASED_UNIT( 'INCH', #122 )LENGTH_UNIT(  )NAMED_UNIT( #125 ) );
#51 =  ( NAMED_UNIT( #127 )PLANE_ANGLE_UNIT(  )SI_UNIT( $, .RADIAN. ) );
#52 =  ( NAMED_UNIT( #127 )SI_UNIT( $, .STERADIAN. )SOLID_ANGLE_UNIT(  ) );
~~~
#122 = LENGTH_MEASURE_WITH_UNIT( LENGTH_MEASURE( 25.4000000000000 ), #267 );

Файл читает и отображает в окне: Display window

Когда я использую ручные координаты, чтобы сделатьограничивающий прямоугольник, я считаю, что мой прямоугольник выключен:

Tiny Bounding Box!

Положение выключено, поскольку модель STEP не имеет 0,0,0.

Оказывается, pythonOCC автоматически конвертирует все в MM.Когда я вручную ввожу размеры в поле в ДЮЙМАХ, они читаются как ММ.Я пытался справиться с этим, конвертируя все тоже вручную (в дюймах * 25,4), но это проблематично и уродливо.

Я знаю, что pythonOCC использует в качестве коэффициента конвертации строку # 122 файла STEP, поскольку я изменил ее свыше, чтобы:

#122 = LENGTH_MEASURE_WITH_UNIT( LENGTH_MEASURE( 1.0 ), #267 );

Когда я это сделаю, моя ограничительная рамка и пошаговая модель будут идеально совмещены ... Но я все еще знаю, что PythonOCC считает, что конвертируется в MM.

Perfect!... but in MM

У кого-нибудь есть опыт изменения единиц по умолчанию для pythonocc?Я пытался найти в следующих пакетах occ: OCC.STEPControl, OCC.Display, OCC.AIS и многие другие.

EDIT:

Когда я рисую свою коробку, используя свои собственные координатывот так:

minPoint = gp_Pnt(minCoords)
maxPoint = gp_Pnt(maxCoords)
my_box = AIS_Shape(BRepPrimAPI_MakeBox(minPoint, maxPoint).Shape())
display.Context.Display(my_box.GetHandle())

Мои координаты в дюймах, но pythonOCC читает их как MM.Если бы я мог получить свои собственные координаты для чтения в дюймах, это было бы решено.Не могу найти ничего в OCC. Отображение того, как мои координаты интерпретируются.Что-то вроде "OCC.Display. inputUnitsAre (" INCHES ") "?

РЕДАКТИРОВАТЬ 2:

Приближаясь, смотрите здесь:

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

Под UnitsAPI_SystemUnits и SetCurrentUnit ... Хотя я пока не уверен, как реализовать в python для тестирования.Работаю над этим.

1 Ответ

0 голосов
/ 25 мая 2018

Вы найдете документацию для units here

. Посмотрите на модуль OCC.Extended.DataExchange, вы увидите следующую функцию:

def write_step_file(a_shape, filename, application_protocol="AP203"):
    """ exports a shape to a STEP file
    a_shape: the topods_shape to export (a compound, a solid etc.)
    filename: the filename
    application protocol: "AP203" or "AP214"
    """
    # a few checks
    assert not a_shape.IsNull()
    assert application_protocol in ["AP203", "AP214IS"]
    if os.path.isfile(filename):
        print("Warning: %s file already exists and will be replaced" % filename)
    # creates and initialise the step exporter
    step_writer = STEPControl_Writer()
    Interface_Static_SetCVal("write.step.schema", "AP203")

    # transfer shapes and write file
    step_writer.Transfer(a_shape, STEPControl_AsIs)
    status = step_writer.Write(filename)

    assert status == IFSelect_RetDone
    assert os.path.isfile(filename)

По умолчанию OCC записывает единицы измерения в миллиметрах, поэтому мне любопытно, какая функция / метод использовалась для экспорта файла STEP.

Interface_Static_SetCVal("Interface_Static_SetCVal("write.step.unit","MM")

Документы, хотя и утверждают, что эти методы Defines a unit in which the STEP file should be written. If set to unit other than MM, the model is converted to these units during the translation., поэтому необходимость явной установки этого устройства является неожиданной.

...