Вопрос по (entmake MTEXT). Правильная реализация.
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вопрос по (entmake MTEXT). Правильная реализация.

Вопрос по (entmake MTEXT). Правильная реализация.

Ответ
Поиск в этой теме
Непрочитано 21.07.2007, 20:14 #1
Вопрос по (entmake MTEXT). Правильная реализация.
Tonic
 
Воронеж
Регистрация: 26.06.2007
Сообщений: 151

Что-то ошибки плодятся =)
Мне нужно запомнить строку из трёхстрочного edit в DCL, после чего вставить этот текст в штамп. Кстати, параллельный вопрос: когда запускаю окно-dcl в BricsCAD, можно прыгать со строки на строку Enter'ом, а AutoCAD это почему-то не позволяет.
Так вот, думал вставить этот текст с помощью MTEXT аккурат в рамку, с выравниваниями по центру. Сколько ни делал - разные ошибки.
Какие dxf-коды необходимо использовать?
И почему всё-таки Автокад не разрешил переходить на новый абзац в трёхстрочном edit? Было бы удобно, если бы текст вставлялся в таком виде, как он написан.
Просмотров: 6217
 
Непрочитано 21.07.2007, 23:04
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402


Насчет dcl мало что могу сказать (кроме того, что можно попробовать, например shift+enter / alt+enter / ctrl+enter ну или в разных вариантах), а вот по поводу entmakex для mtext варианты есть
1. Обязательными группами являются, по-моему, 100 и 40 (помимо остальных обязательных - тип 0, 10, 7 и т.п.)
2. При создании надо учитывать, что в группе 1 хранятся первые 250 символов текстовой строки, включая знаки форматирования, остальное идет с разбивкой по 250 символов в 3-ю группу.
3. Общая длина текстовой строки не может превышать 32 с чем-то там тысячи символов.
4. Перенос строки в многострочном тексте (по крайней мере в acad 2005) идет как "\\P", в предыдущих версиях, по-моему, было допустимо использовать "\n".
И, наконец, последнее. Можно четко по справке узнать, какие dxf-группы необходимы. Это (гарантированно) 100, 0, 10, 71, 72, 1 (возможно, 3 - по правилам, описанным выше) и 50. При использовании "нестандартного" выравнивания обязательно назначение 11-й группы (см. О некоторых свойствах текстовых примитивов - там, конечно, рассматривается однострочный текст, но технология применима и для многострочника, насколько я понимаю).
Вопрос о тех, какие dxf минимально необходимы для создания примитива, кстати, решался здесь.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.07.2007, 23:30
#3
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Включил все необходимые группы - всё равно "Ошибка: неверный тип аргумента":
Код:
[Выделить все]
(entmake (list
	     '(0 . "MTEXT")
	     '(67 . 0)
	     '(62 . 256)
	     '(100 . "AcDbEntity")
	     '(100 . "AcDbMText")
	     '(7 . "Standard")
	     '(48 . 1.0)
	     '(60 . 0)
	     '(8 . "00" )
	     '(71 . 5)
	     '(72 . 1)
	     '(73 . 1)
	     (cons 10 p12)
	     '(11 . 1.0 0.0 0.0)
	     '(50 . 0.0)
	     '(40 . 300)
	     '(41 . 12000)
	     '(42 . 8000)
	     '(43 . 800)
	     '(44 1.0)
	     (cons 1 s21)
	   )
  )
А зачем //p? Я думал, надо задать ширину текста, высоту, а он уже сам перенесётся автоматически. Т.е. будет две строки в пределах прямоугольных границ, если заданная строка не поместится по ширине на одной строке.
Tonic вне форума  
 
Непрочитано 21.07.2007, 23:47
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402


Во-первых, в самом списке ошибка.
Во-вторых, чему равна s21 на момент запуска?
Такой код работает (acad2k5):
Код:
[Выделить все]
(defun test ()
  (setq p12 (getpoint)
        s21 (getstring "\nString : ")
        ) ;_ end of setq
  (entmake (list
             '(0 . "MTEXT")
             '(67 . 0)
             '(62 . 256)
             '(100 . "AcDbEntity")
             '(100 . "AcDbMText")
             '(7 . "Standard")
             '(48 . 1.0)
             '(60 . 0)
             '(8 . "00")
             '(71 . 5)
             '(72 . 1)
             '(73 . 1)
             (cons 10 p12)
             (cons 11 '(1.0 0.0 0.0))
          ; либо '(11 1. 0. 0.)
             '(50 . 0.0)
             '(40 . 300)
             '(41 . 12000)
             '(42 . 8000)
             '(43 . 800)
             '(44 . 1.0)
             (cons 1 s21)
             ) ;_ end of list
           ) ;_ end of entmake
  ) ;_ end of defun
И, в-третьих. Перенос строки будет только если есть в ней пробелы. Если пробелов нет, то и переноса не будет. Лучше (ИМХО, конечно) задавать ширину текста (группа 42) в 0, и принудительно расставлять переносы строк. В таком варианте по крайней мере будет предсказуемый результат.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.07.2007, 00:24
#5
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


1. Ошибку осознал =)
2. строка берёт значение из edit, этому и равна, тут ошибок нет
3. Пробелы в строке будут точно.

