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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Нужно посчитать кабель

Нужно посчитать кабель

Ответ
Поиск в этой теме
Непрочитано 23.10.2007, 10:25
Нужно посчитать кабель
Shoorup
 
Минск
Регистрация: 16.09.2006
Сообщений: 1,587

Необходимо посчитать длину кабеля.
Есть чертеж, в нем есть есть куча однострочных текстов такого формата (всегда один и тот же) 1230-3х1 (например). Т.е сначало идет длинна кабеля, а потом его жильность.
нужно сложить все кабели например 3х1, потом 4х2, потом, 7х1, 12х2 и т.д. Полученные данные свести в таблицу. Как мне кажеться это задача не очень сложная, но проблемма в том что я совсем не знаю Лиспа.
Если кто может помочь буду признателен
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Просмотров: 59042
 
Непрочитано 27.05.2009, 23:04
#101
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Спор сводится к тому, от куда брать данные для специфицирования. Из головы (вооружившись калькулятором), или из модели.

Про голову я ничего не говорил. говорил о возможности обойтись 2d моделью.
Всли задании нет 3д планов - строить их самому всеравно что брать данные из головы
zamtmn вне форума  
 
Непрочитано 07.07.2009, 08:16
#102
Behemoth


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


[quote=Alaspher;177001]

У меня похожая задача с подсчетом длин кабелей, да только спецификацию я выполнил в таблице.
Одна графа-марка кабеля, другая-метраж. Теперь необходимо посчитать длины кабелей одинаковой марки.

Как это можно выполнить?
У меня AutoCAD 2008 rus/
Behemoth вне форума  
 
Автор темы   Непрочитано 02.03.2010, 10:54
#103
Shoorup


 
Регистрация: 16.09.2006
Минск
Сообщений: 1,587
<phrase 1= Отправить сообщение для Shoorup с помощью Skype™


