Импортер DXF, не уверен, в каком порядке выполнять преобразования, как обрабатывать единицы измерения и базовую точку блока?

#parsing #transformation #dxf #data-importer

#синтаксический анализ #трансформация #dxf #импортер данных

Вопрос:

Я внедряю импортер DXF, на данный момент я принимаю во внимание HEADER раздел и только одну переменную из него INSUNITS , TABLES раздел только одну таблицу BLOCK_RECORD таблица, BLOCKS раздел, ENTITIES раздел ( INSERT , LINE , LWPOLYLINE , ARC , CIRCLE ).

При импорте я не знаю, нужно ли мне учитывать единицы измерения, и если нужно, я не знаю, как именно это учитывать. Сейчас мой файл импортируется неправильно, скорее всего, из-за этих единиц измерения, поскольку я думаю, что я правильно выполняю свои INSERT преобразования:

 EXTRUSIONDIRECTIONTRANSFORMATION * 
     INSERTIONPOINTTRANSLATION * 
     ROTATION * SCALING * BASEPOINTTRANSLATION
 

Импортируемый файл импортируется правильным образом, когда я удаляю его BASEPOINTTRANSLATION , но некоторые другие файлы импортируются неправильно, и некоторые части чертежа импортируются очень далеко от остальных.

Мне кажется, что базовая точка блока находится в дюймах, и когда я конвертирую ее в метры, это становится немного лучше. Итак, если кто-нибудь знает, в каком порядке я должен выполнять преобразования и как обрабатывать единицы измерения в файлах DXF, я был бы очень благодарен, поскольку я застрял сейчас.

Комментарии:

1. Я мог бы попытаться найти свою старую базу кода, чтобы посмотреть, как я это сделал, или вы могли бы сделать то, что я сделал: создать множество крошечных примеров, сначала без преобразований, затем один компонент, затем два и так Далее, Чтобы выяснить, как получить результаты, идентичные AutoCAD.

2. Я это уже делал, так что в основном я посмотрел на программу, которая, кажется, делает это правильно, сделал несколько образцов и произвел преобразования в соответствии с этим, но затем, когда я использую что-то, сделанное в Autocad, у меня возникает проблема, что преобразование базовой точки сдвигает все очень далеко, поэтому я подозревал, что в этом что-то есть.что касается единиц измерения, и в ссылке DXF единицы измерения не были объяснены очень интуитивно понятным способом, если бы вы могли, пожалуйста, пришлите мне кодовую базу. На самом деле я просмотрел довольно много кодовых баз, и все делают это по-разному. И программа, которую я знаю, делает это правильно, не является открытым исходным кодом.

Ответ №1:

В ezdxf пакете Python я делаю это таким образом:

  1. Начальная матрица M0 = матрица преобразования OCS, включая масштабирование по осям x, y и z; то же, что матрица преобразования OCS * матрица масштабирования
  2. матрица вращения M1 относительно вектора выдавливания
  3. матрица преобразования M = M0 * M1
  4. добавление перевода в insert точку
    • преобразуйте insert точку из OCS в WCS
    • преобразуйте block_base_point по текущей матрице M без перевода, текущее состояние M еще не имеет перевода, поэтому полное преобразование не будет проблемой, но преобразование «только в направлении» выполняется быстрее в моем коде
    • вычтите block_base_point из insert точки
    • установите последнюю строку M в (insert.x, insert.y, insert.z, 1) , если строка в основном порядке, последний столбец, если столбец в основном порядке, что в основном M является * матрицей перевода

код Python на github

Масштабирование единиц измерения можно игнорировать, приложение САПР должно установить правильные значения масштабирования, чтобы соответствовать родительским единицам компоновки и ссылочным единицам блока в атрибутах INSERT масштабирования. Например. если вы вставляете блок с миллиметровыми единицами в пространство модели с m-единицами, значения масштабирования INSERT объекта должны быть0,001 для преобразования миллиметров в метры (1 мм = 0,001м).

Комментарии:

1. Спасибо, похоже, у меня уже был правильный порядок преобразований, я просто сделал это по-другому. Когда я импортирую файл, он по-прежнему импортируется неправильно. Я импортирую это в средство просмотра 3D, которое может принимать несколько файлов DXF и OBJ и иметь их в одном мире, это средство просмотра ожидает координаты в метрах. Каждое определение блока имеет связанную запись блока, и каждая вставка имеет связанную запись блока, я просто выполняю преобразования из единиц измерения внутри записи блока блоков в единицы измерения внутри записи блока вставок и затем продолжаю это делать? Затем перевести в метры?

2. Как я уже говорил в последнем абзаце моего ответа, правильное масштабирование должно быть установлено в объекте INSERT приложением CAD, создавшим файл DXF. Связанная запись BLOCK_RECORD в БЛОКЕ и объект ВСТАВКИ (тег 330) является владельцем объекта и центральной структурой DXF. Каждый макет (пространство модели, пространство бумаги, макет блока) требует и имеет такую BLOCK_RECORD , эта BLOCK_RECORD является владельцем всех объектов в макете. Если вам действительно нужно преобразовать единицы измерения, его из единиц BLOCK_RECORD БЛОКА в единицы BLOCK_RECORD ВСТАВКИ.

3. И что, если я конвертирую из unitless в дюймы или дюймы в unitless, в этом случае, что должен делать мой коэффициент масштабирования? У меня есть образец, в котором каждая BLOCK_RECORD имеет единицы измерения, а переменная заголовка INSUNITS имеет единицы измерения в дюймах. Кроме того, если я не должен касаться преобразования, которое вы указали при выполнении этого преобразования единиц измерения, просто добавьте к части масштабирования коэффициент преобразования или я должен также сделать что-то еще с коэффициентом преобразования, прямо сейчас я умножаю его на xfactor, yfactor и zfactor объекта INSERT. Извините за вопросы, но ссылка на DXF действительно плохая.

4. Вы не можете преобразовать из unitless в любую единицу измерения, не зная исходной единицы измерения. Используйте приложение Autodesk Trueview в качестве средства просмотра DXF, чтобы сравнить результат с вашим рендерингом. Он использует механизм визуализации AutoCAD, который определяет и отображает правильную интерпретацию «стандарта» DXF, используемого Autodesk. И повторяю еще раз: для файлов формата DXF из надежных САПР, таких как AutoCAD, BricsCAD, GstarCAD или ZWCAD, вам не нужно самостоятельно выполнять масштабирование для преобразования единиц измерения.