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

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

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

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

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Добрый день, уважаемые коллеги.

      Тема как получить точки привязки повёрнутого размера (объект AcadDimRotated), поднималась
в разное время на разных ресурсах.

       При этом были разные результаты, но стабильно работающего
решения не было.
        Ниже приведу изыскания и несколько слов:
1 Вариант. При помощи DXF кодов

Код - Visual Basic [Выбрать]
  1. Function GetPointAcDimrotated(returnObj As AcadDimRotated)
  2. Dim temp, startPnt, endPnt, location  As Variant
  3. Dim ResArrPoint(0 To 2) As Variant
  4.  
  5.        'В командную строку передается LISP-выражение, возвращающее первую точку в WCS (код DXF - 13)
  6.        ThisDrawing.SendCommand ("(cdr (assoc 13 (entget (handent " & """" & returnObj.Handle & """" & "))))" & vbCr)
  7.         temp = Mid(CStr(ThisDrawing.GetVariable("lastprompt")), 2, Len(CStr(ThisDrawing.GetVariable("lastprompt"))) - 2)
  8.        'В переменную startPnt записывается массив с координатами первой точки
  9.        startPnt = Split(temp, " ", , vbTextCompare)
  10.              
  11.         'В командную строку передается LISP-выражение, возвращающее вторую точку в WCS (код DXF - 14)
  12.        ThisDrawing.SendCommand ("(cdr (assoc 14 (entget (handent " & """" & returnObj.Handle & """" & "))))" & vbCr)
  13.         temp = Mid(CStr(ThisDrawing.GetVariable("lastprompt")), 2, Len(CStr(ThisDrawing.GetVariable("lastprompt"))) - 2)
  14.         'В переменную endPnt записывается массив с координатами второй точки
  15.        endPnt = Split(temp, " ", , vbTextCompare)
  16.          
  17.        'В командную строку передается LISP-выражение, возвращающее вторую точку в WCS (код DXF - 10)
  18.        ThisDrawing.SendCommand ("(cdr (assoc 10 (entget (handent " & """" & returnObj.Handle & """" & "))))" & vbCr)
  19.         temp = Mid(CStr(ThisDrawing.GetVariable("lastprompt")), 2, Len(CStr(ThisDrawing.GetVariable("lastprompt"))) - 2)
  20.         'В переменную endPnt записывается массив с координатами второй точки
  21.        location = Split(temp, " ", , vbTextCompare)
  22.    
  23.         ResArrPoint(0) = startPnt
  24.         ResArrPoint(1) = endPnt
  25.         ResArrPoint(2) = location
  26.         GetPointAcDimrotated = ResArrPoint
  27. End Function
  28.  
  29.  
Вариант решения был предложен http://www.caduser.ru/forum/index.php?PAGE_NAME=read&FID=25&TID=7276
При переборе размеров и получении точек циклом, может вызвать ошибку такого рода:

Подсказка залетает в переменную "lastprompt"