Поднимем старую тему.
Появилась необходимость дополнить данную программу
LCAB.lsp
Код:
[Выделить все]
(defun c:lcab (/ adoc alay asel dat fst len lock mod pnt row str suf tbl tmp text_color count countL)
  (vl-load-com)
  (setq text_color 5) ;_Номер цвета для посчитанного текста (256 для "послою")
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))
        asel (vla-get-activeselectionset adoc)
        alay (vla-get-activelayer adoc)
	count 0 countL 0
  )
  (vla-clear asel)
  (vla-startundomark adoc)
  (pl:obj-select-on-screen asel "*TEXT")
  (vlax-for i asel
    (setq str (vl-string-translate "х" "x" (strcase (vla-get-textstring i) t)))
    (if
      (and (/= (setq suf (vl-string-left-trim "0123456789" str)) str)
           (= (substr suf 1 1) "-")
           (/= (setq suf (substr suf 2)) "")
           (wcmatch suf "#x#,##x#,#x#(#),##x#(#),#(#),##(#),#x#(##),##x#(##),#(##),##(##)")
      )
      (progn           ;;; add VVA
	(setq count (1+ count)) ;;; add VVA
       (if (vlax-write-enabled-p i)
	   (vla-put-color i text_color)
	   (setq countL (1+ countL))
	 )
       (setq suf (substr suf 1 (vl-string-position 40 suf))
             suf (if (vl-string-position 120 str)
                   suf
                   (strcat suf "x1")
                 )
             dat (if (setq len (atof (substr str 1 (vl-string-position 45 str)))
                           tmp (assoc suf dat)
                     )
                   (subst (append tmp (list len)) tmp dat)
                   (cons (list suf len) dat)
                 )
       )
       )               ;;; add VVA
    )
  )
  (if (and (setq
             dat (mapcar (function (lambda (a) (cons (car a) (lcab_multi-modc (cdr a) 300))))
                         dat
                 )
           )
           (setq pnt (vl-catch-all-apply
                       (function getpoint)
                       '("Точка вставки таблицы <Отказаться>: ")
                     )
           )
           (not (vl-catch-all-error-p pnt))
      )
    (progn
      (if (= (vla-get-lock alay) :vlax-true)
        (progn (vla-put-lock alay :vlax-false) (setq lock t))
      )
      (if (setq fst (vla-item asel 0)
                mod (vla-get-height fst)
                tbl (vla-addtable
                      (vla-objectidtoobject adoc (vla-get-ownerid fst))
                      (vlax-3d-point (trans pnt 1 0))
                      (+ (length dat) 2)
                      4
                      (* 1.8 mod)
                      (* 9.6 mod)
                    )
          )
        (progn
          (vla-put-regeneratetablesuppressed tbl :vlax-true)
          (vla-settext tbl 0 0 "Спецификация кабеля")
          (vla-setcellalignment tbl 0 0 acmiddlecenter)
          (vla-setcelltextheight tbl 0 0 mod)
          (vla-settext tbl 1 0 "Жильность")
          (vla-settext tbl 1 1 "Длина")
          (vla-settext tbl 1 2 "Уч.")
          (vla-settext tbl 1 3 "Муфт")
          (vla-setcellalignment tbl 1 0 acmiddlecenter)
          (vla-setcellalignment tbl 1 1 acmiddlecenter)
          (vla-setcellalignment tbl 1 2 acmiddlecenter)
          (vla-setcellalignment tbl 1 3 acmiddlecenter)
          (vla-setcelltextheight tbl 1 0 mod)
          (vla-setcelltextheight tbl 1 1 mod)
          (vla-setcelltextheight tbl 1 2 mod)
          (vla-setcelltextheight tbl 1 3 mod)
          (vla-setcolumnwidth tbl 1 (* 6.0 mod))
          (vla-setcolumnwidth tbl 2 (* 3.0 mod))
          (vla-setcolumnwidth tbl 3 (* 4.5 mod))
          (vla-put-horzcellmargin tbl (* 0.4 mod))
          (setq row 1)
          (foreach i
                   (mapcar
                     (function (lambda (a) (nth a dat)))
                     (vl-sort-i
                       (mapcar
                         (function (lambda (a / q)
                                     (setq q (car a)
                                           i (1+ (vl-string-position 120 q))
                                     )
                                     (list (atoi (substr q 1 i)) (atoi (substr q (1+ i))))
                                   )
                         )
                         dat
                       )
                       (function
                         (lambda (a b) (or (< (cadr a) (cadr b)) (< (car a) (car b))))
                       )
                     )
                   )
            (vla-settext tbl (setq row (1+ row)) 0 (car i))
            (vla-setcellalignment tbl row 0 acmiddlecenter)
            (vla-setcelltextheight tbl row 0 mod)
            (vla-settext tbl row 1 (rtos (apply (function +) (cddr i)) 2 0))
            (vla-setcellalignment tbl row 1 acmiddleright)
            (vla-setcelltextheight tbl row 1 mod)
            (vla-settext tbl row 2 (- (length i) 2))
            (vla-setcellalignment tbl row 2 acmiddleright)
            (vla-setcelltextheight tbl row 2 mod)
            (vla-settext tbl row 3 (cadr i))
            (vla-setcellalignment tbl row 3 acmiddleright)
            (vla-setcelltextheight tbl row 3 mod)
          )
          (if (setq
                dat (lcab_mindex
                      (mapcar (function lcab_multir)
                              (vl-remove-if (function (lambda (x) (zerop (cadr x)))) dat)
                      )
                    )
              )
            (progn (if lock
                     (vla-put-lock alay :vlax-true)
                   )
                   (vla-endundomark adoc)
                   (vla-startundomark adoc)
                   (if lock
                     (vla-put-lock alay :vlax-false)
                   )
                   (vla-insertrows tbl (setq row (1+ row)) (* 1.8 mod) (1+ (length dat)))
                   (vla-mergecells tbl row row 0 3)
                   (vla-settext tbl row 0 "ИТОГО МУФТ")
                   (vla-setcellalignment tbl row 0 acmiddlecenter)
                   (vla-setcelltextheight tbl row 0 mod)
                   (foreach i (mapcar (function (lambda (a) (nth a dat)))
                                      (vl-sort-i (mapcar (function car) dat) (function <))
                              )
                     (vla-mergecells tbl (setq row (1+ row)) row 0 2)
                     (vla-settext tbl row 0 (car i))
                     (vla-setcellalignment tbl row 0 acmiddleleft)
                     (vla-setcelltextheight tbl row 0 mod)
                     (vla-settext tbl row 3 (cadr i))
                     (vla-setcellalignment tbl row 3 acmiddleright)
                     (vla-setcelltextheight tbl row 3 mod)
                   )
            )
          )
          (vla-put-regeneratetablesuppressed tbl :vlax-false)
          (vla-update tbl)
        )
      )
      (if lock
        (vla-put-lock alay :vlax-true)
      )
    )
  )
  (princ "\nПодсчитано текста : ") (princ(itoa count))
  (princ "\nЦзменен цвет :  ") (princ (itoa (- count countL)))
  (princ "\nна заблокированном слое : ") (princ(itoa countL))
  (vla-endundomark adoc)
  (princ)
)
(defun pl:obj-select-on-screen (sel enttype)
  (vla-selectonscreen
    sel
    (vlax-safearray-fill (vlax-make-safearray vlax-vbinteger '(0 . 0)) '(0))
    (vlax-safearray-fill (vlax-make-safearray vlax-vbvariant '(0 . 0)) (list enttype))
  )
)
(defun lcab_multi-modc (lst mod)
  (cons (apply (function +) (mapcar (function (lambda (x) (/ (fix x) mod))) lst)) lst)
)
(defun lcab_multir (lst / lns str x)
  (setq str (car lst)
        lns (if (setq x (vl-string-position 120 str))
              (* (atoi (substr str 1 (1+ x))) (atoi (substr str (+ x 2))))
              (atoi str)
            )
  )
  (list (cond ((not (zerop (/ lns 62))) "N/A")
              ((not (zerop (/ lns 43))) "С-65М")
              ((not (zerop (/ lns 20))) "С-50М")
              ("С-35М")
        )
        (cadr lst)
  )
)
(defun lcab_mindex (lst / a asc ret)
  (if lst
    (if (setq ret (lcab_mindex (cdr lst))
              a   (car lst)
              asc (assoc (car a) ret)
        )
      (subst (list (car a) (+ (cadr a) (cadr asc))) asc ret)
      (cons a ret)
    )
  )
)
Ещё некоторыми примочками. А именно:
  • необходимо по команде возвращать первоначальный цвет для посчитанного кабеля
    Код:
    [Выделить все]
    (setq text_color 5) ;_Номер цвета для посчитанного текста
  • необходимо по команде выбирать кабель по маске (например выбираем 1950-7х2(2)).Затем считаем количество используемых жил (7*2)-2=12 жил. И командой редактирование текста подправить количество жил в чертеже.
  • необходимо по команде вставлять текст с количеством жил в кабеле. По сути это предыдущая команда, за исключением того что вместо редактирование текста идет его создание
Вот как выглядит это всё:
Миниатюры
Нажмите на изображение для увеличения
Название: 11.JPG
Просмотров: 2965
Размер:	11.6 Кб
ID:	34518  
__________________
Поезд который устал от ржавого здравомыслия рельсов...
Shoorup вне форума  
 
Непрочитано 12.10.2010, 10:49
#104
Kostalom


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


Добрый день. Просьба помочь дундуку в лиспе. Все что тут говорилось о подсчете кабеля подходит больше для слаботочников. Может кто глянет на вложеный файл и поможет сделать подсчет кабеля и труб при такой форме записи как в файле (в красном круге, необходимые параметры выделены красным).
Вложения
Тип файла: dwg
DWG 2007
Схема.dwg (192.7 Кб, 3341 просмотров)
Kostalom вне форума  
 
Непрочитано 12.10.2010, 11:52
#105
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Вообще, было бы неплохо написать УНИВЕРСАЛЬНУЮ программу считающую что угодно (в пределах разумного конечно) по заданным маскам. Поправил маску - посчитал что надо, без вопросов в данном топике
zamtmn вне форума  
 
Непрочитано 14.10.2010, 12:53
#106
Eddicordo

КИП и А
 
Регистрация: 28.04.2010
Киев
Сообщений: 101
<phrase 1=


Интересная программа, но очень специфическая.
Подсчет длины кабеля происходит только в том случае, когда нужный кабель и его длинна записана в одном _mtext или _text.
А вот для отделов КИП и не только это не совсем подходит.
Есть другой способ и как по мне довольно универсальный. Который я не могу довести до ума. Может кто и поможет.
1) Расстановка дин блоков по чертежу. (см. вложение Вариант №1.dwg)
2) Запуск программы http://forum.dwg.ru/showthread.php?t=54936
3) Вывод результата в таблицу AutoCad либо с выбором в Excel

