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

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

Lisp определить цвет выбранного объекта (отрезок, полилиния)

Ответ
Поиск в этой теме
Непрочитано 25.12.2014, 08:26 #1
Lisp определить цвет выбранного объекта (отрезок, полилиния)
Марк_Филипыч
 
Регистрация: 27.04.2014
Сообщений: 7

(setq pt12(entsel "Выбрать линию:"))

(setq en0 cdr((assoc 62 (car(pt12))); <----------------------- ; ошибка: неверно сформированный список на входе
; <----------------------- никак не могу исправить
(setvar "cecolor" en0)
Просмотров: 2882
 
Непрочитано 25.12.2014, 08:51
#2
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Ощущение такое, что Вы и не пробовали исправить
Када нет, но как то так:

(setq pt12 (car (entsel "Выбрать линию:"))
en0 (cdr (assoc 62 (entget pt12)))
)

или

(vla-get-color (vlax-ename->vla-object (car (entsel "\nВыбрать линию..."))))

Последний раз редактировалось roaa, 25.12.2014 в 08:57.
roaa вне форума  
 
Непрочитано 25.12.2014, 09:16
#3
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


(setq en0 (cdr (assoc 62 (entget (car pt12)))))
trir на форуме  
 
Автор темы   Непрочитано 25.12.2014, 09:24
#4
Марк_Филипыч


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


Большое спасибо, буду пробовать.
P.S. вы бы знали сколько я времени убил пытаясь это написать. Лисп изучаю вторую неделю, большие проблемы с синтаксисом. vla мне сейчас не осилить

Прочитал что (command "_pLine" pt1 pt2 ""); выполняется асинхронно в лиспе

как можно по другому написать, если это возможно?

пытаюсь написать лисп по замене части отрезка пунткироной линией вот полный код моего произведения собранного из других кодов на форуме:


Код:
[Выделить все]
 

(defun c:punktir_pline( /  en0 en1 *error* pt22)
  (vl-load-com)

(defun *error*(msg) ; <----------------------- обработка ошибок
(princ msg) ;_ печатаем сообщение
(if old_cecolor (setvar "cecolor" old_cecolor));        цвет
(if oldlr (setvar "CLAYER" oldlr)) ;                    слой
(if oldcelweight (setvar "celweight" oldcelweight ));   толщина
(if oldceltype (setvar "celtype" oldceltype)) ;         тип линий
(if osm (setvar "OSMODE" osm)) ;         привязка
(if scmde (setvar "CMDECHO" scmde)) ; 
(if bli (setvar "BLIPMODE" bli)) ; 
) 

   (setvar "OSMODE" 559);включение привязок
  ;сохранение настроек
   (setq osm (getvar "OSMODE") scmde (getvar "CMDECHO") bli (getvar "BLIPMODE"))
;                     слой                          тип линии                        толщина                          цвет
 (setq oldlr (getvar "clayer") oldceltype (getvar "celtype") oldcelweight (getvar "celweight")  old_cecolor (getvar "cecolor"))          ;сохранение настроек слоя

  (setvar "CMDECHO" 0);тихий режим
  (setvar "BLIPMODE" 0);отключение маркеров
  (setq pt12 T);тест для повтора

(setvar "clayer" "штриховка")(princ)           ; <----------------------- настройки свойств линии
(setvar  "celtype" "ACAD_ISO03W100")(princ)
(setvar  "celweight" 5)(princ)

  (setq pt12(entsel "Выбрать линию:"))
  (while pt12 ;повтор выбора

;(setq en0 cdr((assoc 62 (car(pt12))); <----------------------- ;          ошибка: неверно сформированный список на входе 
; <-----------------------                                никак не могу исправить :(  
;(setvar "cecolor" en0)

  (setq pt22(car pt12))
  (redraw pt22 3)
    (setq pt1(getpoint "\nУкажите первую точку разрыва: "))
   (setq pt2(getpoint pt1"\nУкажите вторую точку разрыва: "))
  (command "._BREAK" pt12 "_F" pt1 pt2);разорвать линию
  (setvar "OSMODE" 0);отключение привязок
  (command "_pLine" pt1 pt2 "");рисование линии
  (setvar "OSMODE" osm);включение привязок
(setq pt12(entsel "Выбрать линию:"))
  ) ;завершение повтора 
     (setvar "CMDECHO" scmde) (setvar "BLIPMODE" bli)
(setvar "clayer" oldlr) (setvar  "celtype" oldceltype) (setvar  "celweight" oldcelweight) (setvar "cecolor" old_cecolor)  (princ)
(princ)
  )
;; the end______________________

Марк_Филипыч вне форума  
 
Непрочитано 26.12.2014, 00:02
#5
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Получилось так:
Условия:
1. Тип линии должен существовать
2. Тип линии должен быть выбран

Код:
[Выделить все]
 
(defun C:ins2line ()
;;; Функция замены части линии-полилинии отдельной линией
(defun _sensor_trim_2_line ( / ent pt1 pt2 )
;;; Функция обрезки линии
  (cond 
        (  (not
             (and
               (setq ent (car (entsel "\nВыберите линию или полилинию... ")))
               (member (cdr (assoc 0 (entget ent)))(list "LINE" "LWPOLYLINE"))
             )
           )
           (princ "\nЛиния не выбрана. Программа завершена...")
           nil
         )
         (  (not
              (and
                (setq pobj (vlax-ename->vla-object ent))
                (setq pt1  (vlax-curve-getClosestPointTo pobj (getpoint "\nНачало линии...") nil))
                (setq pt2  (vlax-curve-getClosestPointTo pobj (getpoint "\nnКонец линии...") nil))
              )
            )
            (princ "\nТочки не выбраны. Программа завершена...")
            nil
         )
         (  t 
            (command "_.break" ent pt1 pt2)
            (list pt1 pt2)
         )
  )
)

  (setq oldecho  (getvar "CMDECHO") 
        oldmode  (getvar "Osmode")
  )
  (setvar "CMDECHO" 0) 
  (setvar "Osmode" 16383)
  (while 
    (setq lpoint (_sensor_trim_2_line))
    (command "_.pLine" (car lpoint)(cadr lpoint) "")
  )
  (setvar "Osmode" oldmode)
  (setvar "CMDECHO" oldecho)
)

Последний раз редактировалось roaa, 26.12.2014 в 12:39.
roaa вне форума  
 
Автор темы   Непрочитано 26.12.2014, 08:09
#6
Марк_Филипыч


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


спасибо буду изучать код.



(setq en0 (cdr (assoc 62 (entget (car pt12))))) строка присваевает en0 значение, как число (en0=20)

а строка (setvar "cecolor" en0) требует, насколько я понял, чтобы оно было как текст (en0="20")

вот как доставить эти кавычки или преобразовать число в текст я не нашел.

пробовал (strcat (chr 34) en0 (chr 34)). не получилось

в vba есть функция cstr() в лиспе я её не нашел



не смог понять:

(while
(setq lpoint (_sensor_trim_2_line))
(command "_.pLine" (car lpoint)(cadr lpoint) "")

какое условие проверят while (он проверяет lpoint что оно не nil?)
(_sensor_trim_2_line) возвращает значение координат двух точек, а куда девалось значение ent (оно вроде должно тоже записываться, причем впереди координат)

Последний раз редактировалось Марк_Филипыч, 26.12.2014 в 09:30. Причина: появились вопросы :)
Марк_Филипыч вне форума  
 
Непрочитано 26.12.2014, 12:13
#7
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Марк_Филипыч Посмотреть сообщение
а строка (setvar "cecolor" en0) требует, насколько я понял, чтобы оно было как текст (en0="20")
Кто сказал? cecolor - переменная числового типа.
P.S. Добро пожаловать в тему "Научите лиспу на примере"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.12.2014, 12:32
#8
roaa

ОПС
 
Регистрация: 29.03.2012
Kazakhstan
Сообщений: 128


Для начала почитайте http://aco.ifmo.ru/~nadinet/html/oth...book/lisp.html
Преобразование целого числа в строковую константу (itoa <целое>)
Цитата:
какое условие проверят while (он проверяет lpoint что оно не nil?)
Пока есть точки и выполняется вырезка участка линии...в итоге-цикл
Цитата:
куда девалось значение ent (оно вроде должно тоже записываться, причем впереди координат)
Мы его не отслеживаем, нам важны точки (list pt1 pt2)
Немного изменил код в предыдущем посте.
roaa вне форума  
 
Автор темы   Непрочитано 26.12.2014, 18:21
#9
Марк_Филипыч


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Кто сказал? cecolor - переменная числового типа.
P.S. Добро пожаловать в тему "Научите лиспу на примере"
тогда почему в командной строке
(setvar "cecolor" "20") выполняется на ура, а
(setvar "cecolor" 20) выдает -->; ошибка: Настройка переменной AutoCAD отвергнута: "cecolor" 20

p.s. там и изучаю, вторая неделя пошла )

пытаюсь соеденить две строки
(setq en0 (cdr (assoc 62 (entget (car pt12)))))

(setvar "cecolor" en0 ) и нефига не получается (хотя en0 получает значение цвета)
Марк_Филипыч вне форума  
 
Непрочитано 26.12.2014, 19:10
#10
Кулик Алексей aka kpblc
Moderator

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


Да, че-то меня переклинило Сорри. Привык использовать собственную библиотечную функцию назначения системных переменных, которой пофигу что передают...
Сказали уже, как преобразовать строку в число:
Код:
[Выделить все]
(setq en0 (itoa (cdr (assoc 62 (entget (car pt12))))))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp определить цвет выбранного объекта (отрезок, полилиния)

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка ПОС, искусство проектирования Tyhig Технология и организация строительства 117 25.11.2021 17:38
Линии электрических соединений Shoorup Программирование 23 07.02.2015 15:13
Ввод в эксплуатацию салона красоты - нужно ли (и в какой форме) согласование с пожарниками ? drill_man Прочее. Архитектура и строительство 4 20.09.2013 12:03
ZwCAD - экспорт меню в AutoCAD superkot007 Другие CAD системы 4 23.05.2010 03:32
Как определить принадлежность выбранного объекта к блоку? kp+ Программирование 3 19.12.2005 15:47