#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 я делаю это таким образом:
- Начальная матрица
M0
= матрица преобразования OCS, включая масштабирование по осям x, y и z; то же, что матрица преобразования OCS * матрица масштабирования - матрица вращения
M1
относительно вектора выдавливания - матрица преобразования
M
=M0
*M1
- добавление перевода в
insert
точку- преобразуйте
insert
точку из OCS в WCS - преобразуйте
block_base_point
по текущей матрицеM
без перевода, текущее состояниеM
еще не имеет перевода, поэтому полное преобразование не будет проблемой, но преобразование «только в направлении» выполняется быстрее в моем коде - вычтите
block_base_point
изinsert
точки - установите последнюю строку
M
в(insert.x, insert.y, insert.z, 1)
, если строка в основном порядке, последний столбец, если столбец в основном порядке, что в основномM
является * матрицей перевода
- преобразуйте
Масштабирование единиц измерения можно игнорировать, приложение САПР должно установить правильные значения масштабирования, чтобы соответствовать родительским единицам компоновки и ссылочным единицам блока в атрибутах 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, вам не нужно самостоятельно выполнять масштабирование для преобразования единиц измерения.