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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp. Автоматическая перерисовка выносок

Autolisp. Автоматическая перерисовка выносок

Ответ
Поиск в этой теме
Непрочитано 12.09.2011, 16:22
Autolisp. Автоматическая перерисовка выносок
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Друзья, требуется помощь, ибо зашел в тупик. Есть динамические блоки: трубы, дроссель клапана и прочих. Есть блок с выноской. Так вот прогу для простановки выносок и их заполнения сделал, тыкая на любой блок ставится выноска в точке тыка, берутся параметры из блока и заполняются в выноску. Все круто. А теперь задача в том что бы выноски перерисовать, если меняются блоки, скажем трубы. Это я реализовал для трубы обычными мат формулами, определяя смещения и прочее, тут проблем нет. Но вошел в ступор, если меняется ДК или ОЗК. Формулами передвинуть выноску стало намного сложнее, т.к. вариантов тьма. Может кто посоветует с какого угла заходить, ведь наверняка с этим сталкивались... заранее спасибо
P.S. Как вы понимаете точка вставки выноски может с любого угла блока, в точке вставки, в середине и тд.....
Просмотров: 12580
 
Непрочитано 28.12.2011, 11:11
#41
Geniy_Dzydo


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


Цитата:
Сообщение от Zaghim Посмотреть сообщение
Друзья, требуется помощь, ибо зашел в тупик. Есть динамические блоки: трубы, дроссель клапана и прочих. Есть блок с выноской. Так вот прогу для простановки выносок и их заполнения сделал, тыкая на любой блок ставится выноска в точке тыка, берутся параметры из блока и заполняются в выноску. Все круто. А теперь задача в том что бы выноски перерисовать, если меняются блоки, скажем трубы. Это я реализовал для трубы обычными мат формулами, определяя смещения и прочее, тут проблем нет. Но вошел в ступор, если меняется ДК или ОЗК. Формулами передвинуть выноску стало намного сложнее, т.к. вариантов тьма. Может кто посоветует с какого угла заходить, ведь наверняка с этим сталкивались... заранее спасибо
P.S. Как вы понимаете точка вставки выноски может с любого угла блока, в точке вставки, в середине и тд.....
А как вы это реализовали скажи те пожалуйста!!!??? ну очень нужно
Geniy_Dzydo вне форума  
 
Непрочитано 28.12.2011, 12:08
#42
Дима_

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


Цитата:
Сообщение от Zaghim Посмотреть сообщение
ДК или ОЗК
А это у нас что?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 28.12.2011, 12:58
#43
Geniy_Dzydo


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


Я имел ввиду прогу для простановки выноски. Я это сделал на мой взгляд дубово, динблоком выноски и полями, неудобство в том что их нужно обновлять, хотя и это не проблема впринципе, но все таки хотелось бы посмотреть что у вас за такая интересная штуковина. Приложил файл!
Супермегахит.dwg
Geniy_Dzydo вне форума  
 
Автор темы   Непрочитано 29.12.2011, 09:53
#44
Zaghim


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


Извиняюсь, давно не просматривал ветку, сейчас отрою код и постараюсь выложить.
А вообще от этой штуки отошли. Просто в нашем случае при перерисовке тех же труб, некоторые из них удалялись и вставлялись новые и вся инфа в выноске была неактуальна.
ДК- Дроссель Клапан, ОЗК - Огне Запорный Клапан
Zaghim вне форума  
 
Непрочитано 29.12.2011, 10:29
#45
Geniy_Dzydo


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


Ок, спасибо!) буду ждать...
Geniy_Dzydo вне форума  
 
Автор темы   Непрочитано 29.12.2011, 11:05
#46
Zaghim


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


Код:
[Выделить все]
 
