Как поменять visibility set c помощью лиспа
Реклама i
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как поменять visibility set c помощью лиспа

Как поменять visibility set c помощью лиспа

Ответ
Поиск в этой теме
Непрочитано 05.05.2011, 17:47 #1
Как поменять visibility set c помощью лиспа
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Друзья, перелопатил огромную тему по созданию дополнительных параметров Visibility Set в динамических блоках, вроде докопался до момента, где можно вытащить какие присутствую эти самые сэты. Т.е. у меня только их список с кодом 303, а как унать какой сейчас активный и изменить его хз. Как мне менять один визибл сэт на другой, если я знаю его имя. Помогите плиз!! Т.е. нужно изменить вид блока, зная имя его визибл сэта.

Код:
[Выделить все]
(defun c:test ()
(setq lst 
  (entget 
    (TBLOBJNAME "block" 
      (vla-get-EffectiveName 
        (vlax-ename->vla-object 
          (car (entsel "Укажите нужный вам блок"))))) '("*")))
(setq EVAL_GRAPH 
  (entget 
    (cdr (assoc 360 
      (entget 
        (cdr (assoc 360 
          (entget (cdr (assoc 330 lst))))))))))

  (mapcar '(lambda (x) 
  (if (and (= (car x) 360) 
           (= (cdr (assoc 0 (entget (cdr x)))) "BLOCKVISIBILITYPARAMETER"))
      (setq BLC-VIS-PAR (entget (cdr x))))) EVAL_GRAPH)

  )

Последний раз редактировалось Zaghim, 05.05.2011 в 17:53.
Просмотров: 3140
 
Непрочитано 05.05.2011, 19:58
#2
Кулик Алексей aka kpblc
Moderator

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


Если blk-ref - vla-указатель на вхождение блока, а prop-name - имя нужного свойства (в том числе и Visibility), то получить значение можно так:
Код:
[Выделить все]
(vlax-variant-value (vla-get-value ((LAMBDA(/ res)
(foreach item (vlax-safearray->list (vlax-variant-value (vla-GetDynamicBlockProperties blk_ref)))
(if (= (strcase (vla-get-PropertyName item)) (strcase prop-name)) (setq res item))) res))))
Код без защиты и без проверок
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 06.05.2011, 13:16
#3
Zaghim


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


"Если blk-ref - vla-указатель на вхождение блока" - это я так понимаю не то что я там наковырял с выдернутых функций, а просто список блока полученный через entget? "а prop-name - имя нужного свойства (в том числе и Visibility)" - а это уже конкретный вид, например тип1, тип2, так? Вид блока при выполнении вашей функции поменяется??
Zaghim вне форума  
 
Непрочитано 08.05.2011, 12:12
#4
Кулик Алексей aka kpblc
Moderator

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


(setq blk-ref (vlax-ename->vla-object (car (entsel "\nУкажите дин.блок"))))
prop-name - ну значение какого свойства надо получить?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.05.2011, 12:34
#5
Zaghim


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


Значение Visibility Set'a. Т.е. стоит Тип1, нужно поставить Тип2, ну не просто поставить, а что бы блок изменился)

Вот так не работает:

Код:
[Выделить все]
(setq blkref (vlax-ename->vla-object (car (entsel "\nУкажите дин.блок"))))
  (setq prop-name "Тип1")
  (vlax-variant-value (vla-get-value ((LAMBDA(/ res)
  (foreach item (vlax-safearray->list (vlax-variant-value (vla-GetDynamicBlockProperties blkref)))
  (if (= (strcase (vla-get-PropertyName item)) (strcase prop-name)) (setq res item))) res))))
Пишет: error: bad argument type: VLA-OBJECT nil

Последний раз редактировалось Zaghim, 10.05.2011 в 12:57.
Zaghim вне форума  
 
Непрочитано 10.05.2011, 13:42
#6
Лиспер


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


А можно сам файлик глянуть? Потому что код вроде как рабочий.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 10.05.2011, 13:59
#7
Zaghim


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


Да, конечно. Только вместо Тип1, названия визибл сета други (что бы было понятно): прямоугольный, круглый, в одну линию,
Вложения
Тип файла: dwg
DWG 2004
1.dwg (47.5 Кб, 576 просмотров)
Zaghim вне форума  
 
Непрочитано 10.05.2011, 14:01
#8
Лиспер


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


Код:
[Выделить все]
 (vl-load-com)

(defun test (/ blkref prop-name)
  (setq blkref (vlax-ename->vla-object (car (entsel "\nУкажите дин.блок"))))
  (setq prop-name "Тип")
  (vlax-variant-value
    (vla-get-value
      ((lambda (/ res)
         (foreach item (vlax-safearray->list (vlax-variant-value (vla-getdynamicblockproperties blkref)))
           (if (= (strcase (vla-get-propertyname item)) (strcase prop-name))
             (setq res item)
             ) ;_ end of if
           ) ;_ end of foreach
         res
         ) ;_ end of LAMBDA
       )
      ) ;_ end of vla-get-value
    ) ;_ end of vlax-variant-value
  ) ;_ end of defun
(test) возвращает значение видимости блока (после того, как на него будет сделан клик).
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 10.05.2011, 14:19
#9
Zaghim


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


Ну и контрольный вопрос, как теперь его изменить и что бы блок тоже изменился
Zaghim вне форума  
 
Непрочитано 10.05.2011, 14:22
#10
Лиспер


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


Поискать "Изменение свойст динамических блоков"
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 10.05.2011, 15:25
#11
Zaghim


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


Нашел что-то типа такого:

(SetDynamicBlockPropertyNameAllowedValue (vlax-ename->vla-object (car(entsel))) "Тип" "Круглый")

Но как этим пользоваться не понимаю(((

О, нашел еще кое-что. Спасибо Алексею. Вот эта штуковина реально сработала!!!

Код:
[Выделить все]
(defun _kpblc-block-dyn-change-values (ent              lst
                                       /                prop_lst
                                       _kpblc-conv-vla-to-list
                                       )
                                      ;|
    ent    указатель на вхождение блока
    lst    список вида:
      '((<property> . <value>)
    (<property> . <value>)
    )
*    примеры вызова:
(_kpblc-block-dyn-change-values (car(entsel))'(("dist*" . 162.56) ("ang*" . 5.)))
;; Углы надо задавать в радианах!
(_kpblc-block-dyn-change-values (car (entsel)) '(("type" . "minimum")))
|;

  (defun _kpblc-conv-vla-to-list (value / res)
                                 ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
    (cond
      ((= (type value) 'variant)
       (_kpblc-conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (vlax-safearray->list value)
         ) ;_ end of if
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (vl-load-com)

  (vl-catch-all-apply
    '(lambda ()
       (setq
         ent (cond
               (ent)
               (t (car (entsel "\nУкажите вхождение дин.блока <Отмена> : ")))
               ) ;_ end of cond
         ) ;_ end of setq
       ) ;_ end of lambda
    ) ;_ end of vl-catch-all-apply
  (if (and ent
           (setq ent (cond
                       ((= (type ent) 'ename) (vlax-ename->vla-object ent))
                       ((= (type ent) 'vla-object) ent)
                       (t nil)
                       ) ;_ end of cond
                 ) ;_ end of setq
           (= (strcase (vla-get-objectname ent) t) "acdbblockreference")
           (= (vla-get-isdynamicblock
                (vla-item
                  (vla-get-blocks
                    (vla-get-activedocument (vlax-get-acad-object))
                    ) ;_ end of vla-get-blocks
                  (vla-get-effectivename ent)
                  ) ;_ end of vla-item
                ) ;_ end of vla-get-isdynamicblock
              :vlax-true
              ) ;_ end of =
           ) ;_ end of and
    (progn
      (setq
        prop_lst (vlax-safearray->list
                   (vlax-variant-value (vla-getdynamicblockproperties ent))
                   ) ;_ end of vlax-safearray->list
        ) ;_ end of setq
      (foreach item (mapcar '(lambda (a) (cons (strcase (car a)) (cdr a))) lst)
        (if (setq prop
                   (car
                     (vl-remove-if-not
                       '(lambda (x)
                          (wcmatch (strcase (vla-get-propertyname x)) (car item))
                          ) ;_ end of lambda
                       prop_lst
                       ) ;_ end of vl-remove-if-not
                     ) ;_ end of car
                  ) ;_ end of setq
          ;; Имя совпало
          (vl-catch-all-apply
            '(lambda ()
               (vla-put-value
                 prop
                 (vlax-make-variant
                   (cdr item)
                   (vlax-variant-type (vla-get-value prop))
                   ) ;_ end of vlax-make-variant
                 ) ;_ end of vla-put-value
               (vla-update ent)
               ) ;_ end of lambda
            ) ;_ end of vl-catch-all-apply
          ) ;_ end of if
        ) ;_ end of foreach
      ) ;_ end of progn
    ) ;_ end of if
  )
Помогите, пожалста, как мне запускать этот код внутри уже своего кода. А то приходилось в ком строке набивать (_kpblc-block-dyn-change-values (car (entsel)) '(("Тип" . "Прямоугольный")))

Разобрался как вызывать внутри моего кода. Но, какая-то ерунда. Я получаю всю кучу блоков таким образом:
(setq nabr (ssget "_A")) (setq number (sslength nabr)) (setq name (ssname nabr n))
Если пишу (car (entsel)), то все круто, а если - name, то ничего не происходит!!!

Последний раз редактировалось Zaghim, 10.05.2011 в 16:04.
Zaghim вне форума  
 
Непрочитано 10.05.2011, 16:15
#12
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от Zaghim Посмотреть сообщение
(setq nabr (ssget "_A")) (setq number (sslength nabr)) (setq name (ssname nabr n))
Number - количество примитивов в наборе. А чему равно значение N ?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 10.05.2011, 16:33
#13
Zaghim


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


Ну n - вначале 0, потом увеличиваю на единичку после каждого круга.

Все заработало. Всем спасибо за помощь!!!!!!!!!

Последний раз редактировалось Zaghim, 11.05.2011 в 10:33.
Zaghim вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как поменять visibility set c помощью лиспа

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание дополнительных параметров Visibility Set в динамических блоках. Supermax Программирование 716 22.07.2024 11:04
Express Tools Perezz!! AutoCAD 483 13.02.2015 10:57
AutoCAD2010 выдает 82 отчета об ошибке за раз Nusia AutoCAD 22 29.08.2012 16:11
Выдавливание вдоль линии (VBA) Markiza-2010 Программирование 4 29.03.2010 02:36
как с помощью vba начертить линию vasyavip Программирование 77 09.10.2008 23:17