Тема: Пересчет вычислений

Подскажите каким образом сделать пересчет суммы в любой программке суммирования. Как пример взял программку VVA
Хотелось бы при выполнение вычисления выполнялся пересчет  заранее определенных объктов при редактировании одного из них. Вычисления сложения текстовых примитивов на чертеже, типа "TEXT".
Подобная программка есть, но нужны корективы а автору либо влом либо незнает как, хотелось бы вместе решить проблему
http://dwg.ru/dnl/374
;|============= Команда SumT ==================================
  Назначение:  Суммирование Тектса,Мтекста указанием или рамкой.
  Особенности: Безразлична к разделителям точка или запятая.
               Ввиду особенности работы atof стоки вида "22.3мама"
               будут учтены как число 22.3
               При выводе результата число округляется в соответствии
               с текущими установками переменной LUPREC. Команда _UNITS
|;
(defun mip_mtext_unformat ( Mtext / text Str )(setq Text "")
(while (/= Mtext "")
   (cond  ((wcmatch (strcase (setq Str (substr Mtext 1 2))) "\\[\\{}]")
            (setq Mtext (substr Mtext 3) Text   (strcat Text Str)))
          ((wcmatch (substr Mtext 1 1) "[{}]")(setq Mtext (substr Mtext 2)))
          ((wcmatch (strcase (setq Str (substr Mtext 1 2))) "\\[LO`~]")
     (setq Mtext (substr Mtext 3)))
          ((wcmatch (strcase (substr Mtext 1 2)) "\\[ACFHQTW]")
            (setq Mtext (substr Mtext (+ 2 (vl-string-search ";" Mtext)))))
          ((wcmatch (strcase (substr Mtext 1 2)) "\\P")
            (if (or(= " " (substr Text (strlen Text)))(= " " (substr Mtext 3 1)))
               (setq Mtext (substr Mtext 3))(setq Mtext (substr Mtext 3) Text (strcat Text " "))))
    ((wcmatch (strcase (substr Mtext 1 2)) "\\S")
            (setq Str   (substr Mtext 3 (- (vl-string-search ";" Mtext) 2))
                  Text  (strcat Text (vl-string-translate "#^\\" "/^\\" Str))
                  Mtext (substr Mtext (+ 4 (strlen Str)))))
    (t (setq Text (strcat Text (substr Mtext 1 1)) Mtext (substr Mtext 2)))
    )) Text)