(defun vinper ( / *error*)
  (vl-load-com)
  (setq p_cmdecho (getvar "CMDECHO")
       p_snapmode (getvar "SNAPMODE")
       p_orthomode (getvar "ORTHOMODE")
       p_blipmode (getvar "BLIPMODE")
       p_osmode (getvar "OSMODE")
 )
  (setq z1 (list 0.0 0.0)
    z2 (list 10.0 0.0))
        
  (setq ug1 (angle z1 z2))                    ;0
  (setq ug2 (+ ug1 1.57079632679489655800))   ;90
  (setq ug3 (+ ug2 1.57079632679489655800))   ;180
  (setq ug4 (+ ug3 1.57079632679489655800))   ;270

 (setvar "CMDECHO" 0)
 (setvar "SNAPMODE" 0)
 (setvar "ORTHOMODE" 0)
 (setvar "BLIPMODE" 0)
 (setvar "OSMODE" 1)
 (gc)
  
(setq n 0 nabr nil number 0 name nil object nil
      klass nil layer nil UGOL nil namebl nil)
(setq nabr (ssget "_A"))
(setq number (sslength nabr))
  
(princ "\n")
(setvar "OSMODE" 0)
(while (> number n)
  (setq name (ssname nabr n))
  (setq object (entget name))
  (setq klass (cdr (assoc 0 object)))
  (setq layer (cdr (assoc 8 object)))
  (setq tvstav1 (cdr (assoc 10 object)))
  (setq tvstav1x (car tvstav1))
  (setq tvstav1y (cadr tvstav1))
  (setq UGOL (cdr (assoc 50 object)))

  (cond
     ;;;----- Обработка примитивов типа "INSERT"
     ((eq klass "INSERT")

      (setq namebl (vla-get-effectivename (vlax-ename->vla-object name)))
      (if (equal namebl "Vinoska")
        (progn
          (setq e1 name)
      (setq ed object)
          (if (and
        (= (cdr (assoc 0 ed)) "INSERT") ;_Блок
        (= (cdr (assoc 66 ed)) 1)       ;_След аттриб
          )
          (progn
            (setq e1 (entnext e1))
            (while (AND e1
          (= (cdr (assoc 0 (setq ed (entget e1)))) "ATTRIB")
              ) 
          (setq imattr (cdr (assoc 2 ed))
                    znattr (cdr (assoc 1 ed))
              )
          (if (= imattr "A") 
                (setq nblprkvin znattr)
          )
          (if (equal imattr "VERHSTROKA")
                (setq atrvinoski1 znattr)
          )
          (setq e1 (entnext e1))
            );while
          );progn  
          );if
                (setq item 0)
          (setq flagc 1)
          (setq kolvo 1)
          (setq schet (strlen nblprkvin))
          (while item
            (if    (/= item schet)
              (progn
                (setq st (substr nblprkvin kolvo 1))
                (if (or (= st " ") (= schet kolvo))
          (progn
            (if (= flagc 6)
              (progn
                    (setq name6 (substr nblprkvin (+ otstup 1) (- (+ kolvo 1) otstup)))
            (setq otstup kolvo)
                       (setq item nil)
              )
            )
            (if (= flagc 5)
              (progn
                    (setq razmold (substr nblprkvin (+ otstup 1) (- (- kolvo otstup) 1)))
            (setq otstup kolvo)
            (setq flagc 6)
            (setq kolvo (1+ kolvo))
              )
            )
            (if (= flagc 4)
              (progn
                    (setq name4 (substr nblprkvin (+ otstup 1) (- (- kolvo otstup) 1)))
            (setq otstup kolvo)
            (setq flagc 5)
            (setq kolvo (1+ kolvo))
              )
            )
            (if (= flagc 3)
              (progn
                    (setq name3 (substr nblprkvin (+ otstup 1) (- (- kolvo otstup) 1)))
            (setq otstup kolvo)
            (setq flagc 4)
            (setq kolvo (1+ kolvo))
              )
            )
            (if (= flagc 2)
              (progn
                    (setq name2 (substr nblprkvin (+ otstup 1) (- (- kolvo otstup) 1)))
            (setq otstup kolvo)
            (setq flagc 3)
            (setq kolvo (1+ kolvo))
              )
            )
            (if (= flagc 1)
              (progn
                    (setq name1 (substr nblprkvin 1 (- kolvo 1)))
            (setq name11 name1)
            (setq otstup kolvo)
            (setq flagc 2)
            (setq kolvo (1+ kolvo))
              )
            )
              )
                  (setq kolvo (1+ kolvo))
            );if
          );progn
        );if
          );while
        
      ;--------------------------------------------------------------------
      ;если изменились координаты точки вставки
      (setq name1 (handent name1))
      (setq object1 (entget name1))
      (setq namebl1 (vla-get-effectivename (vlax-ename->vla-object name1)))      
      ;(command "_zoom" "o" name1 "")

      (setq ugol1 (cdr (assoc 50 object1)))  
      (setq tvstav2 (cdr (assoc 10 object1)))
      (setq tvstav2x (car tvstav2))
      (setq tvstav2y (cadr tvstav2))

      (setq oldx (atof name2))
      (setq oldy (atof name3))
      (if (or (/= tvstav2x oldx) (/= tvstav2y oldy))
    (progn
      (setq strcrd (list oldx oldy 0.0))
      (setq newangl (angle strcrd tvstav1))
      (setq newdist (distance strcrd tvstav1))
      (setq newpoint (polar tvstav2 newangl newdist))
      (command "_move" name "" tvstav1 newpoint)
      (setq tvstav1 newpoint)

          (setq tvst1 (car tvstav2))
          (setq tvst2 (cadr tvstav2))
          (setq atr1 (rtos tvst1 2 5))
          (setq atr2 (rtos tvst2 2 5))
          (setq atr3 (rtos ugol1 2 5))
      (setq name2 atr1
        name3 atr2
        name4 atr3)
          (setq nametxt1 (strcat name11 " " atr1 " " atr2 " " atr3 " " razmold " " name6))
      
  ;--------------ЗАПИСЫВАЕМ В АТРИБУТ А - НОВЫЕ КООРДИНАТЫ--------------;
      (setq e1 name)
      (setq ed object)
          (if (and
        (= (cdr (assoc 0 ed)) "INSERT") ;_Блок
        (= (cdr (assoc 66 ed)) 1)       ;_След аттриб
          )
          (progn
            (setq e1 (entnext e1))
            (while (AND e1
          (= (cdr (assoc 0 (setq ed (entget e1)))) "ATTRIB")
              ) 
          (setq imattr (cdr (assoc 2 ed))
                    znattr (cdr (assoc 1 ed))
              )
          (if (= imattr "A")
        (progn
                  (setq ed (subst (cons 1 nametxt1) (assoc 1 ed) ed))
              (entmod ed)
              (entupd e1)
        )
          )
          (setq e1 (entnext e1))
            );while
          );progn  
          );if
        )
      )
      ;---------------------------------------------------------------------
      ;если изменился сам блок
      (setq diffname nil)
      (setq razmold (atof razmold))
      (setq name6 (atoi name6))
     (if (or (equal namebl1 "Dif1") (equal namebl1 "Dif6"))
       (progn
     (if (equal namebl1 "Dif1")
       (progn
             (setq flag 2)
             (tekvisset1)
             (setq razmnew nname)
           )
     )
     (if (equal namebl1 "Dif6")
       (progn
             (setq flag 1)
             (tekvisset1)
             (setq razmnew nname)
           )
     )
        )
       (progn
      (test1)
      (setq typename nname)
      (if (equal typename "Круглый")
        (progn
          (setq flag 1)
          (tekvisset1)
          (setq razmnew nname)
        )
        (progn
          (setq flag 2)
          (tekvisset1)
          (setq razmnew nname)
        )
      )
      ;если изменился тип

      (if (= name6 1)
    (setq typenameold "Круглый")
    (setq typenameold "Прямоугольный")
      )

      (if (not (equal typename typenameold))
    (setq name6 flag)
      )

      
      (setq razmold11 (rtos razmold 2 0))
      (setq e1 name)
      (setq ed object)
      (if (and
        (= (cdr (assoc 0 ed)) "INSERT") ;_Блок
        (= (cdr (assoc 66 ed)) 1)       ;_След аттриб
      )
      (progn
        (setq e1 (entnext e1))
        (while (AND e1
      (= (cdr (assoc 0 (setq ed (entget e1)))) "ATTRIB")
          ) 
          (setq imattr (cdr (assoc 2 ed))
                znattr (cdr (assoc 1 ed))
          )
          (if (equal imattr "VERHSTROKA")
            (progn
          (if (= name6 1)
        (progn
          (tekatrset1)
          (if (= diffname nil)
                    (setq newnmvs (strcat "%%C" razmold11))
                (setq newnmvs (strcat diffname " %%C" razmold11))
                  )
            )
          )
          (if (= name6 2)
            (progn
              (tekatrset1)
          (if (= diffname nil)
                    (setq newnmvs (strcat razmold11 "x" shir2))
                (setq newnmvs (strcat diffname " " razmold11 "x" shir2))
                  )
            )
          )
              (setq ed (subst (cons 1 newnmvs) (assoc 1 ed) ed))
              (entmod ed)
              (entupd e1)
            )
      )
      (if (= imattr "A")
        (progn
          (setq name61 (rtos name6 2 1))
              (setq nametxt1 (strcat name11 " " name2 " " name3 " " name4 " " razmold11 " " name61))
              (setq ed (subst (cons 1 nametxt1) (assoc 1 ed) ed))
          (entmod ed)
          (entupd e1)
        )
      )
      (setq e1 (entnext e1))
        );while
      );progn  
      );if
     )
    )

  ;-------------------------------------------------------
  ;если изменился размер

      (if (/= razmnew razmold)
    (progn
      (if (equal namebl1 "Truba")
        (progn
          (setq razmtrpro (* razmold 2))
          (if (= razmnew razmtrpro)
            (progn
          (setq smesh (/ (+ razmnew razmold) 2))
              (setq smesh (abs smesh))
              (setq nowsmesh1 (polar tvstav1 (+ ugol1 1.57079632679489655800) smesh))
              (setq nowsmesh2 (polar tvstav1 (- ugol1 1.57079632679489655800) smesh))
          (setq flaghok 1)
          (yaz)
        )
            (progn
              (setq smesh (/ (- razmnew razmold) 2))
              (setq smesh (abs smesh))
              (setq nowsmesh1 (polar tvstav1 (+ ugol1 1.57079632679489655800) smesh))
              (setq nowsmesh2 (polar tvstav1 (- ugol1 1.57079632679489655800) smesh))
          (yaz)
        )
          )
        )

        (progn
          (setq flag 4)
              (tekvisset1)
              (setq smeshpoX nname)
              (setq flag 5)
              (tekvisset1)
              (setq smeshpoY nname)
          (setq nowsmesh1 (polar tvstav2 ugol1 smeshpoX))
          (setq nowsmesh1 (polar nowsmesh1 (+ ugol1 1.57079632679489655800) smeshpoY))
          (command "_move" name "" tvstav1 nowsmesh1)
            )
      
      )

      (setq atr4 (rtos razmnew 2 0))
      (setq e1 name)
      (setq ed object)
      (setq razmnew (rtos razmnew 2 0))
          (if (and
        (= (cdr (assoc 0 ed)) "INSERT") ;_Блок
        (= (cdr (assoc 66 ed)) 1)       ;_След аттриб
          )
          (progn
            (setq e1 (entnext e1))
            (while (AND e1
          (= (cdr (assoc 0 (setq ed (entget e1)))) "ATTRIB")
              ) 
          (setq imattr (cdr (assoc 2 ed))
                    znattr (cdr (assoc 1 ed))
              )
          (if (equal imattr "VERHSTROKA")
        (progn
          (if (= name6 1)
            (progn
              (tekatrset1)
              (if (= diffname nil)
                        (setq newnmvs (strcat "%%C" razmnew))
                    (setq newnmvs (strcat diffname " %%C" razmnew)) 
                      )
                )
              )
              (if (= name6 2)
                (progn
                  (tekatrset1)
              (if (= diffname nil)
                        (setq newnmvs (strcat razmnew "x" shir2))
                    (setq newnmvs (strcat diffname " " razmnew "x" shir2)) 
                      )
                )
             )
                 (setq ed (subst (cons 1 newnmvs) (assoc 1 ed) ed))
                 (entmod ed)
                 (entupd e1)
              ) 
        )
        (if (= imattr "A")
          (progn
            (setq name61 (rtos name6 2 1))
                (setq nametxt1 (strcat name11 " " name2 " " name3 " " name4 " " razmnew " " name61))
                (setq ed (subst (cons 1 nametxt1) (assoc 1 ed) ed))
            (entmod ed)
            (entupd e1)
          )
        )
        (setq e1 (entnext e1))
          );while
        );progn  
        );if
      (setq kolsim (- (strlen newnmvs) 1))
          (setq dlvinoski (* kolsim 144))
      (setq shirvinoski 1200)
          (_kpblc-block-dyn-change-values name (list (cons "Ширина" dlvinoski) (cons "Длина" shirvinoski)))
    );progn vinoska
   );if vinoska
   )
  )
  ) ; equal klass "INSERT"

 ) ; cond

 (setq n (+ n 1)) ;следующий объект
 ;(command "_zoom" "all")
  
) ;while(main)



  (setvar "SNAPMODE" p_snapmode)
  (setvar "ORTHOMODE" p_orthomode)
  (setvar "BLIPMODE" p_blipmode)
  (setvar "OSMODE" p_osmode)
  (setvar "CMDECHO" p_cmdecho)
    ; (setvar "ERRNO" 0)

  
  
) ; defun


