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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Изменение объектов CGLC программно (Lisp)

Изменение объектов CGLC программно (Lisp)

Ответ
Поиск в этой теме
Непрочитано 16.09.2014, 11:51 #1
Изменение объектов CGLC программно (Lisp)
AndruxaZ
 
Регистрация: 07.05.2013
Сообщений: 48

Всем здравствуйте. Пытаюсь изменять объекты СПДС GraphiCS программно на Lisp. Что-то уже получается.
Вот код для изменения значений, которые берутся из атрибутов блока.
Код:
[Выделить все]
 (defun c:zaq ( / spis nom SL1 SL2)
  (setq spis (get-all-atts (car(entsel "\nВыбери блок:"))))
  (setq spis (nth 0 spis))
  (setq nom (cdr spis))
  (setq SL1 (entsel "\nВыбери рамку:"))
  (setq SL2 (entget (car SL1)))
  (princ)
  (setq SL1 (cadr (member '(301 . "Obozn") SL2)))
  (princ)
  (setq SL2 (subst (cons 300 nom) SL1 SL2))
  (princ)
  (entmod SL2)
  (princ)
);_end of defun zaq

(defun get-all-atts (obj)
    ;;;Use (get-all-atts (car(entsel "\nSelect block:")))
    ;;;Returs list  (("TAG1" . "Value1")("TAG2" . "Value2") ...)
(vl-load-com)
    (if (= (type obj) 'ENAME)
		(setq obj (vlax-ename->vla-object obj)))
  (if (and obj
           (vlax-property-available-p obj 'Hasattributes)
	   (eq :vlax-true (vla-get-HasAttributes obj))
      )
    (vl-catch-all-apply
      (function
	(lambda	()
	  (mapcar (function (lambda (x)
			      (cons (vla-get-TagString x)
				    (vla-get-TextString x)
			      )
			    )
		  )
		  (append (vlax-invoke obj 'Getattributes)
			  (vlax-invoke obj 'Getconstantattributes)
		  )
	  )
	)
      )
    )
  )
);_end of defun get-all-atts
Просмотров: 1531
 
Непрочитано 16.09.2014, 12:04
#2
Кулик Алексей aka kpblc
Moderator

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


1. В чем собственно вопрос? Или это "похвастаться" показано?
2. В Download был материал по работе с объектами СПДС через СОМ (также информация была и на сайте spds.ru, если я не ошибаюсь)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.09.2014, 12:14
#3
AndruxaZ


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


Хвастаться то нечем.
Извиняюсь не весь текст сообщения сохранился.
Вопрос в следующем. Возможно ли изменение одновременно нескольких точечных пар (которые все 300 и 301) программно?
Вот что выдаёт entget:
Команда: (entget (car (entsel)))
Выберите объект: ((-1 . <Имя объекта: 7ef03730>) (0 . "SPDSFORMAT") (5 . "286")
(102 . "{ACAD_XDICTIONARY") (360 . <Имя объекта: 7ef03760>) (102 . "}") (330 .
<Имя объекта: 7ef01cf8>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"0") (48 . 7.0) (100 . "SPDSFORMAT") (100 . "SPDSFORMAT") (90 . 1) (301 .
"Name") (300 . "Формат") (301 . "Info") (300 .
"Обозначение\t\nФормат\tA4\nЛист\t") (301 . "Scale") (40 . 7.0) (301 .
"Author") (300 . "") (301 . "Author(date)") (300 . "") (301 . "Mater") (300 .
"") (301 . "Name") (300 . "Формат") (301 . "Number") (300 . "") (301 . "Number
2") (300 . "") (301 . "Object") (300 . "") (301 . "Obozn") (300 . "") (301 .
"OriginX") (40 . 4463.13) (301 . "OriginY") (40 . 1051.5) (301 . "Product")
(300 . "") (301 . "Sheet") (300 . "") (301 . "SheetCount") (300 . "1") (301 .
"Stage") (300 . "") (301 . "Масса") (300 . "") (301 . "Масштаб") (300 . "")
(301 . "Format") (300 . "A4") (301 . "DimScale") (40 . 1.0) (301 .
"Autonumerated") (290 . 1) (301 . "First sheet") (290 . 1) (301 . "Show zones")
(290 . 0) (301 . "Extended view") (290 . 0) (301 . "Zone") (90 . 1) (301 .
"idTemplate") (40 . 4.47883e+060) (301 . "Orientation") (300 . "Вертикальный")
(301 . "Multiplicity") (90 . 1) (301 . "Text style") (300 . "ГОСТ 2.304"))


----- добавлено через ~2 мин. -----
Скажем, поменять значения для (301 . "Mater") (300 ."") и (301 . "Obozn") (300 . "")
AndruxaZ вне форума  
 
Непрочитано 16.09.2014, 12:37
#4
Кулик Алексей aka kpblc
Moderator

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


Я далеко не уверен, что подобное возможно сделать. Как вариант:
Код:
[Выделить все]
 (defun test (lst key value / prev sublst)
          ; lst = обрабатываемый список
          ; key = "Sheet". Не зависит от регистра
          ; value = устанавливаемое значение.
  (if (setq sublst (member (cons 301 (strcase key))
                           (mapcar
                             (function
                               (lambda (x)
                                 (if (and (= (car x) 301)
                                          (= (type (cdr x)) 'str)
                                          ) ;_ end of and
                                   (cons (car x) (strcase (cdr x)))
                                   x
                                   ) ;_ end of if
                                 ) ;_ end of lambda
                               ) ;_ end of function
                             lst
                             ) ;_ end of mapcar
                           ) ;_ end of member
            ) ;_ end of setq
    (progn
      (setq prev   ((lambda (/ count res)
                      (setq count 0)
                      (while (< count (- (length lst) (length sublst)))
                        (setq res   (cons (nth count lst) res)
                              count (1+ count)
                              ) ;_ end of setq
                        ) ;_ end of while
                      (reverse res)
                      ) ;_ end of lambda
                    )
            sublst (subst (cons 300 value) (assoc 300 sublst) sublst)
            lst    (append prev sublst)
            ) ;_ end of setq
      (entmod lst)
      (entupd lst)
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.09.2014, 12:45
#5
AndruxaZ


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


Алексей, спасибо! Буду изучать код.
Алексей, переменная key - это и будет значение 301-ой пары?
AndruxaZ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Изменение объектов CGLC программно (Lisp)

Реклама i


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA. Многократный ввод данных и изменение положения объектов Markiza-2010 Программирование 6 28.06.2010 02:30
Lisp: Обработка объектов и получение списка свойств (координаты точек) Nanotronic LISP 2 23.04.2009 23:07
Изменение пути внедряемых объектов в файл AutoCAD Abzorbo AutoCAD 7 16.02.2009 17:32
LISP. Распределение по слоям объектов dim.,hatch,text Суханова LISP 5 28.08.2008 13:31
FILTER / фильтр BM60 Справочник команд 0 08.07.2008 15:35