Способы вычислить точки привязки размеров, ограничения VBA.

Автор Тема: Способы вычислить точки привязки размеров, ограничения VBA.  (Прочитано 17022 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не там искал. И вообще выведи в dxf файл только один (!!!) размер. И сразу всё станет понятно.
Вот так если только один размер (в нечетных строках - код группы, в четных строках - значение):
Код - INI [Выбрать]
  1.   0
  2. DIMENSION
  3.   5
  4. 5F85
  5. 330
  6. 264
  7. 100
  8. AcDbEntity
  9.   8
  10. 0
  11.   6
  12. Continuous
  13.  62
  14.      2
  15. 100
  16. AcDbDimension
  17.   2
  18. *D36
  19.  10
  20. 114.6429723282
  21.  20
  22. 568.0070916031
  23.  30
  24. 0.0
  25.  11
  26. 374.1467459130999
  27.  21
  28. 570.2570916031
  29.  31
  30. 0.0
  31.  70
  32.    160
  33.   1
  34. 5x5300=<>
  35.  71
  36.      2
  37.  42
  38. 26500.0
  39.  73
  40.      0
  41.  74
  42.      0
  43.  75
  44.      0
  45.   3
  46. DIMSTYLE_3
  47. 100
  48. AcDbAlignedDimension
  49.  13
  50. 644.6429723282
  51.  23
  52. 563.0070916031
  53.  33
  54. 0.0
  55.  14
  56. 114.6429723282
  57.  24
  58. 563.0070916031
  59.  34
  60. 0.0
  61.  50
  62. 180.0
  63. 100
  64. AcDbRotatedDimension
  65. 1001
  66. ACAD
  67. 1000
  68. DSTYLE
  69. 1002
  70. {
  71. 1070
  72.    173
  73. 1070
  74.      1
  75. 1070
  76.      6
  77. 1000
  78. _OBLIQUE
  79. 1070
  80.      7
  81. 1000
  82. _OBLIQUE
  83. 1002
  84. }
  85.  
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВасилийАвтор темы

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Именно так и сделал.



Именно там и не нашёл

Оффлайн ВасилийАвтор темы

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Начинаю вникать

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В твоём файле нужно анализировать только этот кусок (со строки 6919):




Код - INI [Выбрать]
  1.   0
  2. SECTION
  3.   2
  4. ENTITIES
  5.   0
  6. DIMENSION
  7.   5
  8. 3FF08
  9. 102
  10. {ACAD_XDICTIONARY
  11. 360
  12. 3FF09
  13. 102
  14. }
  15. 330
  16. 1F
  17. 100
  18. AcDbEntity
  19.   8
  20. 0 @ 1
  21. 100
  22. AcDbDimension
  23.   2
  24. *D26
  25.  10
  26. 118.0238614591198
  27.  20
  28. 182.273505014855
  29.  30
  30. 0.0
  31.  11
  32. 88.74742353919589
  33.  21
  34. 185.273505014855
  35.  31
  36. 0.0
  37.  70
  38.     32
  39.  71
  40.      5
  41.  42
  42. 58.55287583984796
  43.   3
  44. stpr
  45. 100
  46. AcDbAlignedDimension
  47.  13
  48. 59.47098561927191
  49.  23
  50. 158.4373122385585
  51.  33
  52. 0.0
  53.  14
  54. 118.0238614591198
  55.  24
  56. 166.0061503786186
  57.  34
  58. 0.0
  59. 100
  60. AcDbRotatedDimension
  61. 1001
  62. AcadAnnotative
  63. 1000
  64. AnnotativeData
  65. 1002
  66. {
  67. 1070
  68.      1
  69. 1070
  70.      0
  71. 1002
  72. }
  73. 1001
  74. ACAD
  75. 1000
  76. DSTYLE
  77. 1002
  78. {
  79. 1070
  80.     40
  81. 1040
  82. 1.0
  83. 1070
  84.    279
  85. 1070
  86.      0
  87. 1070
  88.    289
  89. 1070
  90.      3
  91. 1070
  92.    174
  93. 1070
  94.      0
  95. 1070
  96.    175
  97. 1070
  98.      0
  99. 1070
  100.    172
  101. 1070
  102.      1
  103. 1070
  104.    145
  105. 1040
  106. 1.0
  107. 1002
  108. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВасилийАвтор темы

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Вопрос сразу, как Вы определили, что это именно эта секция?
Из прочитанного по ссылкам, я понял что нужные точки это следующие коды:
For all dimension types, the following group codes represent 3D WCS points:
(10, 20, 30)
(13, 23, 33)
(14, 24, 34)
(15, 25, 35)
Они встречаются после "*D" имени блока размера, если парсинг организовывать,
сначало ищу имя "*D" потом смотрю известные группы. Теперь задача как отделить
что это именно повёрнутый размер, потому что из анализируемого  кода не понятно

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вопрос сразу, как Вы определили, что это именно эта секция?
Потому что в этой секции содержатся примитивы (ENTITIES).
Примитив размера любого начинается с
Код - INI [Выбрать]
  1.   0
  2. DIMENSION
После этого ты сканируешь до следующей группы 100. Если это
Код - INI [Выбрать]
  1. 100
  2. AcDbAlignedDimension
то это повернутый размер. Ну и дальше смотришь группы с точками.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВасилийАвтор темы

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Единственное парсинг из 600000 строк не уложит до фатала?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Единственное парсинг из 600000 строк не уложит до фатала?
Кто тебя заставляет сканировать весь чертеж??? Я уже в третий раз говорю - берёшь один размер и его экспортируешь в DXF-файл. И его уже анализируешь. Причем пропускаешь всё до:
Код - INI [Выбрать]
  1.   0
  2. SECTION
  3.   2
  4. ENTITIES
  5.   0
  6. DIMENSION

Если есть такие 6 строк, то дальше твой размер...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВасилийАвтор темы

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Да только при экспорте одного элемента , улетает в этот файл всё
Код - Visual Basic [Выбрать]
  1. Sub Export()
  2.   Dim oDimSset As AcadSelectionSet
  3.   Dim intDXF(0) As Integer
  4.   Dim varVal(0) As Variant
  5.   Dim D As AcadDimRotated
  6.   Dim Tp As Variant, insPt As Variant
  7.   Dim Objects() As AcadEntity
  8.  
  9.   ThisDrawing.Utility.GetEntity D, Tp
  10.  
  11.    With ThisDrawing.SelectionSets
  12.        While .Count > 0
  13.              .Item(0).Delete
  14.        Wend
  15.           Set oDimSset = .Add("DimOnly")
  16.    End With
  17.    
  18.    
  19.    ReDim Preserve Objects(0)
  20.             Set Objects(0) = D
  21.       oDimSset.AddItems (Objects)
  22.  
  23.  
  24.   Dim exportFile As String
  25.   exportFile = "C:\DXFExprt"
  26.   ThisDrawing.Export exportFile, "DXF", oDimSset
  27.  
  28. End Sub
  29.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробуй такой вариант:
Код - Visual Basic [Выбрать]
  1.     Sub ExportDXF()
  2.      
  3.       Dim D As AcadEntity
  4.       Dim Tp As Variant
  5.       Dim Objects() As AcadEntity
  6.      
  7.       ThisDrawing.Utility.GetEntity D, Tp
  8.      
  9.       Dim str As String
  10.       str = "(command ""_dxfout"" ""C:\\testdxf.dxf"" ""_O""" _
  11.         & " (handent """ & D.Handle & """)" & " """" """") "
  12.        
  13.       Application.ActiveDocument.SendCommand (str)
  14.      
  15.     End Sub
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВасилийАвтор темы

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Спасибо большое за терпение и помощь при поиске решения. Пробую - соберу конструкцию

Оффлайн ВасилийАвтор темы

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0



Наверно придётся смирится, задача не решаемая. Читать большой файл, где все размеры, не вариант.
В динамике может исчерпать память и фатал обеспечен.

Выдернуть разными способами размер не получилось

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я дал заготовку кода. Измени путь к файлу. Возможно у тебя туда нет доступа.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
После этого ты сканируешь до следующей группы 100. Если это
Наверное все таки не до следующей, а через одну.... т.к. следующая группа содержит значение AcDbEntity
В этом сообщении http://adn-cis.org/forum/index.php?topic=8448.msg31689#msg31689 строка 17

Я чутка дополнил Ваш код:
Код - Visual Basic [Выбрать]
  1.    Sub ExportDXF()
  2.      
  3.       Dim D As AcadEntity
  4.       Dim Tp As Variant
  5.       Dim Objects() As AcadEntity
  6.      
  7.       ThisDrawing.Utility.GetEntity D, Tp
  8.      
  9.       Dim str As String
  10. str = "(command ""_dxfout"" ""E:\\testdxf1.dxf"" ""_O""" _
  11.         & " (handent """ & D.Handle & """)" & " """" """") "
  12.        
  13.       Application.ActiveDocument.SendCommand (str)
  14.      
  15.  
  16. 'Подождем пока файлик появится
  17. Dim FilePathAndName As String
  18.  FilePathAndName = "E:\testdxf1.dxf"
  19.  
  20.  Dim flag As Boolean
  21.  flag = True
  22.  Do While flag
  23.     If Len(Dir$(FilePathAndName)) > 0 Then
  24.        'MsgBox ("Файл существует!")
  25.       flag = False
  26.     Else
  27.        'MsgBox ("Файл не найден...")
  28.        Start = Timer
  29.         Do While Timer < Start + 0.5 '0.5 = полсекунды
  30.            DoEvents
  31.         Loop
  32.     End If
  33.  Loop
  34.  
  35.  
  36. Dim InputData
  37. Dim reading As Boolean
  38. reading = False
  39.  
  40. Dim i As Integer
  41. On Error GoTo Exit1
  42.  
  43. Open FilePathAndName For Input As #4
  44. Do While Not EOF(4)
  45.     Line Input #4, InputData
  46.  
  47.  
  48.         If Trim(InputData) = "ENTITIES" Then
  49.           reading = True
  50.         End If
  51.  
  52.         If reading And Trim(InputData) = "ENDSEC" Then
  53.             Exit Do
  54.         End If
  55.        
  56.         If reading Then
  57.             ThisDrawing.Utility.Prompt (Chr(10) & InputData)
  58.         End If
  59.  
  60. Loop
  61.  
  62. Exit1:
  63. Close #4
  64. End Sub