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

Olga94
отредактировано 3 сен Раздел: API

Здравствуйте Уважаемые специалисты 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, помимо форматирования

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

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

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

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

  • Olga94
    отредактировано 4 сен

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

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

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

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

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

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

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

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

  • Olga94
    отредактировано 4 сен

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

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

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

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

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

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

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

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

  • Olga94
    отредактировано 4 сен

    Выход такой:

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

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

  • MTextAttributeContent
    

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

  • Olga94
    отредактировано 5 сен

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

  • doctorRAZ
    отредактировано 5 сен

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

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

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

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

  • Olga94
    отредактировано 5 сен

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

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

    Спасибо!

  • doctorRAZ
    отредактировано 5 сен

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

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

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

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

  • doctorRAZ
    отредактировано 5 сен

    в 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

  • Спасибо!!