Вариант 2. С ресурса https://forums.autodesk.com/t5/visual-basic-customization/geometry-of-rotated-dimension/td-p/2067539
Код - Visual Basic [Выбрать]
  1. Option Explicit
  2.  
  3. Private VL
  4.  
  5. Function GetVl() As Object
  6. Dim AcadVer As Integer
  7. Dim VLisp As Object
  8. AcadVer = CInt(Left$(ThisDrawing.GetVariable("ACADVER"), 2))
  9. Select Case AcadVer
  10. Case Is < 16
  11. Set VLisp = ThisDrawing.Application.GetInterfaceObject("VL.Application.1")
  12. Case 16
  13. Set VLisp = ThisDrawing.Application.GetInterfaceObject("VL.Application.16")
  14. Case Else
  15. Set VLisp = ThisDrawing.Application.GetInterfaceObject("VL.Application.16")
  16. End Select
  17.  
  18. Set GetVl = VLisp
  19. End Function
  20.  
  21.  
  22. Public Function vbAssoc(pAcadObj As AcadObject, pDXFCode As Integer) As Variant
  23.  
  24. Dim VLisp As Object
  25. Dim VLispFunc As Object
  26. Dim varRetVal As Variant
  27.  
  28. Dim obj1 As Object
  29. Dim obj2 As Object
  30.  
  31. Dim strHnd As String
  32. Dim strVer As String
  33.  
  34. Dim lngCount As Long
  35. Dim i As Long
  36. Dim j As Long
  37.  
  38. On Error GoTo vbAssocError
  39.  
  40. strHnd = pAcadObj.Handle
  41.  
  42. Dim AcadVer As Integer
  43. AcadVer = CInt(Left$(ThisDrawing.GetVariable("ACADVER"), 2))
  44. Select Case AcadVer
  45. Case Is < 16
  46. Set VLisp = ThisDrawing.Application.GetInterfaceObject("VL.Application.1")
  47. Case 16
  48. Set VLisp = ThisDrawing.Application.GetInterfaceObject("VL.Application.16")
  49. Case Else
  50. Set VLisp = ThisDrawing.Application.GetInterfaceObject("VL.Application.16")
  51. End Select
  52.  
  53. Set VLispFunc = VLisp.ActiveDocument.Functions
  54.  
  55. Set obj1 = VLispFunc.Item("read").funcall("pDXF")
  56.   varRetVal = VLispFunc.Item("set").funcall(obj1, pDXFCode)
  57. Set obj1 = VLispFunc.Item("read").funcall("pHandle")
  58.   varRetVal = VLispFunc.Item("set").funcall(obj1, strHnd)
  59. Set obj1 = VLispFunc.Item("read").funcall("(vl-princ-to-string (cdr (assoc pDXF (entget (handent pHandle)))))")
  60.   varRetVal = VLispFunc.Item("eval").funcall(obj1)
  61.  
  62. vbAssoc = varRetVal
  63.  
  64. 'clean up the newly created LISP symbols
  65. Set obj1 = VLispFunc.Item("read").funcall("(setq pDXF nil)")
  66.   varRetVal = VLispFunc.Item("eval").funcall(obj1)
  67. Set obj1 = VLispFunc.Item("read").funcall("(setq pHandle nil)")
  68.   varRetVal = VLispFunc.Item("eval").funcall(obj1)
  69.  
  70. 'release the objects or Autocad gets squirrely
  71. Set obj2 = Nothing
  72. Set obj1 = Nothing
  73. Set VLispFunc = Nothing
  74. Set VLisp = Nothing
  75.  
  76. Exit Function
  77.  
  78. vbAssocError:
  79.   Set obj2 = Nothing
  80.   Set obj1 = Nothing
  81.   Set VLispFunc = Nothing
  82.   Set VLisp = Nothing
  83.   vbAssoc = "ErrEmpty"
  84.  ' MsgBox "Error occurred " & Err.Description
  85.  
  86. End Function
  87.  
В этом методе исключения такого рода

при попытки пропустить исключение, может вызвать fatal