;-------------------------------------------------------------------------------------------------------------
;------------------------Функция получения текущего "Visibility Set" в блоке----------------------------------
;-------------------------------------------------------------------------------------------------------------


(defun test1 (/ blkref prop-name)
  (setq blkref (vlax-ename->vla-object name1))
  (setq prop-name "Тип")
  (setq nname
  (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

;-------------------------------------------------------------------------------------------------------------
;--------------------------------Функция получения значений параметров блока----------------------------------
;-------------------------------------------------------------------------------------------------------------

(defun tekvisset1 (/ blkref prop-name)
  (setq blkref (vlax-ename->vla-object name1))
  (if (= flag 1)
    (setq prop-name "Диаметр")
  )
  (if (= flag 2)
    (setq prop-name "Ширина")
  )
  (if (= flag 3)
    (setq prop-name "Длина")
  )
  (if (= flag 4)
    (setq prop-name "VinoskaPoint X")
  )
  (if (= flag 5)
    (setq prop-name "VinoskaPoint Y")
  )
  (setq nname
  (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



;-------------------------------------------------------------------------------------------------------------
;--------------------------------Функция получения значения атрибута блока------------------------------------
;-------------------------------------------------------------------------------------------------------------

(defun tekatrset1 ()

  (setq e11 e1
    ed1 ed
    imattr1 imattr
    znattr1 znattr)
  (setq e1 name1)
  (setq ed object1)
  (if (and
    (= (cdr (assoc 0 ed)) "INSERT") ;_Блок
    (= (cdr (assoc 66 ed)) 1)       ;_След аттриб
  )
  (progn
    (setq e1 (entnext e1))
    (while (AND e1
             (= (cdr (assoc 0 (setq ed (entget e1)))) "ATTRIB")
           ) 
    (setq imattr (cdr (assoc 2 ed))
          znattr (cdr (assoc 1 ed))
    )
    (if (= imattr "VV") 
      (setq shir2 znattr)
    )
    (if (= imattr "DIFFNAME") 
      (setq diffname znattr)
    )
    (setq e1 (entnext e1))
    );while
  );progn  
  );if
  (setq e1 e11
    ed ed1
    imattr imattr1
    znattr znattr1)
)


(defun yaz ()
  (if (< tvstav1y 0.0000001)
    (setq tvstav1y 0.0)
  )
  (setq obj1 (ssget nowsmesh1))
  (if (/= obj1 nil) 
    (setq obj1 (ssname obj1 0))                ;ЦИКЛ ЕСЛИ ПРИМИТИВ НЕ ОДИН!!!!!!!!!!!
  )  
  (setq obj2 (ssget nowsmesh2))
  (if (/= obj2 nil) 
    (setq obj2 (ssname obj2 0))                ;ЦИКЛ ЕСЛИ ПРИМИТИВ НЕ ОДИН!!!!!!!!!!!
  )
  (if (= flaghok 1)
    (setq obj obj1
      obj1 obj2
      obj2 obj)
  )
  (setq flaghok 0)
  (setq smesh (/ (- razmnew razmold) 2))
  (setq smesh (abs smesh))
  (setq nowsmesh1 (polar tvstav1 (+ ugol1 1.57079632679489655800) smesh))
  (setq nowsmesh2 (polar tvstav1 (- ugol1 1.57079632679489655800) smesh))
  (if (or (and (equal obj1 name1) (equal obj2 name1)) (and (= obj1 nil) (= obj2 nil)))
    (command "_move" name "" tvstav1 tvstav1)
  )
  (if (or (and (equal obj1 name1) (equal obj2 name1) (= pometka 1)) (and (= obj1 nil) (= obj2 nil) (= pometka 1) ))
    (progn
      (command "_move" name "" tvstav1 nowsmesh1)
      (setq pometka nil)
    )
  )
  (if (and (= obj2 nil) (equal obj1 name1))
    (command "_move" name "" tvstav1 nowsmesh1)
  )
  (if (and (= obj1 nil) (equal obj2 name1))
    (command "_move" name "" tvstav1 nowsmesh2)
  )
); end yaz


;-------------------------------------------------------------------------------------------------------------
;------------------------Функция изменения Длины и ширины в блоке---------------------------------------------
;-------------------------------------------------------------------------------------------------------------

(defun change-values (ent              lst
                                       /                prop_lst
                                       _kpblc-conv-vla-to-list
                                       )

  (defun vla-to-list (value / res)
                                 ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
    (cond
      ((= (type value) 'variant)
       (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
  )
Вкратце объясню... пишу конечно я как колхозник, но все работает)

Выбираю все, что есть на чертеже, оттуда фильтрую выноски. В блоке выноски у меня несколько атрибутов - верхняя строка - это строка Типа ДК 100х100, еще нужен атрибут, назвал его А. В нем хранится вся необходимая инфа по блоку - его имя, точка вставки, ну и там размеры из верхней строки и угол поворота и еще признак (1 или 2) - это если блок круглый или прямоугольный.
Всю эту шляпу я достаю в цикле ну а дальше проверки при различных ситуациях изменения блока... Например был круглый стал прямоугольный или что намного чаще изменился его диаметр или ширина и обновляю выноску... Как то так)
Будут вопросы - обращайся.

Последний раз редактировалось Zaghim, 29.12.2011 в 11:12.
Zaghim вне форума  
 
Непрочитано 29.12.2011, 11:54
#47
Geniy_Dzydo


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


А я думал что умею загружать лисповские программы(((. Все ли я правильно делаю??? напишу пошагово : я беру копирую этот текст в блокнот, сохраняю с расширением lsp. загружаю в автокад, и потом пишу в командной строке имя команды vinper - так или не так???, вобщем ничего не получилось, вобщем стыдно мне, стыдно
Geniy_Dzydo вне форума  
 
Автор темы   Непрочитано 29.12.2011, 11:56
#48
Zaghim


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


Вначале напиши appload, подгрузи свой лисп. А если подгрузил, то он наверняка не нашел у тебя в чертеже блоков с именем Vinoska.
Да и запускать смысл?))) Нужно блоки вначале сделать или код изменить под свои нужды.
Zaghim вне форума  
 
Непрочитано 29.12.2011, 12:13
#49
Geniy_Dzydo


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


Ну все равно спасиб! мало конечно что я понял)))))) эт какие то специальные блоки еще нужны с шириной высотой и т.д., вобщем несудьба видать, значит озадачу нашего программиста, авось повезет!
Geniy_Dzydo вне форума  
 
Автор темы   Непрочитано 29.12.2011, 12:52
#50
Zaghim


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


Пища для ума есть, делов под себя это переварить не долго!
Zaghim вне форума  
 
Непрочитано 31.12.2011, 00:11
#51
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Zaghim Посмотреть сообщение
Вкратце объясню... пишу конечно я как колхозник, но все работает)
фырр-фырр, ага, ага...
в конце файла нет определения с:функции, чтоб избежать брожения по лиспу,
локальные переменные и функции должны быть локальными,
имя блока лучше хранить на видном месте с подробным комментарием,
(gc) можно опустить,
выбирать надо не все, а только блоки с нужным именем
чем (* .5 pi) хуже 1.57079632679489655800
gomer вне форума  
 
Непрочитано 31.01.2014, 10:00
#52
siriusdrei


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


Есть 3д динамические блоки с разными названиям и атрибутами. Можно ли сделать выноску которая при указанию на блок будет считывать нужный атрибут? Чаще всего нужно чтоб считывался атрибут "ПОЗ", которой есть во всех блоках.
Выноска с полем не решает проблему, так как мало чем отличается от забивания вручную. Делают еще через СПДС, только вот СПДСа у нас нет(.
Но раз в СПДС можно, то наверно и в лиспе можно? Сам в нем ничего не понимаю поэтому прошу подсказать здесь.
Вложения
Тип файла: dwg
DWG 2010
Блок.dwg (429.9 Кб, 897 просмотров)
siriusdrei вне форума  
 
Непрочитано 31.01.2014, 10:43
#53
Do$

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


Цитата:
Сообщение от siriusdrei Посмотреть сообщение
Можно ли сделать выноску которая при указанию на блок будет считывать нужный атрибут?
Можно, но довольно сложно.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 31.01.2014, 12:37
#54
siriusdrei


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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Можно, но довольно сложно.
Выше код выложили с перемещение выноски в зависимости от размера блока и считывание атрибута (если я правильно понял), а надо просто считывание определенного атрибута. Всего одна функция нужна по сути. Сложнее чем предыдущий код?
siriusdrei вне форума  
 
Непрочитано 31.01.2014, 16:00
#55
Do$

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


Все у вас просто... Пишите, посмотрим как оно просто получится
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp. Автоматическая перерисовка выносок

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Autolisp Отрисовка и перерисовка объектов как в MagiCad Zaghim LISP 10 01.12.2010 14:54
Как отладить нейтив и менеджед код в COM объекте который используется из AutoLISP? lexluther LISP 1 12.08.2009 08:37
Разрыв в месте пересечения линий выносок Zorroko Конструкции зданий и сооружений 7 20.02.2009 18:42
Копирование данных для спецификаций из выносок СПДС в таблицу из мтекстов Red Nova Программирование 177 08.12.2008 11:35