Получить свойства многострочного атрибута через vba

Здравствуйте Уважаемые специалисты NanoCAD!

Есть блок с атрибутами. Макросом выгружаю значения этих атрибутов в Excel.

Проблема в том, что в Value не попадают, например, такие свойства многострочного атрибута как коэф сжатия.

Подскажите пожалуйста как с помощью vba-excel получить это свойство, например, в виде “Сжатие + Textstring” или еще как-то, чтобы попало в ячейку Excel?

For r = 1 To Col
For n = LBound(varAttributes) To UBound(varAttributes)
ActiveCell.Offset(0, r).Value = varAttributes(n).TextString
Next
Next

разбирай свойство

: MTextAttributeContent : "\pxsm1.5000;{\W2.0000;проверка\Pвсего}" : String
pxsm - межстрочный интервал
w - сжатие

Проблема в том, что сжатие (W) не передается в Value Excel (или из-за Value). Может нужно текст атрибута сначала преобразовать во что-то (в текст)?

Есть еще ScaleFactor, помимо форматирования

Проблема в том, что сжатие (W) не передается в Value Excel (или из-за Value). Может нужно текст атрибута сначала преобразовать во что-то (в текст)?

тебе просто текст надо получить?

или ты еще и параметры форматирования хочешь в ячейку эксель записать?

а потом вернуть в атрибут?

походу на басике этих свойств отдельно нет, они в составе мтекста

Проблема в том, что сжатие (W) не передается в Value Excel (или из-за Value). Может нужно текст атрибута сначала преобразовать во что-то (в текст)?

тебе просто текст надо получить?

или ты еще и параметры форматирования хочешь в ячейку эксель записать?

а потом вернуть в атрибут?

походу на басике этих свойств отдельно нет, они в составе мтекста

Мне нужно взять атрибут с текстом и его параметрами форматирования в ячейку Excel, а затем вернуть в атрибут блока.

Возможно нужно атрибут преобразовать в MText и уже из MText передавать в Excel (не взрывая блок)?

*Если в Excel значение будет с “\W..” (т.е. параметр сжатия есть), то он обратно передается в атрибут нормально.

Проблема как передать это параметр в ячейку Excel?

Распарси мтехт, а при записи в атрибут опять собери

Обратно в атрибут все нормально, но пока не знаю как получить в Excel строку вида “с W”- “\pxsm0.8000;{\W0.6500;Проверка строки}”?

Сделай split по слэшам, а потом join по символу или группе символов которые точно никогда не встретятся

Когда в атрибут обратная операция

Проблема в том, что у меня в значение вообще не попадает сжатие (как символ).

Т.е. из NanoCAD в excel получаю:

Текст многострочного атрибута

И если вручную в Excel добавить параметр форматирования сжатие, например, изменив строку:

{\\W0.6500;Текст многострочного атрибута}

и передать обратно в блок, то этот атрибут будет как сжатый текст.

Поэтому возник вопрос: передать этот параметр из Excel можно, но не понятно, как получить этот параметр в Excel, например, в виде {\\W0.6500;Текст многострочного атрибута}

*В Автокаде передаются все параметры форматирования тем же кодом vba.

Выход такой:

  • определить одно или много-строчный атрибут,
  • если многострочный, то скопировать все содержимое и вставить в “какой-то временный” МТЕКСТ,
  • передать из этого МТЕКСТ в ячейку Excel - передаются все параметры, включая сжатие.

но это утяжелит время кода.

MTextAttributeContent

Что возвращает в эксель?

Что возвращает в эксель?

Возвращает текст без параметров сжатия (т.е. также как и Textstring).

См. картинку во втором сообщении

без W у меня (хотя атрибут сжат)

Файл с блоком в студию

Так долго будем гадать

без W у меня (хотя атрибут сжат) - не верно.

Передается все таки, сейчас еще раз проверила.

Спасибо!

Форматирование мтехта в атрибуте может быть достаточно хитрым, разный коэф сжатия, разный цвет, высота шрифта , разные шрифты, подчеркивания, надчеркивания, зачеркивания. Бонусом вся эта красота одновременно может быть применена внутри каждого слова текста.

Соответственно задача по полному сохранению форматирования достаточно нетривиальна.

Поэтому предлагаю сильно не заморачиваться, а максимум это сохранять переносы

Спасибо за совет!

в VBA нанокад очистить форматирование нетривиальная задача

даже на .NET (removeAllFormatting нет такого(()

но на мультикад это просто,

останутся только переносы

код ниже делает то же самое что и волшебник Кен Уолсми на .NET

Public ThisDrawing As Object

Sub method_MtRAW()

Dim intType(0) As Integer

Dim varDat(0)  As Variant

Dim objSelSet  As Object

Dim objNanoCAD As Object
Set SPDS = CreateObject("McCOM2.Server")

On Error Resume Next

Set objNanoCAD = GetObject(, "AutoCAD.Application_")

If Err.Number <> 0 Then

    Err.Number = 0

    Set objNanoCAD = GetObject(, "nanoCAD.Application")


        If Err.Number <> 0 Then

            MsgBox "Не запущен CAD"


            Exit Sub

        End If

End If


On Error GoTo 0

Dim ObjMC As Variant 'McCOM2.Obj

Dim objAK As Variant 'native dwg

Set ThisDrawing = objNanoCAD.ActiveDocument

intType(0) = 0


varDat(0) = "insert"

'------------------

Set objSelSet = vbdPowerSet("seTEST")

objSelSet.Select 5, , , intType, varDat

Debug.Print "insert-" & objSelSet.Count

For Each objAK In objSelSet

    'passing the autocad object to the multicad

    Set ObjMC = SPDS.Object(objAK) 'full access to multicad properties

    Name0 = ObjMC!t1


    Name1 = ObjMC!t1.Raw 't1 attribute tag

    Name2 = ObjMC("t1").Raw

    Name20 = ObjMC("t1")

    Name3 = ObjMC.Properties("Info")

    nClass = ObjMC.ClassName

    Debug.Print nClass

    Debug.Print "format txt: "; Name0

    Debug.Print "unformat txt: "; Name1

    Debug.Print "---------------"


    'Keep working

Next
End Sub

Public Function vbdPowerSet(strName As String) As Object 'AcadSelectionSet

Dim objSelSet As Object ' AcadSelectionSet

Dim objSelCol As Object ' AcadSelectionSets

Set objSelCol = ThisDrawing.SelectionSets

For Each objSelSet In objSelCol

If objSelSet.Name = strName Then

objSelSet.Delete

Exit For

End If

Next

Set objSelSet = ThisDrawing.SelectionSets.Add(strName)

Set vbdPowerSet = objSelSet

End Function

мтехт.zip (63,1 КБ)