Вариант 3. Поиск точек внутри блока размеров
Пример 1
Код - Visual Basic [Выбрать]
  1. Sub DimR()
  2.  
  3. Dim b As AcadBlock
  4. Dim Bs As AcadBlocks
  5. Dim D As AcadDimRotated
  6. Dim Tp As Variant, insPt As Variant
  7. Dim Ent As AcadEntity
  8. Dim i As Integer
  9. Dim Fluff As Double
  10. Dim StartPoint As AcadPoint
  11. Dim EndPoint As AcadPoint
  12. Dim location As AcadPoint
  13.  
  14. Fluff = 1
  15. ThisDrawing.Utility.GetEntity D, Tp
  16. Tp = D.TextPosition
  17.  
  18. Set Bs = ThisDrawing.Blocks
  19.  
  20. For Each b In Bs
  21.    If Not Left(b.Name, 2) = "*D" Then GoTo SkipBlock
  22.    For Each Ent In b
  23.      If TypeOf Ent Is AcadMText Then
  24.       ' Debug.Print Tp(0)
  25.       insPt = Ent.InsertionPoint
  26.        
  27. For i = 0 To 2
  28.     If Abs(insPt(i) - Tp(i)) > Fluff Then GoTo SkipBlock
  29. Next i
  30.  
  31.  Set StartPoint = b.Item(6)
  32.  Set EndPoint = b.Item(7)
  33.  Set location = b.Item(8)
  34.  
  35.     ThisDrawing.ModelSpace.AddPoint StartPoint.Coordinates
  36.     ThisDrawing.ModelSpace.AddPoint EndPoint.Coordinates
  37.     ThisDrawing.ModelSpace.AddPoint location.Coordinates
  38.  
  39.  Debug.Print StartPoint.Coordinates(0); StartPoint.Coordinates(1); StartPoint.Coordinates(2)
  40.  Debug.Print EndPoint.Coordinates(0); EndPoint.Coordinates(1); EndPoint.Coordinates(2)
  41.  Debug.Print location.Coordinates(0); location.Coordinates(1); location.Coordinates(2)
  42.  
  43.  
  44.  Exit Sub
  45. End If
  46. Next Ent
  47. SkipBlock:
  48. Next b
  49.  
  50. End Sub
  51.  
Самое весёлое, что не угадаешь в каком случае в каком Item будет храниться именно StartPoint,
EndPoint, location. Содержание блока размера в одном и другом файле разные см картинку ниже:

Пример 2

Код - Visual Basic [Выбрать]
  1.  ;DSub DimR()
  2.  
  3. Dim b As AcadBlock
  4. Dim Object As AcadObject
  5. Dim PickedPoint As Variant, TransMatrix As Variant, ContextData As Variant
  6. Dim HasContextData As String
  7.  
  8. ' Get the sub entity and a pick point
  9. ThisDrawing.Utility.GetSubEntity Object, PickedPoint, TransMatrix, ContextData
  10. Debug.Print "Selected object is a " & Object.ObjectName
  11.  
  12. ' Get the main entity at the picked point
  13. Dim ss1 As AcadSelectionSet
  14. Set ss1 = ThisDrawing.SelectionSets.Add("testSel")
  15. ss1.SelectAtPoint (PickedPoint)
  16. Dim obj2 As Object
  17. Set obj2 = ss1(0)
  18. ss1.Delete
  19. ' obj2 is the Main entity at the pick point
  20. Debug.Print obj2.ObjectName
  21. ' Ensure the main entity is a rotated dimension
  22. If obj2.ObjectName = "AcDbRotatedDimension" Then
  23. ' Get the Owning object, this will be the Block, object is the sub entity selected
  24. Dim obj As Object
  25. Set obj = ThisDrawing.ObjectIdToObject(Object.OwnerID)
  26.  
  27. Dim myBlk As AcadBlock
  28. Set myBlk = obj
  29. Debug.Print "Selected object owner is a block named " & myBlk.Name
  30.  
  31. Set b = ThisDrawing.Blocks(myBlk.Name)
  32. Stop
  33. ThisDrawing.ModelSpace.AddCircle b(8).Coordinates, 3
  34. ThisDrawing.ModelSpace.AddCircle b(9).Coordinates, 3
  35. ThisDrawing.ModelSpace.AddCircle b(7).Coordinates, 3
  36. ThisDrawing.Application.Update
  37. Else
  38. MsgBox "Selected entity not a rotated dimension"
  39. End If
  40.  
  41. End Sub
  42.  
  43.  