Довести до ума не получается.
1) Поиск и сравнение одинаковых атрибутов КАБЕЛЬ.
2) Если значение атрибутов КАБЕЛЬ одинаковые то просуммировать их длинны.
3) Сортировка результата построчно в таблицу. Метод сортировки неплохо бы сделать с выбором.
а) По алфавиту,
б) По перечню определенных слов вписываемых пользователем.
в) Рандом.
Если в сортировке попадаются цифры то:
КВВГ 4Х1,0
КВВГ 5х1,0
...
КВВГ 37х1,0
4) Выбор вставки этой же таблицы но в Excel (при этом не создавать новый файл .xls а предложить запись в уже существующий .xls)

Универсальность заключается в том, что каждый создаст себе нужный ему вид записи кабеля, далее программа отработаем все необходимые действия.
Вложения
Тип файла: dwg
DWG 2007
Вариант №1.dwg (92.6 Кб, 3401 просмотров)
Eddicordo вне форума  
 
Непрочитано 15.10.2010, 15:58
#107
vies


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


Мне понравилась програмка для подчета кабелей, но она не подходит под мои условия, она так сказать заточена под определённый вид записи.
А так как ЛИСП для меня абсолютно новый язык и лазение по английскому хелпу в котором не все команды описаны даёт покачто мало результатов.
Отсюда бооольшая просьба к тем кто разобрался в принципах работы этой проги НАПИШИТЕ ПЛИЗ коментарии к каждой строчке, это сильно упрастит мне нелегкое дело изучения ЛИСПА.
Заранее благодарен
vies вне форума  
 
Непрочитано 15.10.2010, 18:27
#108
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Eddicordo, В качестве чернового наброска.
Команда - CountCabel
Пример см. файл из поста #106.
Вложения
Тип файла: lsp countcabel.lsp (25.2 Кб, 188 просмотров)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 18.10.2010, 15:25
#109
Eddicordo

КИП и А
 
Регистрация: 28.04.2010
Киев
Сообщений: 101
<phrase 1=


VVA
Считает отменно.
Можно подкорректировать несколько пунктов
1) Добавить подсчет в этом блоке не только атрибут КАБЕЛЬ.
tagCabel "КАБЕЛЬ" ;_Имя тага марки кабеля
tagLength "ДЛИННА_КАБЕЛЯ" ;_Имя тага длины кабеля

Но и
tagTruba "ТРУБА" ;_Имя тага марки трубы
tagLength_tr "ДЛИННА_ТРУБЫ" ;_Имя тага длины трубы


Возможно у некоторых для универсальности могут появится еще несколько подсчетов в одном блоке см. вложение
Кабель | Длина
Труба | Длина
Метало рукав | Длина
Разное | Длина

