Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Ihar от 25-05-2024, 11:59:04

Название: Координаты блоков в dxf файле
Отправлено: Ihar от 25-05-2024, 11:59:04
Приветствую! Есть чертёж 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.  

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

(https://i.ibb.co/x8wsn3z/image.png) (https://ibb.co/gFQ706t)
Название: Re: Координаты блоков в dxf файле
Отправлено: Александр Ривилис от 25-05-2024, 12:19:30
чтобы спроецировать координаты на WCS.
Координаты уже в WCS. Группы 10,20,30 определяют точку вставки в WCS, группы 210, 220, 230 определяют направление нормали (или extrusion direction). Про поворот вообще ничего не понял. Если есть поворот, то поворот осуществляется относительно направления нормали из точки вставки блока.
Название: Re: Координаты блоков в dxf файле
Отправлено: Ihar от 25-05-2024, 13:40:11
В dxf у блоков нету кода 50, который определяет поворот. но координаты у блоков (x = -728277.4... y=-1637328.4...) и (x2 =728266.3... y2=1637700.2...), то есть вобще принадлежат противоположным квадрантам, хотя в проекте они находятся рядом. Коды 210, 220, 230 у них отличаются, но не сильно, не настолько, чтобы компенсировать такую разницу. Возможно ли, что где-то ещё в dxf могут быть данные о трансформации?

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

(https://i.postimg.cc/xq904Hmw/image.png) (https://postimg.cc/xq904Hmw)
Название: Re: Координаты блоков в dxf файле
Отправлено: Александр Ривилис от 25-05-2024, 13:49:35
Нужно смотреть не только вставку блока (INSERT) но и соответствующий блок (BLOCK)
Название: Re: Координаты блоков в dxf файле
Отправлено: Ihar от 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.  
Название: Re: Координаты блоков в dxf файле
Отправлено: Александр Ривилис от 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.
Название: Re: Координаты блоков в dxf файле
Отправлено: Ihar от 27-05-2024, 12:08:31
Благодарю, сработало!