Коллеги, прошу помочь разобраться. Своим умом не получается. Знаю что из VBA свойства не доступны,
ищу стабильный, альтернативный способ получения точек.


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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Знаю что из VBA свойства не доступны,
ищу стабильный, альтернативный способ получения точек.
Стабильный альтернативный способ - перейти на .NET
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Увы, в данном проекте пока не могу. Большая часть кода на VBA. Такое количество не перепишу

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Увы, в данном проекте пока не могу. Большая часть кода на VBA. Такое количество не перепишу
Зачем переписывать всё? Только те функции, которые нельзя реализовать на VBA.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Если не затруднит... Как допустим отдельно в составе VBA отработать код VB.net ?
Метод Export что даст? Если не трудно кусочек кода.
Допустим на данный момент я обрабатываю DXF в котором после экспорта специализированного
ПО размеры получились плохими - битыми,если просто поменять им стиль, то слетает положение размеров (не в рядок, а в разброс).
Вот и приходится считывать с начало точки, а потом перерисовывать размер
 Ниже приведу файл и картинку, может мысль подкините (может что то я не то делаю)?



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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Метод Export что даст?
Это если только на VBA (без .NET) делать. Метод EXPORT даст создать dxf-файл, ты его читаешь как текстовый файл и находишь координаты точек. Типа вариант 2., но через файл.
Как допустим отдельно в составе VBA отработать код VB.net ?
Загрузить .NET-сборку в которой будет определена команда (или функция) и вызвать эту команду/функцию через SendCommand
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Цитировать
Загрузить .NET-сборку в которой будет определена команда (или функция) и вызвать эту команду/функцию через SendCommand

В этом варианте нужно постоянно обмениваться, с начало считать координаты- записать куда-то-потом вернуться в VBA считать и так
столько, сколько размеров

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

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Прошу подсказать как выбрать всё что касается размера в dxf  в файле. При экспорте получилось 180000 строк- глаза разбегаются

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

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
AcDbDimension
  2
*D19
 10
190.0000000000001
 20
-5.0
 30
0.0
 11
190.0000000000002
 21
292.0000000000002
 31
0.0
 70
    32
  1
 
 71
     5
 42
594.0000000000004
 73
     0
 74
     0
 75
     0
  3
Standard
100
AcDbAlignedDimension
 13
190.0000000000002
 23
589.0000000000005
 33
0.0
 14
190.0000000000004
 24
-5.0
 34
0.0
 50
90.0
100
По каким признакам отсеивать нужные точки

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Прошу подсказать как выбрать всё что касается размера в dxf  в файле. При экспорте получилось 180000 строк- глаза разбегаются
Пример из документации:

Код - Visual Basic [Выбрать]
  1. Sub Example_Export()
  2.     ' This example exports the current drawing to DXF format.
  3.    ' Note that a valid selection set must be provided, even
  4.    ' though the contents of the selection set are ignored.
  5.    
  6.     ' Define the name for the exported file
  7.    Dim exportFile As String
  8.     exportFile = "C:\AutoCAD\DXFExport"     ' Adjust path to match your system
  9.    
  10.     ' Create an empty selection set
  11.    Dim sset As AcadSelectionSet
  12.     Set sset = ThisDrawing.SelectionSets.Add("TEST")
  13.    
  14.     ' Export the current drawing to the file specified above.
  15.    ThisDrawing.Export exportFile, "DXF", sset
  16.    
  17. End Sub
  18.  
В sset нужно загнать только один размер.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление 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.  
  8.    With ThisDrawing.SelectionSets
  9.        While .Count > 0
  10.              .Item(0).Delete
  11.        Wend
  12.           Set oDimSset = .Add("DimOnly")
  13.    End With
  14.    
  15.       intDXF(0) = 0
  16.       varVal(0) = "DIMENSION"
  17.       Mode = acSelectionSetAll
  18.       oDimSset.Select Mode, , , intDXF, varVal
  19.   Dim exportFile As String
  20.   exportFile = "C:\DXFExprt"
  21.   ThisDrawing.Export exportFile, "DXF", oDimSset
  22.  
  23. End Sub
  24.  