2) Сортировку делать по треста (разделам)
Каждому атрибуту "КАБЕЛЬ" "Труба" присваивается номер треста (НОМЕР_ТРЕСТА_КАБЕЛЯ) и по тресту формируется таблица.
Только мне не удается сделать единый Лукап для всех трестов кабеля и труб.
В итоге получилось в данном случае сделать несколько Лукапов
НОМЕР_ТРЕСТА_КАБЕЛЯ
НОМЕР_ТРЕСТА_ТРУБ
НОМЕР_ТРЕСТА_ЧЕГО_УГОДНО
Может для программы осуществить единый поиск атрибутов со стандартными названиями трестов к примеру:
НОМЕР_ТРЕСТА1
НОМЕР_ТРЕСТА2
НОМЕР_ТРЕСТА3
и т.д.
Эти атрибуты с трестами и сортировать во возрастанию. Не знаю как программно написать.
Атрибуты с одинаковыми трестами сортировать по алфавиту

В дальнейшем к каждому тресту будет присвоено свое Наименование (То что показано в таблице перечня оборудования) типа:
Кабель контрольный ГОСТ 1508-78E*

3) При длине кабеля (атрибута Длинна_кабеля) с десятыми 0,5 , запятую не понимает.
Если ничего сделать нельзя то можно каким то образом запретить ввод запятой

4) Вывод в Excel в уже созданных .xls файл.
Для того что бы можно было в Excel файле в других ячейках прописывать формулы.

А ну и чуток переделанный файл lsp прилагаю
Запуск
CountCabel
и
CountCabel_tr
Пытался сам ответить на свой 1 пункт


Да и еще пару моментов.


Подскажите какая строка отвечает за запись в Excel и какая переменная хранит в себе конечный результат?
Добавил вот такие строки
tagtruba "ТРУБА" ;_Имя тага марки трубы
tagLength_tr "ДЛИННА_ТРУБЫ" ;_Имя тага длины трубы


дописал в сохраненную переменную res теги для трубы
(setq res (cabel-count-by-attr BlockName tagCabel tagLength tagtruba tagLength_tr))
Но чет вытягивает все равно только атрибуты с кабелем

И запись в Excel насколько я понял
(xlsf (mapcar '(lambda (x / y)
(if (setq y (assoc x res))
(list (car y) (cdr y))
) ;_ end of if
) ;_ end of lambda
tmp
) ;_ end of mapcar
'("Наименование" "Кол.")
nil
nil
filename
) ;_ end of xlsf


А именно
) ;_ end of lambda
tmp
) ;_ end of mapcar
tmp - конечная переменная хранящая данные на вывод в Excel

Или я не прав?
Вложения
Тип файла: dwg
DWG 2007
Вариант №1-1.dwg (93.7 Кб, 3363 просмотров)
Тип файла: lsp countcabel.lsp (26.3 Кб, 116 просмотров)

Последний раз редактировалось Eddicordo, 19.10.2010 в 12:03.
Eddicordo вне форума  
 
Непрочитано 19.10.2010, 19:38
#110
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Новая версия.
Пример смотреть в посте #109
Основные принципы
1. Символ "|" зарезервирован и не должен встречаться в значениях атрибутов
2. Ф-ция cabel-count-by-attr подсчитывает значения длин и марок для кабеля в соответствии с переданными именами тагов. На самом деле передав ей имена тагов атрибутов для труб - подсчитает трубы и т.д
В команде CountCabel пользователь выбирает набор блоков, а потом к этому набору мы дважды (а можно и трижды для металлорукавов и т.п) применяем функцию countcabel с разными именами тэгов атрибутов. Результат объединяем в один список и его сортируем. Затем выводим в Excell
3. Вывод осуществляется в новый файл Excell, в уже созданный столбцы копируй ручками
Вложения
Тип файла: lsp countcabel.lsp (28.8 Кб, 148 просмотров)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 10.11.2010 в 11:21. Причина: Новая версия
VVA вне форума  
 
Непрочитано 21.10.2010, 09:48
#111
Eddicordo

КИП и А
 
Регистрация: 28.04.2010
Киев
Сообщений: 101
<phrase 1=


VVA
Респект
Вроде все работает отлично.
Осталось протестировать и воплотить в проект. Далее возможно и чет вылезет.

Ну вот результаты тестирования.
1) Присвоил я атрибут "КОД_КАБЕЛЯ" к атрибуту "КАБЕЛЬ" Нужно что бы этот код выводило в таблице 4 столбце.
Почти получилось но не могу понять как мне перенести в 4 столбец и убрать подсчет количества. Да и как то съехало в лево
Кусок кода.
Код:
[Выделить все]
;;; Relis 2010-10-19
;;;http://forum.dwg.ru/showthread.php?p=639362#post639362
;;;http://forum.dwg.ru/showthread.php?t=17333

;;;===============================================================================
;;; Основные принципы
;;;  1. Символ "|" зарезервирован и не должен встречаться в значениях атрибутов
;;;  2. Ф-ция cabel-count-by-attr подсчитывает значения длин и марок для кабеля
;;;                               в соответсвии с переданными именами тагов
;;; На самом деле передав ей имена тагов атрибутов для труб - подсчитает трубы и т.д
;;; В команде CountCabel пользователь выбирает набор блоков, а потом к этому
;;;    набору мы дважды (а можно и трижды для металлорукавов и т.п) применяем
;;;    функцию countcabel с разными именами тэгов атрибутов. Результат объединяем в один список и его сортируем
;;; Затем выводим в Excell