Запустилась, но с оговорками. Если в edit поставить enter, то в итоговой строке будет знак "?" на этом месте, к тому же перенос осуществится со сдвигом. Всё получится отлично только если в поле edit DCL-файла писать в одну строку, без перехода на след. абзац.
[ATTACH]1185049457.jpg[/ATTACH]
Tonic вне форума  
 
Автор темы   Непрочитано 22.07.2007, 14:39
#6
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Да, вот ещё: есть ли какая-нибудь dxf-группа, отвечающая за степень сжатия текста? (MTEXT'а)
Tonic вне форума  
 
Непрочитано 22.07.2007, 18:48
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402


Это в строке ключ \W надо использовать
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.07.2007, 19:54
#8
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


В какой строке? Это для сжатия, для нормального переноса или стирания знака вопроса?
Tonic вне форума  
 
Непрочитано 22.07.2007, 23:10
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402


Для форматирования отдельных символов и слов надписи во внешнем редакторе в текст можно включать управляющие коды. С помощью управляющих кодов можно получать подчеркнутые, надчеркнутые и дробные надписи. Также имеется возможность задавать цвет, шрифт и размер символов. Кроме того, допускается изменение расстояния между символами текста и увеличение их ширины. Перечень управляющих кодов приводится в следующей таблице.



Код
Назначение
Что вводится
Результат

\0...\o
Включение и отключение

надчеркивания
Autodesk \OAutoCAD\o


\L...\l
Включение и отключение надчеркивания

надчеркивания
Autodesk \OAutoCAD\o


\~

Включение и отключение надчеркивания

пространстве
Autodesk AutoCAD\~LT


\\
Вставка обратной косой черты
Autodesk \\AutoCAD


\{...\}
Вставка открывающей и закрывающей фигурных скобок
Autodesk \{AutoCAD\}


\Cзначение;
Изменение шрифта

определенный цвет
Autodesk \C2;AutoCAD


\ имя файла;
Изменение шрифта

определенный файл шрифтов
Autodesk \Ftimes; AutoCAD


\Hзначение;
Изменение высоты символов

высота, определенная в

(единицах рисунка)
Autodesk \H2;AutoCAD


\HзначениеX;
Умножение текущей высоты символов

на несколько

коэффициент (буква Х латинская)
Autodesk \H3x;AutoCAD


\S...^...;
Построение дробного текста с разбиением по символу \\, # или ^
1.000\S+0.010^-0.000;


\Tзначение;
Изменение расстояния между символами с коэф. от 0.75 до 4
\T2;Autodesk


\Qугол;
Изменение угла наклона символов
\Q20;Autodesk


\Wзначение;
Изменение коэффициента растяжения символов
\W2;Autodesk


\A
Установка режима выравнивания; допустимые значения: 0, 1, 2

(вниз, по центру, вверх)
\A1;1\S1/2


\P

Символ конца абзаца
Autodesk\PAutoCAD



Допускается вложенность фигурных скобок до восьми уровней.

Управляющие коды могут также использоваться в размерных текстах (в частности для обозначения допусков). Пример:

Пример: Форматирование текста во внешнем текстовом редакторе
Для создания во внешнем редакторе следующей надписи



следует ввести следующие строки:

{{\H1.5x; Большой текст} \A2; над текстом\A1;/\A0; за текстом}\P
{\A0;Базовый: 1 \S1/2;}\P
{\A1;По центру: 1 \S1/2;}\P
{\A2;Верхняя линия: 1 \S1/2;}\P
{Допуски: \A1;1.000\H.75x;\S+0.010^-0.000;}\P
{Архитектурный: 9-{\H.666x;\A2;11\A1;/\A0;16}\A2;"}\P
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 23.03.2011 в 02:49.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.07.2007, 00:15
#10
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Хм... а причём здесь внешний редактор? Надо всего лишь, чтобы при нажатии на Enter не происходило сдвига текста и вставки знака вопроса, и текст был немного сжат. И это всё - в поле edit, откуда он сохраняется в переменную и вставляется как Mtext. На каком шаге проделывать операции с данными кодами? Что-то не пойму =)
Tonic вне форума  
 
Непрочитано 23.07.2007, 09:56
#11
Zouss


 
Регистрация: 14.03.2006
Сообщений: 863


после dcl, но перед entmake - то есть перед тем, как создать MText вы, по необходимости, можете обработать значение edit, добавив нужные управляющие символы
Zouss вне форума  
 
Непрочитано 22.03.2011, 23:27
#12
Fynjy87


 
Регистрация: 29.04.2009
Сообщений: 21


Здравствуйте!

У меня тоже возникла проблема с созданием многострочного текста. По поиску нашел эту тему, взял за основу код из сообщения #4 и добавил туда значения, которые для надежности вынул из уже готового текста с нужными параметрами. Вот что получилось:
Код:
[Выделить все]
 (defun test ()
  (entmake (list
             '(0 . "MTEXT")
             '(1 . "Проверка")
             '(7 . "Аннотативный")
             '(8 . "0")
             '(10 7.5 2.5 0.0)
             '(11 1.0 0.0 0.0)
             '(40 . 1.25)
             '(41 . 5.0)
             '(42 . 7.47116)
             '(43 . 1.64474)
             '(44 . 1.0)
             '(48 . 1.0)
             '(50 . 0.0)
             '(60 . 0)
             '(62 . 256)
             '(67 . 0)
             '(71 . 5)
             '(72 . 5)
             '(73 . 1)
             '(100 . "AcDbEntity")
             '(100 . "AcDbMText")
          ) ;_ end of list
  ) ;_ end of entmake
) ;_ end of defun
Но когда пытаюсь эту команду применить, в коммандной строке просто возващается список:
Код:
[Выделить все]
Команда: (test)
((0 . "MTEXT") (1 . "Проверка") (7 . "Аннотативный") (8 . "0") (10 7.5 2.5 0.0) 
(11 1.0 0.0 0.0) (40 . 1.25) (41 . 5.0) (42 . 7.47116) (43 . 1.64474) (44 . 
1.0) (48 . 1.0) (50 . 0.0) (60 . 0) (62 . 256) (67 . 0) (71 . 5) (72 . 5) (73 . 
1) (100 . "AcDbEntity") (100 . "AcDbMText"))
Подскажите, пожалуйста, в чем ошибка.

Последний раз редактировалось Fynjy87, 22.03.2011 в 23:36.
Fynjy87 вне форума  
 
Непрочитано 23.03.2011, 00:36
#13
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Fynjy87 Посмотреть сообщение
Но когда пытаюсь эту команду применить, в коммандной строке просто возващается список:
После выполнения (test) введи (entget (entlast)) - и ты наверное удивишься - заодно обрати внимание на порядок следования ассоциативных пар.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 23.03.2011, 00:39
#14
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402


entmake возвращает список, а entmakex - ename-указатель на созданный примитив (если, конечно, он был создан)
P.S. Насколько я помню, для многострочного текста последовательность dxf-групп особой роли не должна играть. Или нет?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.03.2011, 01:39
#15
Fynjy87


 
Регистрация: 29.04.2009
Сообщений: 21


Цитата:
Сообщение от Дима_ Посмотреть сообщение
После выполнения (test) введи (entget (entlast)) - и ты наверное удивишься - заодно обрати внимание на порядок следования ассоциативных пар.
Да, я действительно удивился) Увидел, что создался мультитекст с нулевой строкой в начале координат. Но т.к. с лиспом познакомился три или четыре дня назад, причины ошибки так пока и не понимаю.

Порядок следования сначала был такой, как в примере #4. Но результат получился аналогичным. Это я уже потом отсортировал, чтобы удобнее было проверить, не пропустил ли я чего.

Буду благодарен, если объясните понятным новичку языком, в чем проблема. Можно отослать к какой-нибудь статье или конкретной главе в доступной по сети книге, я не против самостоятельно разобраться. Было бы по чему.
Fynjy87 вне форума  
 
Непрочитано 23.03.2011, 08:34
#16
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Переставляй пары местами.
Порядок следования можно посмотреть в entget-листе уже имеющегося на чертеже мультитекста.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 23.03.2011, 10:12
#17
Fynjy87


 
Регистрация: 29.04.2009
Сообщений: 21


Цитата:
Сообщение от Do$ Посмотреть сообщение
Переставляй пары местами.
Порядок следования можно посмотреть в entget-листе уже имеющегося на чертеже мультитекста.
Со второго раза дошло) Порядок действительно имеет значение. Все работает. Спасибо!
Fynjy87 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вопрос по (entmake MTEXT). Правильная реализация.