Самый смак как отсеить...!
Застрял на том как  определить в dxf файле сам размер AcadDimRotated.
По сути сделал набор в нём смотрю TextPosition от размера,
лезу в файл и ищу сам размер по этому признаку и вот тут затык - как найти?
Есть анонимный блок и в нём нет кодов 13, 14 и 10.....



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

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

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

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Не вопрос нашёл
AcDbRotatedDimension
1001
AcadAnnotative
1000
AnnotativeData
1002
{
1070
     1
1070
     0
1002
}
1001
ACAD
1000
DSTYLE
1002
{
1070
    40
1040
1.0
1070
   279
1070
     0
1070
   289
1070
     3
1070
   174
1070
     0
1070
   175
1070
     0
1070
   172
1070
     1
1070
   145
1040
1.0
1002
}
  0
Нет намёка на координаты.
Не могу сообразить парсинг....

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь 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
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь 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
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь 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
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я дал заготовку кода. Измени путь к файлу. Возможно у тебя туда нет доступа.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
После этого ты сканируешь до следующей группы 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

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

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Цитировать
Я дал заготовку кода. Измени путь к файлу. Возможно у тебя туда нет доступа.

Снимаю шляпу, за свою не внимательность. Преклоняю колено. Действительно на домашнем компьютере диски N, M, F.
А я уже руки опустил.
Код - Visual Basic [Выбрать]
  1.  Dim flag As Boolean
  2.  flag = True
  3.  Do While flag
  4.     If Len(Dir$(FilePathAndName)) > 0 Then
  5.        'MsgBox ("Файл существует!")
  6.       flag = False
  7.     Else
  8.        'MsgBox ("Файл не найден...")
  9.        Start = Timer
  10.         Do While Timer < Start + 0.5 '0.5 = полсекунды
  11.            DoEvents
  12.         Loop
  13.     End If
  14.  Loop
  15.  

Спасибо за код секции, я тоже использовал аналогичную конструкцию для определения готовности файла.

За мной теперь доработка кода, с целью получения искомых точек, для того чтоб предложить Вариант 4 решения этой задачи.

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Так ответ то уже готов... я слегка подправил код...
Извините, вам запрещён просмотр содержимого спойлеров.

и теперь результат такой:

И ту уже совсем все просто...
ЗЫ.
Мне просто интересно было до аннотативности добраться, что в VBA проблемно...
т.е. узнать о том что объект аннотативен можно было посмотрев на соответствующий словарь, а вот значение... значение через dxf... в принципе возможно.

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

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Я до пилю, спасибо за потраченное на меня время. Хочу дать ответ по имени темы
"Точки привязки размеров", это функция которая вернёт именно StartPoint,
EndPoint и location. Вариант 4 от начала темы

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

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Аннотативность для меня такой же секрет, для этого я и вычисляю точки, чтоб потом выставить масштаб и перестроить размеры. Текущий масштаб применяется как аннотативный у этих размеров. Но увы скорей всего после этого проекта я на VBA больше писать не буду, слишком много свойств которые не доступны. И приходится придумывать вот такие способы, которые мы обсуждаем в этой теме

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Но увы скорей всего после этого проекта я на VBA больше писать не буду, слишком много свойств которые не доступны.
Правильный вывод. Тем более, что всё что можно в VBA можно и в .NET. Причем рекомендую C# а не VB.NET - как минимум примеров больше.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
Вариант 4. Получение точек из dxf файла
Благодарю за идею, участие и терпение Александра Ривилиса и Владимира Шу за парсинг, до которого я сам не дошёл.

