Тема: Как программно убрать лишние переводы строки в MTEXT?

Просьба к админам: если можно, то удалите мой пост из ветки Шрифты (или закройте):
https://www.caduser.ru/forum/topic23978.html
Я уже задавал этот вопрос, но при общении со знающими (в смысле - больше меня) людьми выяснилось, что наиболее реально это сделать в VBA (правда как - пока неизвестно), поэтому задам вопрос еще раз здесь.
Собственно вопрос: при конвертации из VISIO в Автокад получается MTEXT следующего содержания:
CP16
Uc
=118,80
C
/N=59,96
Необходимо привести его в такой вид (удалить 2 лишних переноса строки):
CP16
Uc=118,80
C/N=59,96
Таких MTEXT на чертеже порядка 100 — 300 штук, цифры везде разные, только форматирование сходится. Вручную удалять лишние переносы строк, мягко говоря, задолбало уже.
ОЧЕНЬ НАДЕЮСЬ на вашу помощь.

Re: Как программно убрать лишние переводы строки в MTEXT?

Опиши немного поподробнее. Где именно появляются лишние переносы(перед, после определённого символа или на определённом по числу символов месте). И во всекх ли  Mtext  такие проблемы, а если не во всекх то чем отличаются проблемные?

Re: Как программно убрать лишние переводы строки в MTEXT?

> Loner Wanderer
Если эти тексты одинаковой структуры, тогда
можешь попробовать, выделять текст можно
любым способом (по-одному или рамкой), только
предварительно нужно задать начальный преффикс
для текста (в твоем конкретном примере это
будет СР)
Если структура другая, естественно, результат
непредсказуем. Проверяй все

Option Explicit
Public Sub Ch_Mtext_Spacing()
Dim oMtext As AcadMText, oStr, nStr, sStr  As String, pickPt As Variant
Dim fStr, hStr, tStr, sPat As String, fPos, sPos, i As Long
Dim oSset As AcadSelectionSet, fType(0 To 1) As Integer, fData(0 To 1)
On Error Resume Next
Set oSset = ThisDrawing.SelectionSets("$Set_Mtext$")
If Err Then Set oSset = ThisDrawing.SelectionSets.Add("$Set_Mtext$")
oSset.Clear
On Error GoTo 0
sPat = InputBox("Enter Mtext preffix " & _
vbNewLine & "to the string compare:" & _
vbNewLine & "[Enter to default]", , "CP")
If sPat = "" Then
sPat = "CP*"
Else
sPat = sPat & "*"
End If
fType(0) = 0: fData(0) = "MTEXT"
fType(1) = 1: fData(1) = sPat
oSset.SelectOnScreen fType, fData
For i = 0 To oSset.Count - 1
Set oMtext = oSset.Item(i)
oStr = oMtext.TextString
oStr = Replace(oStr, "\P", " ", vbTextCompare)
fPos = InStr(1, oStr, "U")
fStr = Left(oStr, fPos - 1)
hStr = Mid(oStr, fPos)
hStr = Replace(hStr, " ", "")
sPos = InStr(1, hStr, "C")
sStr = Left(hStr, sPos - 1)
tStr = Right(hStr, Len(hStr) - sPos + 1)
oStr = fStr & "\P" & sStr & "\P" & tStr
oMtext.TextString = oStr
oMtext.Update
Next
MsgBox Err.Description
End Sub

~'J'~

Re: Как программно убрать лишние переводы строки в MTEXT?

Вариант преобразования текста.

arrTxt=Split(txt,vbCrLf)
txt=arrTxt(0) & vbCrLF & arrTxt(1) & arrTxt(2) & vbCrLf & arrTxt(3) & arrTxt(4)

Re: Как программно убрать лишние переводы строки в MTEXT?

Какая версия Автокада используется?

Re: Как программно убрать лишние переводы строки в MTEXT?

> Алексей
Кому вопрос?
~'J'~

Re: Как программно убрать лишние переводы строки в MTEXT?

Вопрос естественно к  Loner Wanderer. Если 2006, то могу написать процедуру и скинуть в виде dll, если это еще актуально

Re: Как программно убрать лишние переводы строки в MTEXT?

> Алексей
Автокад 2005 английский.

> Gogi
'*' обозначает перенос строки
Исходный Mtext:
--Начало Mtext--
CP16*
Uc*
=118,80*
C*
/N=59,96*
--Конец Mtext--
Требуемый Mtext:
--Начало Mtext--
CP16*
Uc=118,80*
C/N=59,96*
--Конец Mtext--
Ненужные переносы всегда после Uc и после С. Проблемы во всех Mtext, которые начинаются с CP<число>. В чертеже есть и другие Mtext, но их очень мало, текстовка всегда разная и с ними, в принципе, проблем не возникает.

> Олег(jr.)
Макрос начинает работать, запрашивает префикс, но после этого никакие Mtext не выбираются.

> brigval
В VBA для Acad я чайник. сталкивался только с Excel. Основные моменты знаю (создание модуля, функции и т.д.). Если можно, то инструкцию по вставке кода (куда?).
>ALL
Пример файла лежит здесь:
http://loner-new.narod.ru/Drawing2.dwg

Re: Как программно убрать лишние переводы строки в MTEXT?

А лисп не покатит?

(defun c:modmtext (/ adoc selset item)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark adoc)
  (if (setq selset (ssget '((0 . "MTEXT"))))
    (while (and selset (> (sslength selset) 0))
      (setq item (ssname selset 0))
      (ssdel item selset)
      (foreach sub_item    '(("\\P=" "=") ("\\P/" "/"))
    (vla-put-textstring
      (vlax-ename->vla-object item)
      (vl-string-subst
        (cadr sub_item)
        (car sub_item)
        (vla-get-textstring (vlax-ename->vla-object item))
        ) ;_ end of VL-STRING-SUBST
      ) ;_ end of vla-put-TextString
    ) ;_ end of foreach
      ) ;_ end of while
    ) ;_ end of if
  (vla-endundomark adoc)
  ) ;_ end of defun

Re: Как программно убрать лишние переводы строки в MTEXT?

> kpblc
Работает. Огромное спасибо.

Re: Как программно убрать лишние переводы строки в MTEXT?

> Loner Wanderer
Код наверно читать надо мне кажется
Опцию SelectOnScreen не видел да?
~'J'~

Re: Как программно убрать лишние переводы строки в MTEXT?

> Олег(jr.)
Извиняюсь, не понял.
Если это упрек по поводу того, что я чайник - да, в VBA Acad'a я не разбираюсь (я уже написал по этому поводу чуть выше).
А если это просто вопрос - то не видел. В командной строке только запрос на выбор объектов. Объекты выбираться не хотят.
В принципе, вопрос уже решен лиспом, но если есть желание, то можно и макрос отладить - я против не буду.
А кстати такой вопрос: при достаточно большом количестве объектов (порядка 2-3 тысяч) что будет работать быстрее (и на сколько быстрее)?

Re: Как программно убрать лишние переводы строки в MTEXT?

> Loner Wanderer
Не, тут без обиды, только дело.
Насчет чайника, не знаю кто из нас наибольший
Xa-xa
Насчет скорости ответить не могу, извини
:)
~'J'~