(defun sumT ( K / res selset ins_pt txt_height str)
(vl-load-com)(setq res 0.)
(if (setq selset (ssget '((0 . "TEXT,MTEXT"))))
    (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
      (setq str (mip_mtext_unformat (vla-get-textstring (vlax-ename->vla-object ent)))
      str (vl-string-translate "," "." (vl-string-trim  "%UuoOcC \t"   str))
            str (vl-string-trim  "%UuoOcC \t"   str)  res (+ res (atof str))))) ;_ end of if
  (setq res (* K res))(princ "\nРезультат=")(princ (rtos res 2))
(if (not (equal res 0. 1e-3))
    (progn
      (if (= (cdr (assoc 40 (tblsearch "STYLE" (getvar "TEXTSTYLE")))) 0.0) ;_ end of =
        (progn ;; нулевая высота текста
     (if (not (setq txt_height (getreal "\nВведите высоту текста <2.5> : ")))(setq txt_height 2.5))
          (vl-cmdf "_.TEXT" "0,0" txt_height 0 (rtos res 2))) ;_ end of progn
        (progn ;; фиксированнная высота
          (vl-cmdf "_.TEXT" "0,0" 0 txt (rtos res 2))) ;_ end of progn
         )
      (command "_.copybase" "0,0" (entlast) "" "_.erase" (entlast) "" "_.pasteclip" pause)
      ) ;_ end of progn
    ) ;_ end of if
  res)
(defun C:SumT ( )(sumt 1)(princ))
(defun C:SumT2 ( )(sumt 2)(princ))
(princ "\nНаберите в командной строке SumT SumT2")

Re: Пересчет вычислений

Сергей пишет:

Вычисления сложения текстовых примитивов на чертеже, типа "TEXT".

Даже без перепрограммирования пересчет заранее определенных объектов (ТЕКСТОВ!!) легко организовать с помощью этой программы и команды _GROUP, группируя объекты. Либо взять отсюда https://www.caduser.ru/forum/topic22819.html .

пересчет заранее определенных объктов при редактировании одного из них

пересчет чего? (длинн, площатей, сумм весов линий?) кем определенных и каких объектов.
Мне кажется прямая дорога - поля

Re: Пересчет вычислений

Пересчет сумируемых слогаемых целых чисел (цифр)написанных типа "TEXT". И запись в ячейку заранее определенной суммы типа "TEXT" (результата суммирования)!

Re: Пересчет вычислений

Имеется ввиду переделать программку VVA по суммированию объектов "TEXT", что бы один раз просуммировал 1+2+3=6, после чего при изменении любого из слогаемых (1 или 2 или 3) на другую цифру производился автопересчет и заменял сумму на соответствующею по подсчетам суммирования

Re: Пересчет вычислений

Так что ни кто не подскажет как автор программы Барабанщиков Николай сделал автопересчет суммирования????
http://dwg.ru/dnl/374

Re: Пересчет вычислений

> Сергей
Так там написано - реакторы

Re: Пересчет вычислений

Программа выполняет тоже самое только при редактировании одного из членов сложения или произведения производит автопересчет, чего и требуется
Вот что там написанно!!
"Выполнение автовычислений заранее определенных объктов при редактировании одного из них. Вычисления сложения и произведения текстовых примитивов на чертеже, типа "TEXT"."

Re: Пересчет вычислений

> Сергей
Читай

Барабанщиков Николай 09-01-2006 16:55 

Барабанщиков Николай 09-01-2006 16:55
Дальнейшее усовершенствование программы предыдущей версии привело в тупик. От сообщений об ошибках Автокада, при снятии реактора с объекта или стирания этих объектов, не смог избавиться. Поэтому изменил тип реактора. Но, все же, предлагаю теперь две версии выполнения автовычисления – выбирай на вкус.

А так же если скачать и прочитать Прoчти.lst

Программа "autosum.vlx" работает на реакторах объектов ...

Re: Пересчет вычислений

Я конечно не совсем понимаю что такое "работает на реакторах объектов", но он же делал это сам!
Как говорится одна голова хорошо, а две есчо лучше.
А по поводу его исправления --- то она не работает вообще!
Программка классная, вот я и решил спросить у народа может кто то подскажет идею да общими усилиями и выведем прогу до идеала!!!

Re: Пересчет вычислений

Может нужно пойти другим путем что бы добится того же результата???

Re: Пересчет вычислений

> Сергей
Подожди немного. Не обещаю, но попробую

Re: Пересчет вычислений

> Сергей
Первый набросок

(vl-load-com)
(defun mip_mtext_unformat ( Mtext / text Str )(setq Text "")
(while (/= Mtext "")
(cond ((wcmatch (strcase (setq Str (substr Mtext 1 2))) "\\[\\{}]")
(setq Mtext (substr Mtext 3) Text (strcat Text Str)))
((wcmatch (substr Mtext 1 1) "[{}]")(setq Mtext (substr Mtext 2)))
((wcmatch (strcase (setq Str (substr Mtext 1 2))) "\\[LO`~]")
(setq Mtext (substr Mtext 3)))
((wcmatch (strcase (substr Mtext 1 2)) "\\[ACFHQTW]")
(setq Mtext (substr Mtext (+ 2 (vl-string-search ";" Mtext)))))
((wcmatch (strcase (substr Mtext 1 2)) "\\P")
(if (or(= " " (substr Text (strlen Text)))(= " " (substr Mtext 3 1)))
(setq Mtext (substr Mtext 3))(setq Mtext (substr Mtext 3) Text (strcat Text " "))))
((wcmatch (strcase (substr Mtext 1 2)) "\\S")
(setq Str (substr Mtext 3 (- (vl-string-search ";" Mtext) 2))
Text (strcat Text (vl-string-translate "#^\\" "/^\\" Str))
Mtext (substr Mtext (+ 4 (strlen Str)))))
(t (setq Text (strcat Text (substr Mtext 1 1)) Mtext (substr Mtext 2)))
)) Text)
(defun sumT-in-reac ( K vla-list-owner / res selset ins_pt txt_height str)
(setq res 0.)
  (setq vla-list-owner (vl-remove-if 'vlax-erased-p vla-list-owner))
(foreach ent vla-list-owner
(setq str (mip_mtext_unformat (vla-get-textstring ent))
str (vl-string-translate "," "." (vl-string-trim "%UuoOcC \t" str))
str (vl-string-trim "%UuoOcC \t" str) res (+ res (atof str))))
(setq res (* K res))(princ "\nРезультат=")(princ (rtos res 2))
res)
(defun add_sumt_object_reactor ( vla-list-owner vla-dest / reac )
  (setq vla-list-owner (vl-remove vla-dest vla-list-owner))
  (setq reac (vlr-object-reactor vla-list-owner (list '("Rname" "SumT")(list "DEST" (vla-get-Handle vla-dest)))
    (list '(:vlr-modified . SumT_Reaction) '(:VLR-modifyUndone . SumT_Reaction))))
  (vlr-pers reac)(SumT_ReactionUpd reac))
(defun SumT_Reaction (vlao reac args / vla-dest ht dat en lst)
  (if (vlr-added-p reac)
   (progn
  (setq dat (vlr-data reac))
   (if (and
     (= (cadr (assoc "Rname" dat)) "SumT")
     (setq ht (cadr (assoc  "DEST" dat)))
     (setq en (handent ht))
     (entget en)
     (setq vla-dest (vlax-ename->vla-object en))
     )
     (if (vlax-write-enabled-p vla-dest)
       (progn
     (if (member vlao (setq lst (vlr-owners reac)))
       (progn
         (VLR-Owner-Remove reac vla-dest)
         (setq ht (sumT-in-reac 1 lst))
         (vla-put-TextString vla-dest (rtos ht 2 2))
         )
       )
     )
       (princ "\nТекст не заблокированном слое")
       )
     (progn
     (princ "\nОбъект назначения удален. Деактивируем реактор")
     (vlr-remove reac)
     (mapcar '(lambda(x)(VLR-Owner-Remove reac x))(vlr-owners reac))
     )
     )
  )
    )
  )
(defun SumT_ReactionUpd (reac / vla-dest ht dat en lst)
  (if (vlr-added-p reac)
   (progn
  (setq dat (vlr-data reac))
   (if (and
     (= (cadr (assoc "Rname" dat)) "SumT")
     (setq ht (cadr (assoc  "DEST" dat)))
     (setq en (handent ht))
     (entget en)
     (setq vla-dest (vlax-ename->vla-object en))
     )
     (if (vlax-write-enabled-p vla-dest)
       (progn
         (VLR-Owner-Remove reac vla-dest)
         (setq ht (sumT-in-reac 1 (vlr-owners reac)))
         (vla-put-TextString vla-dest (rtos ht 2 2))
         ;(setq RR reac)
     )
       (princ "\nТекст не заблокированном слое")
       )
     (progn
     (princ "\nОбъект назначения удален. Деактивируем реактор")
     (vlr-remove reac)
     (mapcar '(lambda(x)(VLR-Owner-Remove reac x))(vlr-owners reac))
     )
     )
  )
    )
  )
;;Создает связь между текстами автовычисления и приемником
(defun C:SumT_Add ( / dst selset)
  (vl-load-com)
  (while (null dst)
  (princ "\nУкажите текст-приемник (для отображения суммы)")
  (setq  dst (ssget "_+.:S:E:L" '((0 . "*TEXT")))))
  (setq dst (ssname dst 0)
    dst (vlax-ename->vla-object dst)
    )
  (princ "\nВыберите тексты-источники для суммирования")
  (if (setq selset (ssget "_:L" '((0 . "*TEXT"))))
   (add_sumt_object_reactor (mapcar 'vlax-ename->vla-object(vl-remove-if 'listp (mapcar 'cadr (ssnamex selset))))
     dst)
    )
  (princ)
  )
;;Удаляет текст из связи
(defun C:SumT_Del ( / dst reac-list)
  (vl-load-com)
  (princ "\nУкажите текст для удаления из цепочки)")
  (setq  dst (ssget "_+.:S:E:L" '((0 . "*TEXT"))))
  (setq dst (ssname dst 0)
    dst (vlax-ename->vla-object dst)
    )
  (setq reac-list (vl-remove-if-not '(lambda(reac)(member dst (vlr-owners reac)))(vlr-pers-list)))
  (mapcar '(lambda (reac)(VLR-Owner-Remove reac dst))  reac-list)
  (mapcar 'SumT_ReactionUpd (reverse reac-list))
  (princ)
  )

Примечание:
Определены 2 команды:
SumT_Add - задание связи объектов суммирования с источником суммы
SumT_Del - удаление текста из объектов суммирования
Чтобы работали реакоры, код должен быть постоянно загружен. (см. http://dwg.ru/forum/viewtopic.php?t=11445)

Re: Пересчет вычислений

Вообще начало довольно отличное!!
Код постоянно загружен, но при копировании на другой dwg файл пересчет не работает, соответственно при вставке блока в котором есть пересчет тоже не работает!
Можна это исправить?

Re: Пересчет вычислений

ПО мимо этого нужна:
1. Что бы можна было добавлять объект суммирования к существующей связи!
2. Выделять цветом связь суммирования (желательно слогаемые одним цветом, а сумму другим)
3. При удаление текста из объектов суммирования указывать не один объект, а сразу несколько.
4. После чего можна программку протестить на большое количество связей на одном листе *.dwg.
Поскольку у Барабанщиков Николай при большом количестве связей на одном листе была очень жестокая проблема с пересчетом. А проблемма состояла в том что у него пересчет производился не по конкретной изменяемой цепочки связи, а пересчет по всему листу файла *.dwg

Re: Пересчет вычислений

но при копировании на другой dwg файл пересчет не работает, соответственно при вставке блока в котором есть пересчет тоже не работает!
Можна это исправить?

Думаю что нет. Реакторы регисрируются за конкретными примитивами и при копировании (или вставке в другой чертеж) они (примитивы) получают новые метки и связи уже нет :(
Хочу заметить, что текст-сумма в другой цепочке может выступать как текст - слагаемое и учитывать суммы предыдущей цепочки.
Второй набросок

;https://www.caduser.ru/forum/topic33835.html
(defun mip_mtext_unformat ( Mtext / text Str )(setq Text "")
(while (/= Mtext "")
(cond ((wcmatch (strcase (setq Str (substr Mtext 1 2))) "\\[\\{}]")
(setq Mtext (substr Mtext 3) Text (strcat Text Str)))
((wcmatch (substr Mtext 1 1) "[{}]")(setq Mtext (substr Mtext 2)))
((wcmatch (strcase (setq Str (substr Mtext 1 2))) "\\[LO`~]")
(setq Mtext (substr Mtext 3)))
((wcmatch (strcase (substr Mtext 1 2)) "\\[ACFHQTW]")
(setq Mtext (substr Mtext (+ 2 (vl-string-search ";" Mtext)))))
((wcmatch (strcase (substr Mtext 1 2)) "\\P")
(if (or(= " " (substr Text (strlen Text)))(= " " (substr Mtext 3 1)))
(setq Mtext (substr Mtext 3))(setq Mtext (substr Mtext 3) Text (strcat Text " "))))
((wcmatch (strcase (substr Mtext 1 2)) "\\S")
(setq Str (substr Mtext 3 (- (vl-string-search ";" Mtext) 2))
Text (strcat Text (vl-string-translate "#^\\" "/^\\" Str))
Mtext (substr Mtext (+ 4 (strlen Str)))))
(t (setq Text (strcat Text (substr Mtext 1 1)) Mtext (substr Mtext 2)))
)) Text)
(defun sumT-in-reac ( K vla-list-owner / res selset ins_pt txt_height str)
(setq res 0.)
  (setq vla-list-owner (vl-remove-if 'vlax-erased-p vla-list-owner))
(foreach ent vla-list-owner
  (if (vlax-read-enabled-p ent)(progn
(setq str (mip_mtext_unformat (vla-get-textstring ent))
str (vl-string-translate "," "." (vl-string-trim "%UuoOcC \t" str))
str (vl-string-trim "%UuoOcC \t" str) res (+ res (atof str))))))
(setq res (* K res))
;  (princ "\nРезультат=")(princ (rtos res 2))
res)
(defun add_sumt_object_reactor ( vla-list-owner vla-dest / reac )
  (setq vla-list-owner (vl-remove vla-dest vla-list-owner))
  (setq reac (vlr-object-reactor vla-list-owner (list '("Rname" "SumT")(list "DEST" (vla-get-Handle vla-dest)))
    (list '(:vlr-modified . SumT_Reaction) )))
  (vlr-pers reac)(SumT_ReactionUpd reac))
(defun SumT_Reaction (vlao reac args / vla-dest ht dat en lst)
  (vl-load-com)
  (if (vlr-added-p reac)(progn
  (setq dat (vlr-data reac))
   (if (and
     (= (cadr (assoc "Rname" dat)) "SumT")
     (setq ht (cadr (assoc  "DEST" dat)))
     (setq en (handent ht))
     (entget en)
     (setq vla-dest (vlax-ename->vla-object en)))
     (if (vlax-write-enabled-p vla-dest)
       (progn
     (if (member vlao (setq lst (vlr-owners reac)))
       (progn
         (VLR-Owner-Remove reac vla-dest)
         (setq ht (sumT-in-reac 1 lst))
         (vla-put-TextString vla-dest (rtos ht 2 2))
         )
       )
     )
       (princ "\nТекст на заблокированном слое - сумму не меняем")
       )
     (progn
     (princ "\nОбъект назначения удален. Деактивируем реактор")
     (vlr-remove reac)
     (mapcar '(lambda(x)(VLR-Owner-Remove reac x))(vlr-owners reac))))))
  )
(defun mip-reg-get-path ()"HKEY_LOCAL_MACHINE\\Software\\MIP")
(defun mip-reg-write (key value )
(vl-registry-write (mip-reg-get-path)
(vl-princ-to-string key)(vl-princ-to-string value)))
(defun mip-reg-read ( key )(vl-registry-read (mip-reg-get-path)
(vl-princ-to-string key)))
(defun mip-conv-to-str (dat)(if dat (vl-princ-to-string dat) ""))
(defun SumT_ReactionUpd (reac / vla-dest ht dat en lst)
   (vl-load-com)
  (if (vlr-added-p reac)
   (progn
  (setq dat (vlr-data reac))
   (if (and
     (= (cadr (assoc "Rname" dat)) "SumT")
     (setq ht (cadr (assoc  "DEST" dat)))
     (setq en (handent ht))
     (entget en)
     (setq vla-dest (vlax-ename->vla-object en))
     )
     (if (vlax-write-enabled-p vla-dest)
       (progn
         (VLR-Owner-Remove reac vla-dest)
         (setq ht (sumT-in-reac 1 (vlr-owners reac)))
         (vla-put-TextString vla-dest (rtos ht 2 2))
         ;(setq RR reac)
     )
       (princ "\nТекст не заблокированном слое")
       )
     (progn
     (princ "\nОбъект назначения удален. Деактивируем реактор")
     (vlr-remove reac)
     (mapcar '(lambda(x)(VLR-Owner-Remove reac x))(vlr-owners reac))))))
  )
  (defun sumt_del ( dst / reac-list)
  (setq reac-list (vl-remove-if-not '(lambda(reac)(member dst (vlr-owners reac)))(vlr-pers-list)))
  (mapcar '(lambda (reac)(VLR-Owner-Remove reac dst))  reac-list)
  (mapcar 'SumT_ReactionUpd (reverse reac-list)))
(defun SetSumTColor ( / colP colS)
  (alert "Цвет слагаемого текста:")
  (setq colP (ACAD_COLORDLG 1 nil))
  (if (null colP)(setq colP 1))
  (alert "Цвет суммы текста:")
  (setq colS (ACAD_COLORDLG 5 nil))
  (if (null colS)(setq colS 5))
  (mip-reg-write "SumT_Color+"(mip-conv-to-str colP))
  (mip-reg-write "SumT_Color="(mip-conv-to-str colS))
  )
  (defun GetSumTColor ( / ht )(list
  (if (setq ht (mip-reg-read "SumT_Color+")) ht 1)
  (if (setq ht (mip-reg-read "SumT_Color=")) ht 5)))
(defun getcolorlist (obj / TrueColor)
  (list obj
          (if (= (vla-get-colormethod
                   (setq TrueColor (vla-get-truecolor obj))
                 ) ;_ end of vla-get-colormethod
                 accolormethodbyrgb
              ) ;_ end of =
            (list (vla-get-red TrueColor)
                  (vla-get-green TrueColor)
                  (vla-get-blue TrueColor)
            ) ;_ end of list
            (vla-get-color obj)
          ) ;_ end of if
    ) ;_ end of list
) ;_ end of defun
(defun Restorecolorlist ( / TrueColor)
(princ "\nВосстанавливаю цвет текста ... ")
(foreach item *sumT-obj-list*
 (vl-catch-all-apply (function (lambda ( / obj xx)
  (setq TrueColor (vla-get-TrueColor (setq obj (nth 0 item))))
  (setq xx (nth 1 item))
  (if (listp xx)(progn
    (vla-setRGB TrueColor (nth 0 xx) (nth 1 xx) (nth 2 xx))
    (vla-put-TrueColor obj TrueColor))
    (vla-put-color obj xx)))))
 )
(setq *sumT-obj-list*  nil)
 (princ " ok")(princ)
)
(defun SumT_Viz ( obj / reac-list owner-list sum-list colP colS)
  (or *kpblc-activedoc*
       (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
   )
  (vla-startundomark *kpblc-activedoc*)
  (setq reac-list (vl-remove-if-not '(lambda(reac)(member dst (vlr-owners reac)))(vlr-pers-list)))
  (setq owner-list (mapcar 'vlr-owners reac-list))
  (setq owner-list (apply 'append owner-list))
  (setq sum-list (mapcar '(lambda (reac / dat ht en vla-dest)
  (if (vlr-added-p reac)
   (progn
     (setq dat (vlr-data reac))
     (if (and
     (= (cadr (assoc "Rname" dat)) "SumT")
     (setq ht (cadr (assoc  "DEST" dat)))
     (setq en (handent ht))
     (entget en)
     (setq vla-dest (vlax-ename->vla-object en))
     (vlax-write-enabled-p vla-dest)
     )
       vla-dest
       nil
       )))) reac-list))
  (setq sum-list (vl-remove-if 'null sum-list))
  (foreach item sum-list (setq owner-list (vl-remove item owner-list)))
  (setq colP (mapcar 'atoi (GetSumTColor))
    colS (cadr colP)
    colP (car colP)
    )
  (setq *sumT-obj-list* (append *sumT-obj-list* (mapcar 'getcolorlist owner-list))
        *sumT-obj-list* (append *sumT-obj-list* (mapcar 'getcolorlist sum-list))
        )
  (mapcar '(lambda(x)(if (vlax-write-enabled-p x)(vla-put-Color x colP))) owner-list)
  (mapcar '(lambda(x)(if (vlax-write-enabled-p x)(vla-put-Color x colS)))  sum-list)
  (vla-endundomark *kpblc-activedoc*)
  (princ "\nКоманда SumT_VizR восстановит цвет текста ")
  (princ)
  )
;;Создает связь между текстами автовычисления и приемником
(defun C:SumT_Creat ( / dst selset)
  (vl-load-com)
  (while (null dst)
  (princ "\nУкажите текст-приемник (для отображения суммы)")
  (setq  dst (ssget "_+.:S:E:L" '((0 . "*TEXT")))))
  (setq dst (ssname dst 0)
    dst (vlax-ename->vla-object dst)
    )
  (princ "\nВыберите тексты-источники для суммирования")
  (if (setq selset (ssget "_:L" '((0 . "*TEXT"))))
   (add_sumt_object_reactor (mapcar 'vlax-ename->vla-object(vl-remove-if 'listp (mapcar 'cadr (ssnamex selset))))
     dst)
    )
  (princ)
  )
;_Добавляет текст к существующей цепочке автосуммы
(defun C:SumT_Add ( / dst reac-list selset lst *error*)
  (defun *error* (msg)(princ msg)(Restorecolorlist)(princ))
  (vl-load-com)
  (while (not(progn
           (princ "\nУкажите текст существующей связи")
           (if (setq  dst (ssget "_+.:S:E:L" '((0 . "*TEXT"))))
             (setq dst (ssname dst 0)
                   dst (vlax-ename->vla-object dst)
                   )
             )
           (setq reac-list (vl-remove-if-not '(lambda(reac)(member dst (vlr-owners reac)))(vlr-pers-list)))
           (if (null reac-list)
             (princ "\nТекст не выбран или не зарегестрирована цепочка суммирования"))
           reac-list)))
  (setq lst (vl-remove-if 'null (mapcar 'car (mapcar 'vlr-owners reac-list))))
  (mapcar 'SumT_Viz lst)
  (princ "\nВыберите тексты для добавления к цепи")
  (if (setq selset (ssget "_:L" '((0 . "*TEXT"))))
    (progn
      (mapcar '(lambda (obj)(vlr-owner-add (last reac-list) obj))(mapcar 'vlax-ename->vla-object(vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))))
       (mapcar 'SumT_ReactionUpd (reverse reac-list))
      )
    )
  (Restorecolorlist)
  (princ)
  )
;;Удаляет текст из связи
(defun C:SumT_Del1 ( / dst )
  (vl-load-com)
  (princ "\nУкажите текст для удаления из цепочки")
  (if (setq  dst (ssget "_+.:S:E:L" '((0 . "*TEXT"))))
    (progn
  (setq dst (ssname dst 0)
    dst (vlax-ename->vla-object dst)
    )
  (sumt_del dst)
    )
    )
  (princ)
  )
;;Удаляет тексты из связи
(defun C:SumT_Del ( / dst )
  (vl-load-com)
  (princ "\nУкажите тексты для удаления из цепочки")
  (if (setq  dst (ssget "_:L" '((0 . "*TEXT"))))
    (progn
  (mapcar 'sumt_del (mapcar 'vlax-ename->vla-object(vl-remove-if 'listp (mapcar 'cadr (ssnamex dst)))))
    )
    )
  (princ)
  )
;;;Задание цвета цепочке и сумме
(defun C:SumT_Color ()(SetSumTColor)(princ))
;;Визуализирует связь
(defun C:SumT_Viz ( / dst reac-list owner-list sum-list colP colS)
  (vl-load-com)
  (princ "\nУкажите текст для визуализации цепочки ")
  (if (setq  dst (ssget "_+.:S:E:L" '((0 . "*TEXT"))))
    (progn
  (setq dst (ssname dst 0)
    dst (vlax-ename->vla-object dst)
    )
  (SumT_Viz dst)
  )
    )
  (princ)
  )
;;Восстанавлиает предыдущее состояние
(defun C:SumT_VizR ( )(Restorecolorlist))
(mapcar 'princ (list
"\n ====  Определенные команды  ===="
"\nSumT_Creat - Создает связь между текстами автосуммирования (слагаемыми) и тектсом - приемником (суммой)"
"\nSumT_Add - Добавляет текст к существующей цепочке автосуммы"
"\nSumT_Del1 - Удаляет текст из связи"
"\nSumT_Del - Удаляет тексты из связи"
"\nSumT_Color - Задание цвета цепочке и сумме"
"\nSumT_Viz - Визуализирует связь"
"\nSumT_VizR - Восстанавлиает предыдущее состояние"))
(princ)

Re: Пересчет вычислений

<<<  Думаю что нет. Реакторы регисрируются за конкретными примитивами и при копировании (или вставке в другой чертеж) они (примитивы) получают новые метки и связи уже нет :(              >>>
При копировании вполне соледарен, но при создании блока в котором организован автопересчет вполне реально!! (Рассуди сам: блок это и есть отдельный *.dwj файл который вставляется в другой *.dwj файл). Тоесть надо что бы выполнялось не копирование, а вставка блока с автопересчетом!
Кстати заметил что при создании блока с пересчетом пишет """Объект назначения удален. Деактивируем реактор""".  Тоесть деактивировать реактор не надо!!! Можно ли это попробовать исправить???

Re: Пересчет вычислений

Кстати прошу заметить что у Барабанщика Николая работает пересчет при копировании (и вставки блока) с чертежа в чертеж. Возможно это связанно с повторным пересчетом???

Re: Пересчет вычислений

Сергей пишет:

"Объект назначения удален. Деактивируем реактор".

Это наверное громко сказано. На самом деле, если нет объекта, куда записывать сумму, то и сама цепочка не имеет смысла. Дективируется реатор этой цепочки. Остальные работают. Исправлять ничего не надо.
Теперь о блоках.
Ты когда создаешь блок в Автокаде, то в диалоговом окне есть радио-кнопки "Оставить" "Сделать блоком" "Удалить". Это к тому, что в блок посылается копия выбранных объектов, а исходные в зависимости от ответа:
"Оставить" - остаются на месте
"Сделать блоком" - удалябтся, на их место вставляется блок
"Удалить" - удаляются.
С точки зрения копирования объектов абсолютно без разницы, копировать их из пространства модели в пространство блока или из пространства модели одного чертежа в пространство модели другого чертежа. Главное здесть КОПИРОВАТЬ
При втавке блока

(примитивы) получают новые метки и связи уже нет :(

Исправил пару ошибок

;https://www.caduser.ru/forum/topic33835.html
(defun mip_mtext_unformat ( Mtext / text Str )(setq Text "")
(while (/= Mtext "")
(cond ((wcmatch (strcase (setq Str (substr Mtext 1 2))) "\\[\\{}]")
(setq Mtext (substr Mtext 3) Text (strcat Text Str)))
((wcmatch (substr Mtext 1 1) "[{}]")(setq Mtext (substr Mtext 2)))
((wcmatch (strcase (setq Str (substr Mtext 1 2))) "\\[LO`~]")
(setq Mtext (substr Mtext 3)))
((wcmatch (strcase (substr Mtext 1 2)) "\\[ACFHQTW]")
(setq Mtext (substr Mtext (+ 2 (vl-string-search ";" Mtext)))))
((wcmatch (strcase (substr Mtext 1 2)) "\\P")
(if (or(= " " (substr Text (strlen Text)))(= " " (substr Mtext 3 1)))
(setq Mtext (substr Mtext 3))(setq Mtext (substr Mtext 3) Text (strcat Text " "))))
((wcmatch (strcase (substr Mtext 1 2)) "\\S")
(setq Str (substr Mtext 3 (- (vl-string-search ";" Mtext) 2))
Text (strcat Text (vl-string-translate "#^\\" "/^\\" Str))
Mtext (substr Mtext (+ 4 (strlen Str)))))
(t (setq Text (strcat Text (substr Mtext 1 1)) Mtext (substr Mtext 2)))
)) Text)
(defun sumT-in-reac ( K vla-list-owner / res selset ins_pt txt_height str)
(setq res 0.)
  (setq vla-list-owner (vl-remove-if 'vlax-erased-p vla-list-owner))
(foreach ent vla-list-owner
  (if (vlax-read-enabled-p ent)(progn
(setq str (mip_mtext_unformat (vla-get-textstring ent))
str (vl-string-translate "," "." (vl-string-trim "%UuoOcC \t" str))
str (vl-string-trim "%UuoOcC \t" str) res (+ res (atof str))))))
(setq res (* K res))
;  (princ "\nРезультат=")(princ (rtos res 2))
res)
(defun add_sumt_object_reactor ( vla-list-owner vla-dest / reac )
  (setq vla-list-owner (vl-remove vla-dest vla-list-owner))
  (setq reac (vlr-object-reactor vla-list-owner (list '("Rname" "SumT")(list "DEST" (vla-get-Handle vla-dest)))
    (list '(:vlr-modified . SumT_Reaction) )))
  (vlr-pers reac)(SumT_ReactionUpd reac))
(defun SumT_Reaction (vlao reac args / vla-dest ht dat en lst)
  (vl-load-com)
  (if (vlr-added-p reac)(progn
  (setq dat (vlr-data reac))
   (if (and
     (= (cadr (assoc "Rname" dat)) "SumT")
     (setq ht (cadr (assoc  "DEST" dat)))
     (setq en (handent ht))
     (entget en)
     (setq vla-dest (vlax-ename->vla-object en)))
     (if (vlax-write-enabled-p vla-dest)
       (progn
     (if (member vlao (setq lst (vlr-owners reac)))
       (progn
         (VLR-Owner-Remove reac vla-dest)
         (setq ht (sumT-in-reac 1 lst))
         (vla-put-TextString vla-dest (rtos ht 2 2))
         )
       )
     )
       (princ "\nТекст на заблокированном слое - сумму не меняем")
       )
     (progn
     (princ "\nОбъект назначения удален. Деактивируем реактор")
     (vlr-remove reac)
     (mapcar '(lambda(x)(VLR-Owner-Remove reac x))(vlr-owners reac))))))
  )
(defun mip-reg-get-path ()"HKEY_LOCAL_MACHINE\\Software\\MIP")
(defun mip-reg-write (key value )
(vl-registry-write (mip-reg-get-path)
(vl-princ-to-string key)(vl-princ-to-string value)))
(defun mip-reg-read ( key )(vl-registry-read (mip-reg-get-path)
(vl-princ-to-string key)))
(defun mip-conv-to-str (dat)(if dat (vl-princ-to-string dat) ""))
(defun SumT_ReactionUpd (reac / vla-dest ht dat en lst)
   (vl-load-com)
  (if (vlr-added-p reac)
   (progn
  (setq dat (vlr-data reac))
   (if (and
     (= (cadr (assoc "Rname" dat)) "SumT")
     (setq ht (cadr (assoc  "DEST" dat)))
     (setq en (handent ht))
     (entget en)
     (setq vla-dest (vlax-ename->vla-object en))
     )
     (if (vlax-write-enabled-p vla-dest)
       (progn
         (VLR-Owner-Remove reac vla-dest)
         (setq ht (sumT-in-reac 1 (vlr-owners reac)))
         (vla-put-TextString vla-dest (rtos ht 2 2))
         ;(setq RR reac)
     )
       (princ "\nТекст не заблокированном слое")
       )
     (progn
     (princ "\nОбъект назначения удален. Деактивируем реактор цепочки")
     (vlr-remove reac)
     (mapcar '(lambda(x)(VLR-Owner-Remove reac x))(vlr-owners reac))))))
  )
  (defun sumt_del ( dst / reac-list)
  (setq reac-list (vl-remove-if-not '(lambda(reac)(member dst (vlr-owners reac)))(vlr-pers-list)))
  (mapcar '(lambda (reac)(VLR-Owner-Remove reac dst))  reac-list)
  (mapcar 'SumT_ReactionUpd (reverse reac-list)))
(defun SetSumTColor ( / colP colS)
  (alert "Цвет слагаемого текста:")
  (setq colP (ACAD_COLORDLG 1 nil))
  (if (null colP)(setq colP 1))
  (alert "Цвет суммы текста:")
  (setq colS (ACAD_COLORDLG 5 nil))
  (if (null colS)(setq colS 5))
  (mip-reg-write "SumT_Color+"(mip-conv-to-str colP))
  (mip-reg-write "SumT_Color="(mip-conv-to-str colS))
  )
  (defun GetSumTColor ( / ht )(list
  (if (setq ht (mip-reg-read "SumT_Color+")) ht 1)
  (if (setq ht (mip-reg-read "SumT_Color=")) ht 5)))
(defun getcolorlist (obj / TrueColor)
  (if (vlax-erased-p obj) nil
  (list obj
          (if (= (vla-get-colormethod
                   (setq TrueColor (vla-get-truecolor obj))
                 ) ;_ end of vla-get-colormethod
                 accolormethodbyrgb
              ) ;_ end of =
            (list (vla-get-red TrueColor)
                  (vla-get-green TrueColor)
                  (vla-get-blue TrueColor)
            ) ;_ end of list
            (vla-get-color obj)
          ) ;_ end of if
    ) ;_ end of list
    )
) ;_ end of defun
(defun Restorecolorlist ( / TrueColor)
(princ "\nВосстанавливаю цвет текста ... ")
(foreach item *sumT-obj-list*
 (if item
 (vl-catch-all-apply (function (lambda ( / obj xx)
  (setq TrueColor (vla-get-TrueColor (setq obj (nth 0 item))))
  (setq xx (nth 1 item))
  (if (listp xx)(progn
    (vla-setRGB TrueColor (nth 0 xx) (nth 1 xx) (nth 2 xx))
    (vla-put-TrueColor obj TrueColor))
    (vla-put-color obj xx)))))
   )
 )
(setq *sumT-obj-list*  nil)
 (princ " ok")(princ)
)
(defun SumT_Viz ( obj / reac-list owner-list sum-list colP colS)
  (or *kpblc-activedoc*
       (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
   )
  (vla-startundomark *kpblc-activedoc*)
  (setq reac-list (vl-remove-if-not '(lambda(reac)(member dst (vlr-owners reac)))(vlr-pers-list)))
  (setq owner-list (mapcar 'vlr-owners reac-list))
  (setq owner-list (apply 'append owner-list))
  (setq sum-list (mapcar '(lambda (reac / dat ht en vla-dest)
  (if (vlr-added-p reac)
   (progn
     (setq dat (vlr-data reac))
     (if (and
     (= (cadr (assoc "Rname" dat)) "SumT")
     (setq ht (cadr (assoc  "DEST" dat)))
     (setq en (handent ht))
     (entget en)
     (setq vla-dest (vlax-ename->vla-object en))
     (vlax-write-enabled-p vla-dest)
     )
       vla-dest
       nil
       )))) reac-list))
  (setq sum-list (vl-remove-if 'null sum-list))
  (foreach item sum-list (setq owner-list (vl-remove item owner-list)))
  (setq colP (mapcar 'atoi (GetSumTColor))
    colS (cadr colP)
    colP (car colP)
    )
  (setq *sumT-obj-list* (append *sumT-obj-list* (mapcar 'getcolorlist owner-list))
        *sumT-obj-list* (append *sumT-obj-list* (mapcar 'getcolorlist sum-list))
        )
  (mapcar '(lambda(x)(if (vlax-write-enabled-p x)(vla-put-Color x colP))) owner-list)
  (mapcar '(lambda(x)(if (vlax-write-enabled-p x)(vla-put-Color x colS)))  sum-list)
  (vla-endundomark *kpblc-activedoc*)
  (princ "\nКоманда SumT_VizR восстановит цвет текста ")
  (princ)
  )
;;Создает связь между текстами автовычисления и приемником
(defun C:SumT_Creat ( / dst selset)
  (vl-load-com)
  (while (null dst)
  (princ "\nУкажите текст-приемник (для отображения суммы)")
  (setq  dst (ssget "_+.:S:E:L" '((0 . "*TEXT")))))
  (setq dst (ssname dst 0)
    dst (vlax-ename->vla-object dst)
    )
  (princ "\nВыберите тексты-источники для суммирования")
  (if (setq selset (ssget "_:L" '((0 . "*TEXT"))))
   (add_sumt_object_reactor (mapcar 'vlax-ename->vla-object(vl-remove-if 'listp (mapcar 'cadr (ssnamex selset))))
     dst)
    )
  (princ)
  )
;_Добавляет текст к существующей цепочке автосуммы
(defun C:SumT_Add ( / dst reac-list selset lst *error*)
  (defun *error* (msg)(princ msg)(Restorecolorlist)(princ))
  (vl-load-com)
  (while (not(progn
           (princ "\nУкажите текст существующей связи")
           (if (setq  dst (ssget "_+.:S:E:L" '((0 . "*TEXT"))))
             (setq dst (ssname dst 0)
                   dst (vlax-ename->vla-object dst)
                   )
             )
           (setq reac-list (vl-remove-if-not '(lambda(reac)(member dst (vlr-owners reac)))(vlr-pers-list)))
           (if (null reac-list)
             (princ "\nТекст не выбран или не зарегестрирована цепочка суммирования"))
           reac-list)))
  (setq lst (vl-remove-if 'null (mapcar 'car (mapcar 'vlr-owners reac-list))))
  (mapcar 'SumT_Viz lst)
  (princ "\nВыберите тексты для добавления к цепи")
  (if (setq selset (ssget "_:L" '((0 . "*TEXT"))))
    (progn
      (mapcar '(lambda (obj)(vlr-owner-add (last reac-list) obj))(mapcar 'vlax-ename->vla-object(vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))))
       (mapcar 'SumT_ReactionUpd (reverse reac-list))
      )
    )
  (Restorecolorlist)
  (princ)
  )
;;Удаляет текст из связи
(defun C:SumT_Del1 ( / dst )
  (vl-load-com)
  (princ "\nУкажите текст для удаления из цепочки")
  (if (setq  dst (ssget "_+.:S:E:L" '((0 . "*TEXT"))))
    (progn
  (setq dst (ssname dst 0)
    dst (vlax-ename->vla-object dst)
    )
  (sumt_del dst)
    )
    )
  (princ)
  )
;;Удаляет тексты из связи
(defun C:SumT_Del ( / dst )
  (vl-load-com)
  (princ "\nУкажите тексты для удаления из цепочки")
  (if (setq  dst (ssget "_:L" '((0 . "*TEXT"))))
    (progn
  (mapcar 'sumt_del (mapcar 'vlax-ename->vla-object(vl-remove-if 'listp (mapcar 'cadr (ssnamex dst)))))
    )
    )
  (princ)
  )
;;;Задание цвета цепочке и сумме
(defun C:SumT_Color ()(SetSumTColor)(princ))
;;Визуализирует связь
(defun C:SumT_Viz ( / dst reac-list owner-list sum-list colP colS)
  (vl-load-com)
  (princ "\nУкажите текст для визуализации цепочки ")
  (if (setq  dst (ssget "_+.:S:E:L" '((0 . "*TEXT"))))
    (progn
  (setq dst (ssname dst 0)
    dst (vlax-ename->vla-object dst)
    )
  (SumT_Viz dst)
  )
    )
  (princ)
  )
;;Восстанавлиает предыдущее состояние
(defun C:SumT_VizR ( )(Restorecolorlist))
(mapcar 'princ (list
"\n ====  Определенные команды  ===="
"\nSumT_Creat - Создает связь между текстами автосуммирования (слагаемыми) и тектсом - приемником (суммой)"
"\nSumT_Add - Добавляет текст к существующей цепочке автосуммы"
"\nSumT_Del1 - Удаляет текст из связи"
"\nSumT_Del - Удаляет тексты из связи"
"\nSumT_Color - Задание цвета цепочке и сумме"
"\nSumT_Viz - Визуализирует связь"
"\nSumT_VizR - Восстанавлиает предыдущее состояние"))
(princ)

Re: Пересчет вычислений

> Сергей
Тогда значит Барабанщиков связывался с реакторами изменения базы.

Дальнейшее усовершенствование программы предыдущей версии привело в тупик. От сообщений об ошибках Автокада, при снятии реактора с объекта или стирания этих объектов, не смог избавиться.

И результат
А по поводу его исправления — то она не работает вообще!
Я связываться с реакторами базы не буду (тоже отгеб в свое время). Если нужно передать цепочку из одного файла в другой, то можно подумать о программе импорта-экспорта. Например через файл.

Re: Пересчет вычислений

Тут такая ситуация:
У меня есть *.dwg заготовки каких то элементов в которых должно быть пару цепочек пересчета. И в *.mns запись
ID_KC_10 [КС-10_(10_клемм,3_ввода)]^C^C-INSERT d:/папка/папка/файл (*.dwg заготовка)
Соответственно при вставке этой заготовки, цепочеки пересчета неработают!!
А как ни странно у Барабанщика все чудесно работает, но при большом объеме заготовок начинаются головные боли (вместо подсчета одной цепочки посчитывает все что видит на чертеже)
Может в менюшке как то по другому запускать эти заготовки???

Re: Пересчет вычислений

Продолжение здесь
https://www.caduser.ru/forum/topic34287.html