Код - Visual Basic [Выбрать]
  1. '
  2.  
  3. Function GetPointAcDimrotated(returnObj As AcadDimRotated)
  4.       Dim D As AcadEntity
  5.       Dim Tp As Variant
  6.       Dim VariantArr() As Variant
  7.       Dim k As Long
  8.       Dim ArrDxf As Boolean
  9.       Dim flagArr As Boolean
  10.       Dim ArrDimPoint() As Variant
  11.       Dim Codedxf As Variant
  12.       Dim CodeValue As Variant
  13.       Dim arrRes() As String
  14.       Dim startPnt(0 To 2), endPnt(0 To 2), location(0 To 2) As Variant
  15.       Dim ResArrPoint(0 To 2) As Variant
  16.       Dim Start As Double
  17.       Dim FileName_Dxf As String
  18.       Dim i As Integer
  19.       Dim str As String
  20.       Dim flag As Boolean
  21.       Dim FilePathAndName As String
  22.       Dim InputData
  23.       Dim reading As Boolean
  24.       Dim AcDimensionPropTemp As New Collection
  25.       Dim lineNumber As Integer
  26.      
  27.       ArrDxf = False
  28.       flag = True
  29.       FileName_Dxf = ThisDrawing.GetVariable("DWGPREFIX") & "Dimdxf.dxf"
  30.       FileName_Dxf = Replace(FileName_Dxf, "\", "\\")
  31.       str = "(command ""_dxfout"" """ & FileName_Dxf & """ ""_O""" & " (handent """ & returnObj.Handle & """)" & " """" """") "
  32.       Application.ActiveDocument.SendCommand (str)
  33.      
  34. 'Подождем пока файлик появится
  35.  
  36.       FilePathAndName = FileName_Dxf
  37.  Do While flag
  38.     If Len(Dir$(FilePathAndName)) > 0 Then
  39.        'MsgBox ("Файл существует!")
  40.       flag = False
  41.     Else
  42.        'MsgBox ("Файл не найден...")
  43.        Start = Timer
  44.         Do While Timer < Start + 0.5 '0.5 = полсекунды
  45.            DoEvents
  46.         Loop
  47.     End If
  48.  Loop
  49. reading = False
  50.  
  51. On Error GoTo Exit1
  52. Open FilePathAndName For Input As #4
  53. Do While Not EOF(4)
  54.     Line Input #4, InputData
  55.         If Trim(InputData) = "ENTITIES" Then
  56.           reading = True
  57.         End If
  58.         If reading And Trim(InputData) = "ENDSEC" Then
  59.            Exit Do
  60.         End If
  61.         If reading Then
  62.             AcDimensionPropTemp.Add Item:=InputData, key:=CStr(lineNumber)
  63.         End If
  64.         lineNumber = lineNumber + 1
  65. Loop
  66.  k = -1
  67. For i = 3 To AcDimensionPropTemp.Count Step 2
  68.   ArrDxf = True
  69.   k = k + 1
  70.   ReDim Preserve VariantArr(k)
  71.              VariantArr(k) = (Chr(10) & AcDimensionPropTemp(i - 1) & "->" & AcDimensionPropTemp(i))
  72.    
  73. Next
  74. k = -1
  75. If ArrDxf Then
  76.  For i = 0 To UBound(VariantArr)
  77.   arrRes = Split(VariantArr(i), "->")
  78.    Codedxf = arrRes(0)
  79.    CodeValue = arrRes(1)
  80.    
  81.     ' определение startPnt
  82.    If Codedxf = 13 Then
  83.        startPnt(0) = CodeValue
  84.        flagArr = True
  85.      k = k + 1
  86.        ReDim Preserve ArrDimPoint(k)
  87.        ArrDimPoint(k) = startPnt(0)
  88.    End If
  89.    If Codedxf = 23 Then
  90.        startPnt(1) = CodeValue
  91.        flagArr = True
  92.      k = k + 1
  93.        ReDim Preserve ArrDimPoint(k)
  94.        ArrDimPoint(k) = startPnt(1)
  95.    End If
  96.    If Codedxf = 33 Then
  97.        startPnt(2) = CodeValue
  98.        flagArr = True
  99.      k = k + 1
  100.        ReDim Preserve ArrDimPoint(k)
  101.        ArrDimPoint(k) = startPnt(2)
  102.    End If
  103.    
  104.     ' определение endPnt
  105.   If Codedxf = 14 Then
  106.        endPnt(0) = CodeValue
  107.        flagArr = True
  108.      k = k + 1
  109.        ReDim Preserve ArrDimPoint(k)
  110.        ArrDimPoint(k) = endPnt(0)
  111.    End If
  112.    If Codedxf = 24 Then
  113.        endPnt(1) = CodeValue
  114.        flagArr = True
  115.      k = k + 1
  116.        ReDim Preserve ArrDimPoint(k)
  117.        ArrDimPoint(k) = endPnt(1)
  118.    End If
  119.    If Codedxf = 34 Then
  120.        endPnt(2) = CodeValue
  121.        flagArr = True
  122.      k = k + 1
  123.        ReDim Preserve ArrDimPoint(k)
  124.        ArrDimPoint(k) = endPnt(2)
  125.   End If
  126.  
  127.   ' определение location
  128.  If Codedxf = 10 Then
  129.        location(0) = CodeValue
  130.        flagArr = True
  131.      k = k + 1
  132.        ReDim Preserve ArrDimPoint(k)
  133.        ArrDimPoint(k) = location(0)
  134.    End If
  135.    If Codedxf = 20 Then
  136.        location(1) = CodeValue
  137.        flagArr = True
  138.      k = k + 1
  139.        ReDim Preserve ArrDimPoint(k)
  140.        ArrDimPoint(k) = location(1)
  141.    End If
  142.    If Codedxf = 30 Then
  143.        location(2) = CodeValue
  144.        flagArr = True
  145.      k = k + 1
  146.        ReDim Preserve ArrDimPoint(k)
  147.        ArrDimPoint(k) = location(2)
  148.   End If
  149.  Next
  150.  If flagArr Then
  151.     If UBound(ArrDimPoint) = 8 Then
  152.         ResArrPoint(0) = startPnt
  153.         ResArrPoint(1) = endPnt
  154.         ResArrPoint(2) = location
  155.         GetPointAcDimrotated = ResArrPoint
  156.         Debug.Print startPnt(0), startPnt(1), startPnt(2)
  157.         Debug.Print endPnt(0), endPnt(1), endPnt(2)
  158.         Debug.Print location(0), location(1), location(2)
  159.         Else
  160.         GoTo Exit1
  161.     End If
  162.     Else
  163.     GoTo Exit1
  164.  End If
  165. End If
  166. Exit1:
  167. Close #4
  168.      
  169.        
  170. End Function
  171.  

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
ИМХО, Вы несколько перемудрили... Все проще.

Первые 3 строчки кода (у Вас это примерно 66-73 строки) нужно было заменить просто созданием  и заполнением словаря (с 8 по 15 строки)
Код - Visual Basic [Выбрать]
  1. 'For i = 3 To AcDimensionPropTemp.Count Step 2
  2. ' ThisDrawing.Utility.Prompt (Chr(10) & AcDimensionPropTemp(i - 1) & " -> " & AcDimensionPropTemp(i))
  3. 'Next
  4.    
  5. 'To add the reference to your VBA project, go to the VB Editor,
  6. 'and select Tools --> References from the menu.  Select Microsoft Scripting Runtime
  7. 'from the list of installed libraries, and click OK.
  8. Dim MyDictionary As Object
  9. Set MyDictionary = CreateObject("Scripting.Dictionary")
  10.  
  11. For i = 3 To AcDimensionPropTemp.Count Step 2
  12.     With MyDictionary
  13.         If Not .Exists(Trim(CStr(AcDimensionPropTemp(i - 1)))) Then .Add Trim(CStr(AcDimensionPropTemp(i - 1))), AcDimensionPropTemp(i)
  14.     End With
  15. Next
  16.        
  17. 'For Each i In MyDictionary.Keys
  18. ' ThisDrawing.Utility.Prompt (Chr(10) & i & " -> " & MyDictionary.Item(i))
  19. 'Next
  20.  

И данные забирать по значению dxf кодов, как то так:
Код - Visual Basic [Выбрать]
  1. Dim xCoord As String: sd = MyDictionary.Item("10")
  2.    
  3.     Dim p1(2) As Double
  4.     p1(0) = Val(MyDictionary.Item("10"))
  5.     p1(1) = Val(MyDictionary.Item("20"))
  6.     p1(2) = Val(MyDictionary.Item("30"))
  7.  

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

  • ADN OPEN
  • Сообщений: 26
  • Карма: 0
С учётом правки предложенной  Владимиром Шу

Код - Visual Basic [Выбрать]
  1. '
  2. Function GetPointAcDimrotated(returnObj As AcadDimRotated)
  3.  
  4.  
  5.       Dim startPnt(0 To 2), endPnt(0 To 2), location(0 To 2) As Variant
  6.       Dim Start As Double
  7.       Dim FileName_Dxf As String
  8.       Dim i As Integer
  9.       Dim str As String
  10.       Dim flag As Boolean
  11.       Dim FilePathAndName As String
  12.       Dim InputData
  13.       Dim reading As Boolean
  14.       Dim AcDimensionPropTemp As New Collection
  15.       Dim lineNumber As Integer
  16.       Dim Tr As Variant
  17.       Dim ResArrPoint(0 To 2) As Variant
  18.       flag = True
  19.       FileName_Dxf = ThisDrawing.GetVariable("DWGPREFIX") & "Dimdxf33.dxf"
  20.       FileName_Dxf = Replace(FileName_Dxf, "\", "\\")
  21.       str = "(command ""_dxfout"" """ & FileName_Dxf & """ ""_O""" & " (handent """ & returnObj.Handle & """)" & " """" """") "
  22.       Application.ActiveDocument.SendCommand (str)
  23.      
  24. 'Подождем пока файлик появится
  25.  
  26.       FilePathAndName = FileName_Dxf
  27.  Do While flag
  28.     If Len(Dir$(FilePathAndName)) > 0 Then
  29.        'MsgBox ("Файл существует!")
  30.       flag = False
  31.     Else
  32.        'MsgBox ("Файл не найден...")
  33.        Start = Timer
  34.         Do While Timer < Start + 0.5 '0.5 = полсекунды
  35.            DoEvents
  36.         Loop
  37.     End If
  38.  Loop
  39. reading = False
  40.  
  41. 'On Error GoTo Exit1
  42. Open FilePathAndName For Input As #4
  43. Do While Not EOF(4)
  44.     Line Input #4, InputData
  45.         If Trim(InputData) = "ENTITIES" Then
  46.           reading = True
  47.         End If
  48.         If reading And Trim(InputData) = "ENDSEC" Then
  49.            Exit Do
  50.         End If
  51.         If reading Then
  52.             AcDimensionPropTemp.Add Item:=InputData, key:=CStr(lineNumber)
  53.         End If
  54.         lineNumber = lineNumber + 1
  55. Loop
  56.  
  57. Dim MyDictionary As Object
  58. Set MyDictionary = CreateObject("Scripting.Dictionary")
  59.  
  60. For i = 3 To AcDimensionPropTemp.Count Step 2
  61.     With MyDictionary
  62.         If Not .Exists(Trim(CStr(AcDimensionPropTemp(i - 1)))) Then .Add Trim(CStr(AcDimensionPropTemp(i - 1))), AcDimensionPropTemp(i)
  63.     End With
  64. Next
  65.    
  66.    startPnt(0) = MyDictionary.Item("13")
  67.    startPnt(1) = MyDictionary.Item("23")
  68.    startPnt(2) = MyDictionary.Item("33")
  69.  
  70.    endPnt(0) = MyDictionary.Item("14")
  71.    endPnt(1) = MyDictionary.Item("24")
  72.    endPnt(2) = MyDictionary.Item("34")
  73.  
  74.    location(0) = MyDictionary.Item("10")
  75.    location(1) = MyDictionary.Item("20")
  76.    location(2) = MyDictionary.Item("30")
  77.    ResArrPoint(0) = startPnt
  78.    ResArrPoint(1) = endPnt
  79.    ResArrPoint(2) = location
  80.    GetPointAcDimrotated = ResArrPoint
  81.  
  82. Exit1:
  83. Close #4
  84. End Function
  85.  

Единственное если делаю строку численной
Код - Visual Basic [Выбрать]
  1. '
  2. Val(MyDictionary.Item("13"))
  3.  
размер отстраивается некорректно. Наверно связанно с разделителем численной части в системе