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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как сделать, что бы текст атрибута вписывался в рамку

Как сделать, что бы текст атрибута вписывался в рамку

Ответ
Поиск в этой теме
Непрочитано 28.08.2014, 13:28 #1
Как сделать, что бы текст атрибута вписывался в рамку
tujn08
 
Регистрация: 26.12.2013
Сообщений: 284

Привет! Спасибо модератору!
Требуется: менять значение атрибута из файла, что успешно с однострочными атрибутами (т.е. многострочные так просто не меняются).
Получилось поменять значение одного многострочного атрибута - но как ??
При всем при этом требуется, что бы текст атрибута вписывался в рамку (штамп чертежа) т.е. Автоматичесеки менялась высота и интервал между строк.


Код:
[Выделить все]
  (defun c:zng ( /)
(setq ff (open "e:\\temp.txt" "r"))
(setq nnp (read-line ff)) ;название проекта
(setq ppn1 (read-line ff));шифр
(setq ppn2 (read-line ff));название чертежа
(setq ppn3 (read-line ff));дата
(setq ppn4 (read-line ff));запас
(setq ppn5 (read-line ff));запас
(setq ppn6 (read-line ff));запас
(setq ppn7 (read-line ff));запас
   (textscr)(terpri)(terpri)(terpri)(terpri)(terpri)(terpri)(princ "===============ЗАМЕНА=НА==================")(terpri)
   (princ "название проекта =")(princ nnp)(terpri)
   (princ "шифр =")(princ ppn1)(terpri)
   (princ "название чертежа =")(princ ppn2)(terpri)
   (princ "дата =")(princ ppn3)(terpri)
   (princ "запас =")(princ ppn4)(terpri)
   (princ "запас =")(princ ppn5)(terpri)
   (princ "запас =")(princ ppn6)(terpri)
   (princ "запас =")(princ ppn7)(terpri)
            (princ "==========================================")(terpri)(terpri)(terpri)
(setq nnp1 (atoi nnp))(textscr)
(setq a1 (car(entsel"\n ВЫБЕРИТЕ блок \n: ")))
(princ "Выбран блок =")(princ a1)(terpri)
(setq a1 (entnext a1))
(setq b1 (cdr(assoc '2 (entget a1)))) 
(setq tip (cdr(assoc '0 (entget a1))))

(while b1 
  (if (or (equal tip "ATTDEF")(equal tip "ATTRIB"))
     (progn 
     (princ "b1 =")(princ b1)(terpri)
     (if (equal b1 "НАЗВПРОЕКТА") (progn 
         (setq b1 (subst (cons 1 nnp) (assoc '1 (entget a1)) (entget a1)))
         (entmod b1)(entupd a1)
         (setq zna (cdr(assoc '1 (entget a1)))) ;значение примитива
         (princ "Изменено: НАЗВАНИЕ_ПРОЕКТА на =")(princ zna)(princ "       ")(terpri)
     ))
	 (if (equal b1 "НАЗВЧЕРТЕЖА") (progn 
         (setq b1 (subst (cons 1 ppn1) (assoc '1 (entget a1)) (entget a1)))
         (entmod b1)(entupd a1)
         (setq zna (cdr(assoc '1 (entget a1)))) ;значение примитива
         (princ "Изменено: НАЗВАНИЕ_ЧЕРТЕЖА на =")(princ zna)(princ "       ")(terpri)
     ))
	 	 (if (equal b1 "СТАДИЯ") (progn 
         (setq b1 (subst (cons 1 ppn2) (assoc '1 (entget a1)) (entget a1)))
         (entmod b1)(entupd a1)
         (setq zna (cdr(assoc '1 (entget a1)))) ;значение примитива
         (princ "Изменено: СТАДИЯ на =")(princ zna)(princ "       ")(terpri)
     ))
	 	 	 (if (equal b1 "ШИФР") (progn 
         (setq b1 (subst (cons 1 ppn3) (assoc '1 (entget a1)) (entget a1)))
         (entmod b1)(entupd a1)
         (setq zna (cdr(assoc '1 (entget a1)))) ;значение примитива
         (princ "Изменено: ШИФР на =")(princ zna)(princ "       ")(terpri)
     ))
	 	 	 (if (equal b1 "ЗАКАЗЧИК") (progn 
         (setq b1 (subst (cons 1 ppn4) (assoc '1 (entget a1)) (entget a1)))
         (entmod b1)(entupd a1)
         (setq zna (cdr(assoc '1 (entget a1)))) ;значение примитива
         (princ "Изменено: Заказчик на =")(princ zna)(princ "       ")(terpri)
     ))
	 	 	 (if (equal b1 "ЛИСТОВ") (progn 
         (setq b1 (subst (cons 1 ppn5) (assoc '1 (entget a1)) (entget a1)))
         (entmod b1)(entupd a1)
         (setq zna (cdr(assoc '1 (entget a1)))) ;значение примитива
         (princ "Изменено: ЛИСТОВ на =")(princ zna)(princ "       ")(terpri)
     ))
	 	 	 (if (equal b1 "ДАТА") (progn 
         (setq b1 (subst (cons 1 ppn6) (assoc '1 (entget a1)) (entget a1)))
         (entmod b1)(entupd a1)
         (setq zna (cdr(assoc '1 (entget a1)))) ;значение примитива
         (princ "Изменено: ДАТА на =")(princ zna)(princ "       ")(terpri)
     ))
    (setq a1 (entnext a1))
    (if a1 (progn 
          (setq tip (cdr(assoc '0 (entget a1)))) ;тип примитива
         ;(princ "tip =")(princ tip)(terpri)
          (setq b1 (cdr(assoc '2 (entget a1)))) ;имя примитива
          (setq zna (cdr(assoc '1 (entget a1)))) ;значение примитива
          (if (equal tip "SEQEND")(progn (textscr)
            (setq a1 
            (car(entsel "\n ВЫБЕРИТЕ новый блок\n: "))); после отработки изменения
             ;(textscr)
              (if a1 (progn 
                   (setq a1 (entnext a1))
                   (setq tip (cdr(assoc '0 (entget a1)))) ;тип примитива
                   (setq b1 (cdr(assoc '2 (entget a1)))) ;тип примитива
                   (setq zna (cdr(assoc '1 (entget a1))));значение примитива
              ))
          ))
    ))
     (if (not a1)(progn (setq a1 nil b1 nil))) 
  ))    ;условие нахождения атрибута
)       ;цикл
(setq a1 nil b1 nil)
)

Вложения
Тип файла: dwg
DWG 2010
Чертеж1.dwg (79.3 Кб, 977 просмотров)
Тип файла: rar temp.rar (148 байт, 19 просмотров)


Последний раз редактировалось tujn08, 28.08.2014 в 14:12.
Просмотров: 3423
 
Непрочитано 01.09.2014, 00:25
#2
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Ширина многострочного атрибута лежит в 41-й паре первой с конца.
Я рекомендую заранее при создании блока задавать ширину для многострочных атрибутов (это можно сделать в редакторе блоков).
Далее немножко кода:

Код:
[Выделить все]
 (defun tg_atr_entmod (entry atrib value /)
;;;
;;;Функция изменения значения атрибута
;;;
(mapcar (function (lambda (x) (if (and (= (cdr (assoc 0 x)) "ATTRIB")
				       (= (cdr (assoc 2 x))  atrib))
		    (tg_entmod (cdr (assoc -1 x)) 1 (vl-princ-to-string value))))) (tg_get_following_data entry))

(princ)  
);end defun

(defun tg_get_following_data (entry / result)
;;;
;;;Функция поиска вложенных примитивов
;;; (атрибутов блока, вешин 2д-поли и т.п.)
(setq entry (entget entry))
(if (= (cdr (assoc 66 entry )) 1)

  (while (/= (cdr (assoc 0 (setq entry (entget (entnext (cdr (assoc -1 entry))))))) "SEQEND")
	(setq result (cons entry result ))

  );end while
  );end if

result  

);end defun

(defun tg_entmod (entry dxf_kode new_val / old_pair)
;;;
;;;Функция изменения dxf пары dxf_kode
;;;на новое значение
(if (setq old_pair (assoc dxf_kode (setq entry (entget entry))))
(entmod (subst (cons dxf_kode new_val) old_pair entry))
);end if  
);end defun
tg_atr_entmod-меняет значение атрибута. Пример блока с предзаданными ширинами атрибутов приколот.
Единственное - в версиях до 2014 у меня частенько эти ширины слетали. Решение - руками править описание блока. Все вхождения правятся автоматом.

Если вообще не вмоготу хочется менять программно, можно через ActiveX

Код:
[Выделить все]
 (defun tg_set_boundary_width (entry atr_name value / )
(vl-load-com)
(setq entry
       (vlax-ename->vla-object
	 (cdr (assoc -1
		     (car
		       (vl-remove-if-not
			 (function (lambda (x) (= atr_name (cdr (assoc 2 x)))))
			 (tg_get_following_data entry)
			);_vlrin
		       );_car
		     ))));_setq
  
(if (numberp value)(vla-put-MTextBoundaryWidth entry value))
);_defun

Вложения
Тип файла: dwg
DWG 2013
TG_10_07_Razgrafk.dwg (26.0 Кб, 884 просмотров)
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.

Последний раз редактировалось Kirill_Ja, 01.09.2014 в 00:59. Причина: Дополнил чутка
Kirill_Ja вне форума  
 
Автор темы   Непрочитано 01.09.2014, 19:45
#3
tujn08


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


Цитата:
Сообщение от Kirill_Ja Посмотреть сообщение
можно через ActiveX
Только только начал изучать - понял, что просто LISP не потянет полную автоматизацию.

В целом для того, что бы разобраться и быть как рыба в воде в Ваших функциях потребуется время- куда деваться (будем изучать).

Цитата:
Сообщение от Kirill_Ja Посмотреть сообщение
Ширина многострочного атрибута лежит в 41-й паре первой с конца
Закидаю вопросами с Вашего позволения:
1) А где можно взять полный список точечных пар? для: Мтекста, линий, дин блоков, вхождений блоков?
2) А вообще как заполучить самую полную информацию о примитиве/блоке?
3) Я так понимаю капаются в библиотеках Када. К примеру Supermax доходит до 4-5 списка вложенности в точечных парах при этом знает, что есть что. Как этого достигнуть(изучить)?
4) ActiveX дает нам все свойства и методы - только до сюда дочитал книгу))
5) Есть ли лит-ра(в продаже) по программированию свежих версий(от 2012) Акада?

Дааа - и спасибо за ответ по теме!!!
tujn08 вне форума  
 
Непрочитано 01.09.2014, 21:07
#4
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от tujn08 Посмотреть сообщение
просто LISP не потянет полную автоматизацию.
Н-да?
Цитата:
Сообщение от tujn08 Посмотреть сообщение
А где можно взять полный список точечных пар? для: Мтекста, линий, дин блоков, вхождений блоков?
DXF Reference
Цитата:
Сообщение от tujn08 Посмотреть сообщение
А вообще как заполучить самую полную информацию о примитиве/блоке?
(entget (car (entsel)) '("*"))
Цитата:
Сообщение от tujn08 Посмотреть сообщение
Я так понимаю капаются в библиотеках Када
Вообще-то нет.
Цитата:
Сообщение от tujn08 Посмотреть сообщение
К примеру Supermax доходит до 4-5 списка вложенности в точечных парах при этом знает, что есть что. Как этого достигнуть(изучить)?
Все приходит с опытом.
Цитата:
Сообщение от tujn08 Посмотреть сообщение
ActiveX дает нам все свойства и методы - только до сюда дочитал книгу))
Читай дальше
Цитата:
Сообщение от tujn08 Посмотреть сообщение
Есть ли лит-ра(в продаже) по программированию свежих версий(от 2012) Акада?
Язык AutoLISP / VisualLISP с тех пор не претерпел практически никаких изменений.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.09.2014, 07:55
#5
tujn08


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(entget (car (entsel)) '("*"))
Был заблокирован. За код спасибо (где-то я его уже находил, но потерял)

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
DXF Reference
Тоже спасибо только там не разобраться мне ))) на текущий момент.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Н-да?
Угу - в книге примерно так и было написано (ActiveX расширяет возможности- примерно так)

Далее тема не касается текущей и меня могут опять заблокировать)) - да простит меня модератор!
В ICQ писал Вам(Пардон не Вам):

Вставлен блок
Команда: (entget (car (entsel)) '("*"))
Выберите объект: ((-1 . <Имя объекта: 7ffffb10a10>) (0 . "INSERT") (5 . "3941") (102 . "{ACAD_XDICTIONARY") (360 . <Имя объекта: 7ffffb125f0>) (102 . "}") (330 . <Имя объекта: 7ffffb159f0>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (66 . 1) (2 . "*U14") (10 225.656 188.534 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))

Хотел посмотреть св-ва которые можно поменять:
Команда: (vl-load-com)
Команда: (setq vlo1 (vlax-ename->vla-object (entsel)))
Выберите объект: ; ошибка: неверный тип аргумента: lentityp (<Имя объекта: 7ffffb10a10> (225.813 188.355 0.0))

Либо неверный тип, либо мало переменных. Почему так?
И забываю спросить- как понять
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
в 41-й паре первой с конца.
Вижу (41 . 1.0) - единственную в списке. Если только... . Кстати как получить список из пары? CDR CAR получат остатки от пары.

И еще
Команда: TG_ATR_ENTMOD
; ошибка: слишком мало аргументов

----- добавлено через ~57 мин. -----
Есть два блока с одинаковыми атрибутами (многострочный, имя одинаковое)
В 1 получается изменить значение программно при этом он является многострочным
Во 2 не получается.
В свойствах вижу разницу (отмечено зеленым) + в текстовом файле при вставке \P (с новой строки) для блока 1 все работает, а для 2 нет.

Вот и вопрос, что я такого случайно сделал? И как это делать не случайно )))
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 34
Размер:	115.1 Кб
ID:	134596  Нажмите на изображение для увеличения
Название: Безымянный2.png
Просмотров: 38
Размер:	91.5 Кб
ID:	134597  

Последний раз редактировалось tujn08, 03.09.2014 в 10:02.
tujn08 вне форума  
 
Непрочитано 03.09.2014, 13:17
#6
Kirill_Ja


 
Регистрация: 28.07.2008
Мурманск
Сообщений: 208
<phrase 1=


Это тот случай когда хорошо закоментированный код решает 2/3 вопросов. Когда-нибудь научусь)))

Итак:
Цитата:
Команда: (vl-load-com)
Команда: (setq vlo1 (vlax-ename->vla-object (entsel)))
Выберите объект: ; ошибка: неверный тип аргумента: lentityp (<Имя объекта: 7ffffb10a10> (225.813 188.355 0.0))
Если речь об атрибутах, нужно и обращаться к итрибутам.
Цитата:
((-1 . <Имя объекта: 7ffffb10a10>) (0 . "INSERT") (5 . "3941") (102 . "{ACAD_XDICTIONARY") (360 . <Имя объекта: 7ffffb125f0>) (102 . "}") (330 . <Имя объекта: 7ffffb159f0>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (66 . 1) (2 . "*U14") (10 225.656 188.534 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
Если значение 66-й пары 1, то за этим примитивом идут его составные части (атрибуты например идут за блоком). Их можно получить
Код:
Последний подпримитив последовательности "SEQEND" он обозначает, что больше частей нет.
Функция
Код:
[Выделить все]
 (tg_get_following_data)
эти данные как раз и получает. Бережет мои нервы)))
А вот у атрибутов как раз есть 2-я 41-я пара, но для сложных объектов удобнее ActiveX.

Функция (entsel) выдает не только имя примитива, но координаты куда ткнули курсором (так же как (ssget)), поэтому код
Код:
[Выделить все]
 (setq vlo1 (vlax-ename->vla-object (entsel)))
выдает ошибку. На все равно это будет AX ссылка на весь блок, а нужно на атрибут.

По поводу
Цитата:
Есть два блока с одинаковыми атрибутами (многострочный, имя одинаковое)
В 1 получается изменить значение программно при этом он является многострочным
Во 2 не получается.
В свойствах вижу разницу (отмечено зеленым) + в текстовом файле при вставке \P (с новой строки) для блока 1 все работает, а для 2 нет.

Вот и вопрос, что я такого случайно сделал? И как это делать не случайно )))
Код в студию, блоки в студию.
И еще рекомендую пользоваться редактором vlide. Все равно к этому придешь. Лучше сразу и начинать.
__________________
Мне не нужно сделать за меня. Если я что-то ищу, то пути решения.
Kirill_Ja вне форума  
 
Автор темы   Непрочитано 03.09.2014, 14:29
#7
tujn08


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


Цитата:
Сообщение от Kirill_Ja Посмотреть сообщение
Код в студию, блоки в студию.
Код тот же, но для правильности понимания и экспериментов немного изменил (добавил имена атрибутов для поиска и замены)

Имеем:
форматку в которой надо(хочу): все поля заполнять из файла. Справа эксперементальный блок там тоже есть многострочные атрибуты- какие-то из них не меняются так же, а какие-то меняются. Файл для чтения данных в программе значится тут e:\\temp.txt (приложен).

По Вашему ответу - на что-то раскрыли мне глаза(напомнив об этом )

Отступление от темы:
Кроме того, что получится менять значения многострочных Атрибутов - бывают моменты когда текст очень длинный и придется писать функцию по изменению интервала и сужения.
Дальше:
В форматке видим фамилии с подписями как дин блок. Что бы не ходить во крут да около - программно из реестра буду брать данные о текущем пользователя (разраб) и менять блок под него. \Пров\ - по должности выше \разраб\ из БД в программе или файле. \ГИП\ и \Н.контр\ из файла. Суммарно- надо менять видимость блока внутри блока (надо изучать, а как иначе ) ну и Мтекст (как выяснилось атрибуты не везде спасут)

----- добавлено через ~48 мин. -----
Зашел сюда: http://autolisp.ru/2014/06/27/dynblocks-parameters/ (вставка ссылки не сработала)
И опять

Команда: (_kpblc-get-dyn-block-list-prop-and-values)
; ошибка: слишком мало аргументов

Каких аргументов не хватает не понимаю
Вложения
Тип файла: rar Новая папка (2).rar (292.5 Кб, 19 просмотров)
tujn08 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как сделать, что бы текст атрибута вписывался в рамку

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать зачеркнутый текст Mzw AutoCAD 14 07.02.2022 11:28
Как сделать текст с подчеркиванием? ilka_t AutoCAD 34 19.06.2018 12:26
Взорвать текст, сделать тип линии konstruktor AutoCAD 13 31.05.2009 13:38
Все поля преобразовать в текст. Как это сделать? Pave1 AutoCAD 4 11.08.2006 12:45
Как сделать обьемный текст в AutoCAD? Russsian AutoCAD 10 12.10.2005 12:37