(defun C:CountCabel (/ res lst tmp)
  (vl-load-com)
;;;=================================================================
;;;   Задаем значение тэгов атрибутов для поссчета кабеля
;;;=================================================================

  (setq tagCabel  "КАБЕЛЬ"  ;_Имя тага марки кабеля / трубы

tagKod  "КОД_КАБЕЛЯ"  ;_Имя тага марки  трубы

        tagLength "ДЛИННА_КАБЕЛЯ"  ;_Имя тага длины кабеля / трубы
        tagSort   "НОМЕР_ТРЕСТА_КАБЕЛЯ" ;_Имя тага для сортировки кабеля / трубы
        BlockName "*"       ;_ Маска для имени блока
  ) ;_ end of setq
;;; Формируем набор блоков для обработки.
  (princ "\nSelect cabel block < all drawing >: ")
  (if (null (setq ss (ssget '((0 . "INSERT") (66 . 1)))))
    (setq
      ss (ssget
           "_X"
           (list '(0 . "INSERT") '(66 . 1) (cons 410 (getvar "CTAB")))
         ) ;_ end of ssget
    ) ;_ end of setq
  ) ;_ end of if
  (setq lst (mip-conv-pickset-to-vlalist ss)) ;_ ФОрмируем список из набора
  (setq tmp (cabel-count-by-attr Lst BlockName    tagCabel  tagKod   tagLength tagSort)) ;Подсчитываем результат для кабеля
 (setq res (append res tmp)) ;_ Результат объединяем в один список
;;;=================================================================
;;;   Задаем значение тэгов атрибутов для поссчета труб
;;;=================================================================

  (setq tagCabel  "ТРУБА"  ;_Имя тага марки  трубы
tagKod  "КОД_ТРУБЫ"  ;_Имя тага марки  трубы
        tagLength "ДЛИННА_ТРУБЫ"  ;_Имя тага длины трубы
        tagSort   "НОМЕР_ТРЕСТА_ТРУБ" ;_Имя тага для сортировки трубы
        BlockName "*"       ;_ Маска для имени блока
  ) ;_ end of setq
  
(setq tmp (cabel-count-by-attr Lst BlockName    tagCabel tagKod    tagLength tagSort)) ;Подсчитываем результат для кабеля
(setq res (append res tmp))
  

  (if (setq tmp (SortStringWithNumberAsNumber (mapcar 'car res) t)) ;_Сортируем список
    (progn
      (xls (mapcar '(lambda (x / y)
                         (if (setq y (assoc x res))
                             (append (str-str-lst (car y) "|")(list (cdr y)))
                         ) ;_ end of if
                       ) ;_ end of lambda
                      tmp
              ) ;_ end of mapcar
              '("Трест" "Наименование" "Кол.")
              nil
              nil
        ) ;_ end of xls
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of defun

(defun cabel-count-by-attr (Lst BlockName    tagCabel   tagKod  tagLength tagSort
                            / tagCabelValue tagKodValue tagLengthValue tagSortValue tmp  res)
;;;Подсчитывает блоки с атрибутами и возвращает ассоциативный список
;;; Lst - список Vla объектов  
;;; BlockName - имя блока или "*"   - любое имя
;;; tagCabel - имя тага атрибута, в котором содержится наименование кабеля  / трубы
;;; tagLength - имя тага атрибута, в котором содержится длина кабеля  / трубы
;;; tagSort -   Имя тага для сортировки кабеля / трубы
;;;  (setq tagCabel "КАБЕЛЬ"
;;;        tagLength "ДЛИННА"
;;;        BlockName "*"
;;;        )
  (setq tagCabel  (strcase (mip-conv-to-str tagCabel))

        tagKod (strcase (mip-conv-to-str tagKod))

        tagLength (strcase (mip-conv-to-str tagLength))
        tagSort (strcase (mip-conv-to-str tagSort))
        BlockName (strcase (mip-conv-to-str BlockName))
  ) ;_ end of setq
  (foreach item Lst
    (and
      (wcmatch (strcase (get-block-name item)) BlockName)
      (setq tmp (mapcar '(lambda (x) (cons (strcase (car x)) (cdr x)))
                        (get-all-atts item)
                ) ;_ end of mapcar
      ) ;_ end of setq
      (setq tagCabelValue (mip-conv-to-str(cdr (assoc tagCabel tmp))))

      (setq tagKodValue (mip-conv-to-str(cdr (assoc tagKod tmp))))

      (setq tagLengthValue (mip-conv-to-str(cdr (assoc tagLength tmp))))
      (setq tagLengthValue (atof (vl-string-translate "," "."  tagLengthValue)))
      (setq tagSortValue (strcat (mip-conv-to-str(cdr (assoc tagSort tmp))) "|"))
      (setq tagCabelValue (strcat tagSortValue tagCabelValue))

      (if (member tagCabelValue (mapcar 'car res))
        (setq res
               (subst
                 (cons tagCabelValue
                       (+ tagLengthValue (cdr (assoc tagCabelValue res)))
                 ) ;_ end of cons
                 (assoc tagCabelValue res)
                 res
               ) ;_ end of subst
        ) ;_ end of setq
        (setq
          res (append res (list (cons tagCabelValue tagLengthValue)))
        ) ;_ end of setq
      ) ;_ end of if




(if (member tagKodValue (mapcar 'car res))
        (setq res
               (subst
                 (cons tagKodValue
                       (+ tagLengthValue (cdr (assoc tagKodValue res)))
                 ) ;_ end of cons
                 (assoc tagKodValue res)
                 res
               ) ;_ end of subst
        ) ;_ end of setq
        (setq
          res (append res (list (cons tagKodValue tagLengthValue)))
        ) ;_ end of setq
      ) ;_ end of if
    ) ;_ end of and
  ) ;_ end of foreach
  res
) ;_ end of defun
Да и можешь показать мне где указанно в lisp-е, в какие столбцы вставляться результат. Просмотрел первый и второй файл countcabel.lsp
и сравнил функции (defun xls
Они идентичны но во втором случае появился столбец с трестами. Странно наверное не туда смотрю.

2) Можно добавить количество просуммированных длин кабелей и труб и т.д. (Тобиш сколько tagLength было между собой просуммировано).

3) Есть необходимость в блоке указывать Одну марку кабеля и несколько длин этого же кабеля. Так же и с трубами и т.д.
(Тобиш Один атрибут tagCabel "КАБЕЛЬ" и несколько tagLength "ДЛИННА_КАБЕЛЯ".) Тоесть появляются следующие атрибуты "ДЛИННА_КАБЕЛЯ1" , "ДЛИННА_КАБЕЛЯ2" и т.д. Которые между собой так же должны просуммироваться.

Что то вроде такого
Код:
[Выделить все]
  (setq tagCabel  "КАБЕЛЬ"  ;_Имя тага марки кабеля / трубы
        tagLength "ДЛИННА_КАБЕЛЯ1"  ;_Имя тага длины кабеля №1 / трубы №1
        tagLength "ДЛИННА_КАБЕЛЯ2"  ;_Имя тага длины кабеля №2/ трубы №2
        tagSort   "НОМЕР_ТРЕСТА_КАБЕЛЯ" ;_Имя тага для сортировки кабеля / трубы
        BlockName "*"       ;_ Маска для имени блока
  ) ;_ end of setq
По идее должно было бы просуммировать, но просуммировало только все "ДЛИННА_КАБЕЛЯ2"

Последний раз редактировалось Eddicordo, 21.10.2010 в 17:21.
Eddicordo вне форума  
 
Непрочитано 03.11.2010, 21:06
#112
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Eddicordo
Добрый день, коллега!

Пытаюсь решить схожие проблемы.
Хотя сейчас больше занимаюсь планом трасс, как основой для получения длин кабеля.
http://forum.dwg.ru/showthread.php?p=640116

Сейчас уже подошел к написанию программ для автоматического подсчета кабеля (суммирование по типам). А пока, если надо, считаю по упрощенной схеме:
делаю низкоуровневый экспорт данных из блоков кабеля, расположенных в схеме соединений внешних проводок,затем макросом подхватываю эти данные в Excel и там они обрабатываются. Выводится список кабелей, металлорукавов и труб с просуммированными длинами.
Но хочется сделать покрасивее и в ЛИСП. И чтобы не ошибаться при вводе марки и жильности кабеля, марки труб и металлорукавов - хочу сделать возможность вводить их, выбирая из списка. Для этого пытаюсь изучать работу с диалоговыми окнами )))


Цитата:
Сообщение от Eddicordo Посмотреть сообщение
По идее должно было бы просуммировать, но просуммировало только все "ДЛИННА_КАБЕЛЯ2"
Потому что переменной tagLength окончательно присвоено "ДЛИННА_КАБЕЛЯ2".
Frigate вне форума  
 
Непрочитано 04.11.2010, 12:44
#113
Eddicordo

КИП и А
 
Регистрация: 28.04.2010
Киев
Сообщений: 101
<phrase 1=


Frigate, Добрый.
Цитата:
Сообщение от Frigate Посмотреть сообщение
Хотя сейчас больше занимаюсь планом трасс, как основой для получения длин кабеля.
Эта работа необходима которую вы проделали.
И я бы с удовольствием ее потестил.

Но без схем внешних план не сделать.
1) Простановка номер кабеля,
2) Выбор марки кабеля, жильности.
3) Продумать путь кабеля от точки А до точки В.
И только после этого можно приступать к плану, вытянув выше указанную информацию с блоков.
Создав связь "Внешние соединения" - "План".
После чего прочерчивания на плане полилиний и присвоение с выбором им вытянутых с "Внешних соединений" информацию.
Ну и на последок связь с обновление на "Внешних соединений" и простановки длин соответствующим блокам.

А вообще вы забыли про самую первую "Схему автоматизации" в которой указываются абсолютно все приборы с номерами позиций к ним. Которые между прочим отражаются на плане. От чего и тянется собственно наш кабель.

Цитата:
Сообщение от Frigate Посмотреть сообщение
Сейчас уже подошел к написанию программ для автоматического подсчета кабеля (суммирование по типам)
Автоподсчет кабеля по типам смотри выше. Много уважаемый VVA написал программу которая это делает изумительно за что ему огромное Спасибо. Но с некими корректировками которые чет у мня не получаются.
Ну и так же вставкой таблицы перечня оборудования во "Внешние соединения" с указанной сортировкой по трестам.
Смотрю без изучения лиспа никуда и минимум месяца на изучение его.
Eddicordo вне форума  
 
Непрочитано 04.11.2010, 16:53
#114
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


Eddicordo,

без лиспа и правда никуда, я с середины августа изучаю, начал с азов, а углубленно уже изучал при помощи программ участников данного форума и подобных ему форумов.

Да, я уже пытыюсь по косточкам разложить программу VVA. Во-первых, алгоритмы, во-вторых сам уровень программирования - то, чему у него мне еще учиться и учиться, как и у многих других участников. Так что программку я переработаю, обязательно.

По поводу схем внешних - конечн, они создаются до плана. Просто я их априори считаю созданными. Пока меня занимал вопрос плана трасс. ПОчитай, пожалуйста, мою концепцию. Я немного не так, как ты описал, воплотил подсчет и простановку кабелей - все это есть на 1-ой странице моей темы.

Схему автоматизации и схему внешних соединений пока не пытался автоматизировать - тут нужно сначала продумать всю концепцию, учитывая при этом реальные возможности ЛИСПа (не хотел бы еще основательно изучать С++ - я все-таки не программист по профессии, лишь на прикладном уровне).
Frigate вне форума  
 
Непрочитано 08.11.2010, 11:47
#115
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Eddicordo, Обновил код в #110
Теперь считает и количество

Цитата:
Сообщение от Eddicordo Посмотреть сообщение
Есть необходимость в блоке указывать Одну марку кабеля и несколько длин этого же кабеля. Так же и с трубами и т.д.
Тобиш Один атрибут tagCabel "КАБЕЛЬ" и несколько tagLength "ДЛИННА_КАБЕЛЯ".) Тоесть появляются следующие атрибуты "ДЛИННА_КАБЕЛЯ1" , "ДЛИННА_КАБЕЛЯ2"
Я изменил вызов ф-ции countcabel/ Теперь в нее передается результирующий список Res. Так же выделил фрагмент кода, который нужно копировать при добавлении тэгов
Код:
[Выделить все]
;;;= 1 START========================================================
;;;   Задаем значение тэгов атрибутов для подсчета кабеля
;;;=================================================================
код
;;;= 1 END ==========================================================
;;;= 2 START========================================================
;;;   Задаем значение тэгов атрибутов для подсчета кабеля
;;;=================================================================
код
;;;= 2 END ==========================================================
Чтобы просуммировать несколько tagLenth нужно несколько раз вызвать countcabel с разными значениями тагов. Фрагмент кода (основное выделено красным)
Код:
[Выделить все]
;;;= 1 START========================================================
;;;   Задаем значение тэгов атрибутов для подсчета кабеля
;;;=================================================================

  (setq tagCabel  "КАБЕЛЬ"  ;_Имя тага марки кабеля / трубы
        tagLength "ДЛИННА_КАБЕЛЯ"  ;_Имя тага длины кабеля / трубы
        tagSort   "НОМЕР_ТРЕСТА_КАБЕЛЯ" ;_Имя тага для сортировки кабеля / трубы
        BlockName "*"       ;_ Маска для имени блока
  ) ;_ end of setq
  ;;;В списке res накапливаем марки кабеля, длинны и количество
  ;;; Причем список как передается в ф-цию cabel-count-by-attr? так и возвращается обратно
  (setq tmp (cabel-count-by-attr Lst BlockName tagCabel tagLength tagSort res));Подсчитываем результат для кабеля
  (setq Res tmp)
;;;= 1 END ==========================================================

;;;= 2 START========================================================
;;;   Задаем значение тэгов атрибутов для подсчета кабеля
;;;=================================================================

  (setq tagCabel  "КАБЕЛЬ"  ;_Имя тага марки кабеля / трубы
        tagLength "ДЛИННА_КАБЕЛЯ2"  ;_Имя тага длины кабеля / трубы
        tagSort   "НОМЕР_ТРЕСТА_КАБЕЛЯ" ;_Имя тага для сортировки кабеля / трубы
        BlockName "*"       ;_ Маска для имени блока
  ) ;_ end of setq
  ;;;В списке res накапливаем марки кабеля, длинны и количество
  ;;; Причем список как передается в ф-цию cabel-count-by-attr? так и возвращается обратно
  (setq tmp (cabel-count-by-attr Lst BlockName tagCabel tagLength tagSort res)) ;Подсчитываем результат для кабеля
  (setq Res tmp)
;;;= 2 END ==========================================================
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 10.11.2010 в 11:06.
VVA вне форума  
 
Непрочитано 10.11.2010, 10:06
#116
Eddicordo

КИП и А
 
Регистрация: 28.04.2010
Киев
Сообщений: 101
<phrase 1=


VVA, Вот молодца...

Есть один недочет.
При вставке в блоке
1 шт. атрибут КАБЕЛЬ
4 шт атрибута ДЛИННА_КАБЕЛЯ, ДЛИННА_КАБЕЛЯ2, ДЛИННА_КАБЕЛЯ3, ДЛИННА_КАБЕЛЯ4

Если я вписал длинны только в атрибуты ДЛИННА_КАБЕЛЯ, ДЛИННА_КАБЕЛЯ2. Остальные атрибуты с длинами пустые.

То подсчет количества длин (Count) в шт. не верное. Посчитает 4 шт.
А реально нужно всего 2 шт. поскольку вписано только в двух атрибута длинны.
Eddicordo вне форума  
 
Непрочитано 10.11.2010, 11:26
#117
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Обновил #110. Код не проверял, но должен работать. Принцип такой: Если в атрибуте, отвечающем за длину кабеля, длина 0 - то количество не наращивается. Алгоритм ф-ции atof (преобразования текста в число) таков - если текст содержит цифры, то преобразуется в число. Иначе получаем 0. Поэтому значение атрибута может быть пустым, после преобразования в число там все равно будет 0.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 10.11.2010, 23:50
#118
gomer

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


Цитата:
Сообщение от Eddicordo Посмотреть сообщение
ДЛИННА_КАБЕЛЯ
Гы! в каком месте ударение ставить
gomer вне форума  
 
Непрочитано 29.11.2010, 18:20
#119
Eddicordo

КИП и А
 
Регистрация: 28.04.2010
Киев
Сообщений: 101
<phrase 1=


VVA, Считает отменно.
Идея с несколькими длинами одного кабеля заключается в том что вдин блоке присутствует состояние видимости. Тоесть:
1) Вставка дин блока.
2) Рядом параметр видимости "Кол. Длин"
3) Пользователь выбирает сколько длин будет относится к одной марке кабеля (tagCabel "КАБЕЛЬ")
4) Прописывает в каждом атрибуте длину кабеля.
Ну и вот возникает проблема. После указания всех длин кабеля в ходе работы нужно скрыть ненужную длину. Естественно "Тетка" уже не будет очищать проставленную длину, а просто скроет ее параметром видимости. LISP считает все длинны и их количества включая те что невидимые.
Можно скорректировать LISP так, что бы подсчет именно длин кабеля, считались только видимые атрибуты. Уточняю ИМЕННО ДЛИНЫ кабеля. Поскольку (tagSort "НОМЕР_ТРЕСТА_КАБЕЛЯ") У меня как раз находятся в невиде.

