Координаты блоков в dxf файле

Автор Тема: Координаты блоков в dxf файле  (Прочитано 2799 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн IharАвтор темы

  • ADN OPEN
  • Сообщений: 18
  • Карма: 2
Приветствую! Есть чертёж dwg, блоки в котром созланы при помощи какого-то неизвестного мне плагина. Задача распарсить dxf файл, созданный из этого проекта.

В блоках задан extrusion direction, поэтому при парсинге применяю транспормацию, чтобы спроецировать координаты на WCS. Однако, некоторые болоки имеют отрицательные координаты, и нужно применять трансформацию поворота на 180. Проблема в том, что если пользователь в проекте задаст такому блоку вручную поворот 0, то в dxf всё равно экспартируются отрицательные координаты, но не будет возможности определить, нужно ли применять поворот.

Я пробовал загружать dxf в онлайн просмотрщики, там всё корректно, значит все данные для чтения есть в dxf, но я не могу их найти. В блоках нет дополнительных данных (XData). Прошу помочь. Спасибо.

пример двух блоков, которые в проекте находятся рядом, но в dxf координаты сильно отличаются:

Цитировать
INSERT
  5
2373
330
22CF
100
AcDbEntity
  8
PVcase PV Modules (full frames)
 62
   144
420
    31909
100
AcDbBlockReference
  2
tracker_Polar3str_27-1_vsun_545W
 10
-728277.4518200205
 20
-1637328.460656199
 30
27037.59836921752
210
0.0
220
0.0163012101279391
230
0.9998671264464917
  0
INSERT
  5
241B
330
22CF
100
AcDbEntity
  8
PVcase PV Modules (full frames)
 62
   144
420
    31909
100
AcDbBlockReference
  2
tracker_Polar3str_27-1_vsun_545W
 10
728266.3538200205
 20
1637700.246742568
 30
22970.76064187255
210
0.0
220
0.013818207801289
230
0.9999045240087479
  0
ENDBLK

вот код, которым пробую определить координаты блока:
Код - Javascript [Выбрать]
  1.   function transformDxfPointToWCS(point:DxfCoordinate3d, localNormal: DxfCoordinate3d, rotation:number): Vector3 {
  2.  
  3.     let localPoint = new Vector3(
  4.         point.x,
  5.         point.y,
  6.         point.z
  7.     );
  8.  
  9.     const N = new Vector3(localNormal.x, localNormal.y, localNormal.z);
  10.  
  11.     if(N.x===0 && N.y===0 && N.z===1){
  12.         return localPoint;
  13.     }
  14.  
  15.     const zAxis = N.clone().normalize();
  16.  
  17.     const arbitraryVector = new Vector3(1, 0, 0);
  18.     let xAxis = arbitraryVector
  19.         .clone()
  20.         .sub(zAxis.clone().multiplyScalar(arbitraryVector.dot(zAxis)))
  21.         .normalize();
  22.  
  23.     const yAxis = Vector3.crossVectors(zAxis, xAxis).normalize();
  24.  
  25.     const basisMatrix = new Matrix4().makeBasis(xAxis, yAxis, zAxis);
  26.  
  27.     const rotationMatrix = new Matrix4().makeRotationZ(rotation);
  28.    
  29.     const resultMatrix = new Matrix4().multiplyMatrices(basisMatrix, rotationMatrix,);
  30.    
  31.     const projectedPoint = localPoint.clone().applyMatrix4(resultMatrix);
  32.  
  33.     return projectedPoint;
  34.   }
  35.  

В проекте всё находится рядом:


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13872
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Координаты блоков в dxf файле
« Ответ #1 : 25-05-2024, 12:19:30 »
чтобы спроецировать координаты на WCS.
Координаты уже в WCS. Группы 10,20,30 определяют точку вставки в WCS, группы 210, 220, 230 определяют направление нормали (или extrusion direction). Про поворот вообще ничего не понял. Если есть поворот, то поворот осуществляется относительно направления нормали из точки вставки блока.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн IharАвтор темы

  • ADN OPEN
  • Сообщений: 18
  • Карма: 2
Re: Координаты блоков в dxf файле
« Ответ #2 : 25-05-2024, 13:40:11 »
В dxf у блоков нету кода 50, который определяет поворот. но координаты у блоков (x = -728277.4... y=-1637328.4...) и (x2 =728266.3... y2=1637700.2...), то есть вобще принадлежат противоположным квадрантам, хотя в проекте они находятся рядом. Коды 210, 220, 230 у них отличаются, но не сильно, не настолько, чтобы компенсировать такую разницу. Возможно ли, что где-то ещё в dxf могут быть данные о трансформации?

Я загружаю этот самый файл в просмотрщик и вижу, что он корректо его прочитал



Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13872
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Координаты блоков в dxf файле
« Ответ #3 : 25-05-2024, 13:49:35 »
Нужно смотреть не только вставку блока (INSERT) но и соответствующий блок (BLOCK)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн IharАвтор темы

  • ADN OPEN
  • Сообщений: 18
  • Карма: 2
Re: Координаты блоков в dxf файле
« Ответ #4 : 25-05-2024, 15:19:42 »
вот соответствующие данные, но я и там не нашёл, где эта трансформация могла бы быть(

Код - Auto/Visual Lisp [Выбрать]
  1. BLOCK_RECORD
  2.   5
  3. 2374
  4. 330
  5. 1
  6. 100
  7. AcDbSymbolTableRecord
  8. 100
  9. AcDbBlockTableRecord
  10.   2
  11. tracker_Polar3str_27-1_vsun_545W
  12. 340
  13. 0
  14. 102
  15. {BLKREFS
  16. 331
  17. 2373
  18. 331
  19. 241B
  20. 102
  21. }
  22.  70
  23.      0
  24. 280
  25.      1
  26. 281
  27.      0
  28.   0
  29.  
  30.  


Код - Auto/Visual Lisp [Выбрать]
  1. BLOCK
  2.   5
  3. 2375
  4. 330
  5. 2374
  6. 100
  7. AcDbEntity
  8.   8
  9. 0
  10. 100
  11. AcDbBlockBegin
  12.   2
  13. tracker_Polar3str_27-1_vsun_545W
  14.  70
  15.      2
  16.  10
  17. 0.0
  18.  20
  19. 0.0
  20.  30
  21. 0.0
  22.   3
  23. tracker_Polar3str_27-1_vsun_545W
  24.   1
  25.  
  26.   0
  27.  

Отмечено как Решение Ihar 27-05-2024, 12:07:45

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13872
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Координаты блоков в dxf файле
« Ответ #5 : 25-05-2024, 16:07:05 »
Коды 210, 220, 230 у них отличаются, но не сильно, не настолько, чтобы компенсировать такую разницу
Как раз настолько. Поищи Arbitrary algorithm в AutoCAD.
https://help.autodesk.com/view/ACD/2024/ENU/?guid=GUID-E19E5B42-0CC7-4EBA-B29F-5E1D595149EE
Обрати внимание, что 1/64 (0.015625) больше чем 0.013818207801289 (это для второй вставки блока), но меньше чем 0.0163012101279391 (это для первой вставки блока). Соответственно меняются оси Ax и Ay.
« Последнее редактирование: 25-05-2024, 22:29:13 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн IharАвтор темы

  • ADN OPEN
  • Сообщений: 18
  • Карма: 2
Re: Координаты блоков в dxf файле
« Ответ #6 : 27-05-2024, 12:08:31 »
Благодарю, сработало!