Тема: Коэффициент сжатия
Доброго всем дня. Скажите пожалуйста как "сжать" текст в ячейке таблицы, т.е. установить коэффициент сжатия текста?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Коэффициент сжатия
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Доброго всем дня. Скажите пожалуйста как "сжать" текст в ячейке таблицы, т.е. установить коэффициент сжатия текста?
Установить ячейке(или типу ячеек) соответствующий текстовый стиль (с нужным коэф. сжатия).
> Vildar
А если мне надо в конкретной ячейке таблицы сжать текст, а не весь текст сжимать как быть???
> Дашуля
Как посоветовал Vildar это единственный способ
Немного собрал всяко-разно, может пригодится:
Option Explicit Sub TEST() Dim ar As Variant, _ e As AcadEntity, _ t As AcadTable, _ p As Variant, _ ip As Variant, _ r As Long, _ c As Long, _ st As String, _ ns As String, _ d As Double With ThisDrawing.Utility .GetEntity e, ip, "Select table" p = .GetPoint(, "Pick a point inside the desired cell") End With Set t = e ar = GetTableCell(t, p, r, c) r = ar(0) c = ar(1) ' debug only: ' MsgBox "Row " & r & ", Column " & c & vbCr & _ ' "Value: " & t.GetText(r, c) st = t.GetCellTextStyle(r, c) d = CDbl(InputBox("Enter width factor for this cell:", "Cell Text Width", "0.75")) CopyTextStyle st, d, ns t.SetCellTextStyle r, c, ns t.Update End Sub Function GetTableCell(ByVal oTable As AcadTable, ByVal varPt As Variant, _ ByRef rowIndex As Long, ByRef colIndex As Long) As Variant Dim wviewVec As Variant Dim resVar(1) As Long wviewVec = ThisDrawing.GetVariable("VIEWDIR") oTable.HitTest varPt, wviewVec, rowIndex, colIndex resVar(0) = rowIndex resVar(1) = colIndex GetTableCell = resVar End Function Public Function TextStyleExists(styleName As String) As Boolean '// Frank Oquendo's technic Dim obj As AcadTextStyle On Error Resume Next Set obj = ThisDrawing.TextStyles.Item(styleName) TextStyleExists = (Err.Number = 0) End Function Public Function CopyTextStyle(stlName As String, dblWidth As Double, ByRef newname As String) As Boolean On Error GoTo Err_Handler Dim oTxtStyle As AcadTextStyle Set oTxtStyle = ThisDrawing.TextStyles(stlName) ThisDrawing.ActiveTextStyle = oTxtStyle If InStr(1, stlName, "-", vbTextCompare) <> 0 Then newname = Left(stlName, InStr(1, stlName, "-", vbTextCompare) - 1) & "-" & CStr(dblWidth * 100) Else newname = stlName & "-" & CStr(dblWidth * 100) End If If Not TextStyleExists(newname) Then Set oTxtStyle = ThisDrawing.TextStyles.Add(newname) oTxtStyle.width = dblWidth ThisDrawing.Save CopyTextStyle = True End If Exit_Here: Exit Function Err_Handler: Select Case Err.Number Case -2145320861 CopyTextStyle = False Resume Exit_Here Case Else CopyTextStyle = False MsgBox "Error " & Err.Description, "CopyTextStyle", Err.Number Resume Exit_Here End Select End Function Function GetCellText(ByRef rowMax As Long, ByRef rowMin As Long, _ ByRef ColMax As Long, ByRef ColMin As Long) As Variant Dim pfSet As AcadSelectionSet Set pfSet = ThisDrawing.PickfirstSelectionSet Dim oTable As AcadTable If pfSet.Count = 1 Then Set oTable = pfSet.Item(0) oTable.GetSubSelection rowMin, rowMax, ColMin, ColMax Else Exit Function End If pfSet.Clear GetCellText = oTable.GetText(rowMin, ColMin) End Function
~'J'~
> Vildar
Скажите пожалуйста как воспользоваться методом SetCellTextStyle ???
Я посмотрела в справке и нашла
object.SetCellTextStyle(row, col, bstrName)
bstrName - я так поняла это название текстового стиля.
row - это строка
col - столбец
Загвоздка заключается в bstrName. Вся таблица заполненна текстовым стилем без сжатия текста, а одна ячейка должна быть с сжатием. Что же указать вместо bstrName??? Что же получается что нужно вызвать процедуру создания нового текстового стиля с сжатием, затем применить метод SetCellTextStyle, указав вместо bstrName название текущего созданного стиля, а затем опять вызвать процедуру создания текста без сжатия и продолжить создание таблицы????
> Дашуля
Если нет нужного текстового стиля со сжатием, то да, его нужно создать. А зачем его делать текущим?
Для конкретной ячейки делаете SetCellTextStyle с именем нужного стиля.
... а затем опять вызвать процедуру создания текста без сжатия и продолжить создание таблицы????
А это еще зачем? Бессмыслеца (правильно написал?).
Возможно есть другие варианты. Например через форматирование текста. Но тут я пас. Самому бы было интересно узнать.
Возможно есть другие варианты. Например через форматирование текста
Блин, все гениальное просто, а я не додумался,
действительно все проще некуда:
Option Explicit Sub TEST() Dim ar As Variant, _ e As AcadEntity, _ t As AcadTable, _ p As Variant, _ ip As Variant, _ r As Long, _ c As Long, _ st As String, _ ns As String, _ d As Double, _ vl As String, _ ret As String With ThisDrawing.Utility .GetEntity e, ip, "Select table" p = .GetPoint(, "Pick a point inside the desired cell") End With Set t = e ar = GetTableCell(t, p, r, c) r = ar(0) c = ar(1) vl = t.GetText(r, c) ret = Mid(vl, InStr(1, vl, ";", vbTextCompare) + 1) If InStr(1, vl, ";") <> 0 Then vl = Left(ret, Len(ret) - 1) End If MsgBox vl d = CDbl(InputBox("Enter width factor for this cell:", "Cell Text Width", "1.75")) vl = "{\W" & CStr(d) & ";" & vl & "}" t.SetText r, c, vl t.Update End Sub
Молодец!
~'J'~
> fixo
А где взять инфу по такому редактированию?
vl = "{\W" & CStr(d) & ";" & vl & "}"
Откуда получаем строку например:
"{\W0.5;текст ячейки}"
Ну и текст соответственно форматируется.
Кста такая "белиберда" встречается в текстах редактируемых СПДС-ом.
В соседней теме, похожй вопрос, https://www.caduser.ru/forum/topic44585.html
С кубом и квадратом, для м3 и м2. Тоже нужная вещь.
В справке Акад2008рус нашел:
Руководство пользователя AutoCAD 2008 > Аннотирование чертежей > Примечания и метки > Работа с внешними текстовыми редакторами >
\A2 - для перевода в верхний индекс.
> Vildar
см. коды форматирования многострочных текстов (в справке)
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Коэффициент сжатия
Форум работает на PunBB, при поддержке Informer Technologies, Inc