И еще одно. Дописал еще 1 атрибут в блок "Наименование_оборудование" которое нужно вытягивать и вставлять рядом со столбцом "Marka"
К примеру по столбцам:
"Trest"
1
"Наименование"
Кабель контрольный
"Marka"
КВВГ 4х1,0
"Length"
50
"Count"
2

Пытался переделать LISP но без результатно.

Да еще кое какой момент. Если использовать параметр видимости и к примеру я включаю 5 длин одного кабеля, проставляю длины.
В процессе работы нужно убрать не последнюю длину, а 3 к примеру.
А параметр видимости уберет именно последнюю.
Были мысли сделать на каждую длину свой параметр видимости. Вкл. Выкл. Вариант интересный, НО если сделать таких параметров с десяток и в каждой видимости несколько параметров движения то ПК нагружается очень сильно.
Может кто знает как решить эту проблему?

30.11.2010
По программе
Обнаружил недочеты. Необходимо предусмотреть отлов ошибок.
2 и более атрибутов жестко связанны между собой
tagCabel "КАБЕЛЬ"
и
tagLength "ДЛИННА_КАБЕЛЯ"
tagLength "ДЛИННА_КАБЕЛЯ2"
tagLength "ДЛИННА_КАБЕЛЯ2"
и.т.д.
Если длина кабеля не указана, то в список сам кабель с его пустой длиной не попадает.
Не проставлена длина это значит либо пустой атрибут либо с буквой "м" (метры). Пока не разобрался как к атрибуту присоединить суфиксы. И можно ли вообще.
Можно ли в таком случае выдавать сообщение о том что "Не все длины проставлены" продолжить подсчет и выделять цветом те блоки в которых не вписаны длины. При повторном использовании программы и подсчетах те блоки что были выделены цветом и вписаны длины убирать выделение цветом.

Последний раз редактировалось Eddicordo, 30.11.2010 в 12:46.
Eddicordo вне форума  
 
Непрочитано 18.09.2019, 17:04
#120
Eddicordo

КИП и А
 
Регистрация: 28.04.2010
Киев
Сообщений: 101
<phrase 1=


VVA, Добрый день.
Второй день мучаюсь пытаясь дописать в C:CountCabel дополнительный тег:
tagNamber "N1" ;_Имя тага позиционное обозначение кабеля / трубы
Значение тега tagNamber должно вписываться в таблицу столбец "Поз. обозначение" схема работы аналогичная тегу tagCabel.
Но никак не получается (.
Саму прогу дописывал господин Frigate, добавил вставку "м" в столбец примечания
Можешь помочь?
Прикладываю сам блок и lisp не корректно рабочий. countcabel_gotovo_Frigate+.lsp


Видимо будет сложно добавить этот тег в чужой код.
Если можно просто добавить tagNamber "N1" в написанную прогу выше пост 110. Для вывода этого тега в первый столбец экселя "Poz"
Poz Trest Marka Length Count


Прикладываю заново рабочий код и чертеж
Вложения
Тип файла: dwg
DWG 2007
1.dwg (174.6 Кб, 22 просмотров)
Тип файла: lsp countcabel_gotovo_Frigate.lsp (41.1 Кб, 16 просмотров)

Последний раз редактировалось Eddicordo, 19.09.2019 в 10:12.
Eddicordo вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Нужно посчитать кабель

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно ли сгущение арматуры под колонной при наличии металлич Aleks ManaeFF Прочее. Программное обеспечение 3 19.07.2007 12:02
Нужно ли показывать с спецификации болты, гвозди, анкеры? Колян Прочее. Архитектура и строительство 9 14.09.2006 08:09
Дали задачку на плаксисе посчитать rust-resisting Прочее. Программное обеспечение 1 25.03.2006 13:42
на какие ключи в реестре нужно дать полный доступ stanislav AutoCAD 1 19.10.2005 20:40
Когда нужно утеплять стены подвала? Колян Конструкции зданий и сооружений 15 02.10.2005 00:58