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

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

Подсчет кабеля при помощи дин. блока с атрибутами

Ответ
Поиск в этой теме
Непрочитано 11.07.2007, 06:13 #1
Подсчет кабеля при помощи дин. блока с атрибутами
serg01
 
Иркутск
Регистрация: 04.07.2005
Сообщений: 213

Народ, помогите пожалуйста сделать следующее:
1) Есть участки трассы от коробки до коробки, выполненные линией или полилинией (их много);
2) Есть обозначение этих участков, выполненные в виде дин. блока с атрибутами.
Можно ли организовать подсчет метража кабеля от коробки до коробки, используя эти атрибуты блока. Т.е. в первый блок заносим метраж сами (он как атрибут блока), а в последующие метраж сам бы заносился (тоже как атрибут) путем указания мышью на предыдущий блок.
Это можно организовать с помощью fields, но тогда будет ”жесткая” связь между конкретным участком линии и конкретным блоком, а нужно сделать без “жесткой” связи.

Всем спасибо!
Просмотров: 17566
 
Непрочитано 11.07.2007, 11:07
#2
Дима_

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


Присоединяюсь к вопросу. Делаю с помощью полей - но очень не удобно, каждый новый кабель надо прописывать.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 12.07.2007, 04:19
#3
serg01


 
Регистрация: 04.07.2005
Иркутск
Сообщений: 213


Неужто все вручную считают? Это же ведь удобный способ подсчета! Имхо.
serg01 вне форума  
 
Автор темы   Непрочитано 12.07.2007, 04:39
#4
serg01


 
Регистрация: 04.07.2005
Иркутск
Сообщений: 213


Вот решил на примере показать:
В “блок А” мы сами заносим длину линии, которая под ним находится например. Заносится она в атрибут “METRAZ”. Теперь чтоб метраж занесся в атрибут “блока Б” нужно вызвать некую команду, результатом которой должен явиться запрос с указанием блока и его атрибута, из которого должен браться метраж предыдущего участка, следующей линии и снова блока, в который должно занестись уже посчитанное (суммированное) значение (тоже с выбором атрибутов “METRAZ” или “SSILKA”).
Надеюсь понятно рассказал  Самому не побороть мне программирование.
[ATTACH]1184200746.dwg[/ATTACH]
serg01 вне форума  
 
Автор темы   Непрочитано 12.07.2007, 10:23
#5
serg01


 
Регистрация: 04.07.2005
Иркутск
Сообщений: 213


Дима_
Дима_
У тебя как с лиспом дела? Я так подозреваю, что лиспина не шипко большая будет
serg01 вне форума  
 
Непрочитано 12.07.2007, 11:11
#6
syntheticman

Проектировщик ПС и пр.
 
Регистрация: 12.07.2007
Москва
Сообщений: 1


Может немного не в тему. Я кабеля черчу в отдельном слое. Где-то здесь нашол лиспик, который подсчитывает длину отрезков. Выделяешь все свои кабеля и вуаля- тебе общая длина.
syntheticman вне форума  
 
Автор темы   Непрочитано 12.07.2007, 11:21
#7
serg01


 
Регистрация: 04.07.2005
Иркутск
Сообщений: 213


Это конечно да, но если делать в слоях, то их число перевалит за 400 штук. А в предлагаемом мной варианте все длины будут храниться в обозначении участка. Это удобно тем, что взглянув на блок мы увидим сразу длину линии и много другой инфы. Так же далее информацию из атрибутов можно быстро экспортировать куда угодно, например для сметчиков и т.д. Делать кабельные журналы, на основе этих данных.
serg01 вне форума  
 
Непрочитано 12.07.2007, 13:50
#8
Дима_

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


C лиспом у меня полная ..., вообще языки высокого уровня недолюбливаю, все время на асме писал, но тут блин озадачили акадом, и чувствую рано или поздно придеться на поклон к Крысу идти, ибо много чего автоматизировать хочеться а на динамических блоках и полях далеко не уползешь. А мое принципиальное мнение что все что может сделать компьютер - он и должен делать, так что скоро (в августе) в отпуск на море, если соберусь возьму книжку по лиспу, буду на пляже читать, если конечно жена не скажет что я совсем того.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 12.07.2007, 14:23
#9
Кулик Алексей aka kpblc
Moderator

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


Ну раз помянули...
Так я не понял, надо просто с блока снять данные атрибутов? И все?
Если да, то тогда давайте нормальное имя блока, нормальные тэги атрибутов, надо ли проходить по внутренностям блоков и внешних ссылок.
Копирование значений атрибутов тоже реализуемо. Задачку пополнее поставьте, а то я ни шиша не понял...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.07.2007, 14:31
#10
Magogi

Инженер
 
Регистрация: 02.07.2007
Волгоград
Сообщений: 83
<phrase 1=


Не знаю, подойдет ли Вам мое решение или нет.
Попробуйте решить все в табличной форме, а значение из динамического блока вытащите с помощью eattext.
Magogi вне форума  
 
Непрочитано 12.07.2007, 15:01
#11
Дима_

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


У меня примерно так, есть дин. блок (квадратики стандартных размеров вся динамика в разной видимости), назывется "стойка"+атрибут "номер" (по сути уникальный), а програмулина должна спросить 2 блока (по номеру атрибута, а лучше выделенные) и выдать в текущию ячейку таблицы длину кабеля под 90 градусов, если не по номеру атриубута делать, то надо учесть что таблица на листе а стойки в модели. Пример в файле только формула в ручную прорисованна, а надо чтоб лиспиком. Ну и второй вопрос как за него тебе пива передать, в Арену боюсь придти не смогу.
[ATTACH]1184238016.dwg[/ATTACH]
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 12.07.2007, 15:36
#12
Кулик Алексей aka kpblc
Moderator

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


Еще сделать сначала надо...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.07.2007, 15:41
#13
Дима_

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


могу и авансом
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 12.07.2007, 16:32
#14
Кулик Алексей aka kpblc
Moderator

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


Если я все верно понял: на листе есть таблица, в ней всего 2 столбца. Таблица есть "заранее". В модели проставлены дин.блоки с атрибутом "номер" (имя блока неважно). Находясь в модели, щелкаем на табличке, а потом последовательно пары блоков.
В общем что получилось (прошу гвозди в меня не заколачивать ):
Код:
[Выделить все]
(defun c:filltable	 (/                           *kpblc-activedoc*
             tbl                         loc:entsel
             blk1                        blk2
             _kpblc-is-ent-block         _kpblc-is-ent-block-with-attr
             _kpblc-is-ent-block-with-constant-attr
             _kpblc-block-attr-get-pointer-mask
             att1                        att2
             )

  (defun _kpblc-is-ent-block (ent)
                             ;|
*    Функция проверяет, является ли переданный указатель блоком
*    ent	указатель на проверяемый примитив
|;
    (and (= (vla-get-objectname ent) "AcDbBlockReference")
         (not (vlax-property-available-p ent 'path))
         ) ;_ end of and
    ) ;_ end of defun

  (defun _kpblc-is-ent-block-with-attr (ent)
                                       ;|
*    Функция проверяет, является ли переданный указатель блоком и есть ли в нем
* изменяемые атрибуты
*    ent	указатель на проверяемый примитив
|;
    (and
      (_kpblc-is-ent-block ent)
      (= (vla-get-hasattributes ent) :vlax-true)
      (> (vlax-safearray-get-u-bound
           (vlax-variant-value (vla-getattributes ent))
           1
           ) ;_ end of vlax-safearray-get-u-bound
         -1
         ) ;_ end of >
      ) ;_ end of and
    ) ;_ end of defun

  (defun _kpblc-is-ent-block-with-constant-attr (ent)
                                                ;|
*    Функция проверяет, является ли переданный указатель блоком с постоянными атрибутами
*    Параметры вызова:
*	ent	указатель на вхождение блока
|;
    (and (_kpblc-is-ent-block ent)
         (vlax-method-applicable-p ent 'getconstantattributes)
         (> (vlax-safearray-get-u-bound
              (vlax-variant-value (vla-getconstantattributes ent))
              1
              ) ;_ end of vlax-safearray-get-u-bound
            -1
            ) ;_ end of >
         ) ;_ end of and
    ) ;_ end of defun

  (defun _kpblc-block-attr-get-pointer-mask (blk mask / res)
                                            ;|
*    Получение списка атрибутов блока по маске. Учитываются также постоянные атрибуты.
*    Параметры вызова:
*	blk	указатель на вставку блока
*	mask	строка с маской тэга атрибута
|;
    (if (_kpblc-is-ent-block-with-attr blk)
      (setq res
             (vl-sort
               (vl-remove-if-not
                 '(lambda (x)
                    (wcmatch (strcase (vla-get-tagstring x))
                             (strcase mask)
                             ) ;_ end of wcmatch
                    ) ;_ end of lambda
                 (vlax-safearray->list (vlax-variant-value (vla-getattributes blk)))
                 ) ;_ end of vl-remove-if-not
               '(lambda (a b)
                  (< (strcase (vla-get-tagstring a))
                     (strcase (vla-get-tagstring b))
                     ) ;_ end of <
                  ) ;_ end of lambda
               ) ;_ end of vl-sort
            ) ;_ end of setq
      ) ;_ end of if
    (if (_kpblc-is-ent-block-with-constant-attr blk)
      (setq
        res (append res
                    (vl-sort
                      (vl-remove-if-not
                        '(lambda (x)
                           (wcmatch (strcase (vla-get-tagstring x))
                                    (strcase mask)
                                    ) ;_ end of wcmatch
                           ) ;_ end of lambda
                        (vlax-safearray->list
                          (vlax-variant-value (vla-getconstantattributes blk))
                          ) ;_ end of vlax-safearray->list
                        ) ;_ end of vl-remove-if-not
                      '(lambda (a b)
                         (< (strcase (vla-get-tagstring a))
                            (strcase (vla-get-tagstring b))
                            ) ;_ end of <
                         ) ;_ end of lambda
                      ) ;_ end of vl-sort
                    ) ;_ end of cons
        ) ;_ end of setq
      ) ;_ end of if
    res
    ) ;_ end of defun

  (defun loc:entsel (msg ent-type / res)
    (if
      (and
        (not
          (vl-catch-all-error-p
            (vl-catch-all-apply
              '(lambda ()
                 (setq res (car (entsel (strcat "\n" msg " <Отмена> : "))))
                 ) ;_ end of lambda
              ) ;_ end of vl-catch-all-apply
            ) ;_ end of vl-catch-all-error-p
          ) ;_ end of not
        res
        (wcmatch (strcase (cdr (assoc 0 (entget res)))) (strcase ent-type))
        ) ;_ end of and
       (vlax-ename->vla-object res)
       ) ;_ end of if
    ) ;_ end of defun

  (vl-load-com)
  (vla-startundomark
    (setq *kpblc-activedoc* (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-StartUndoMark
  (command "_.pspace")
  (if (setq tbl (loc:entsel "Таблица вывода результата" "acad_table"))
    (progn
      (command "_.mspace")
      (while (and (setq blk1 (loc:entsel "Блок откуда мерить" "insert"))
                  (= (vla-get-isdynamicblock blk1) :vlax-true)
                  (setq att1 (_kpblc-block-attr-get-pointer-mask blk1 "номер"))
                  (setq blk2 (loc:entsel "Блок докудова мерять" "insert"))
                  (= (vla-get-isdynamicblock blk2) :vlax-true)
                  (setq att2 (_kpblc-block-attr-get-pointer-mask blk2 "номер"))
                  ) ;_ end of and
        (vlax-invoke-method
          tbl
          'insertrows
          (vla-get-rows tbl)
          (vla-getrowheight tbl (1- (vla-get-rows tbl)))
          1
          ) ;_ end of vlax-invoke-method
        (vla-settext
          tbl
          (1- (vla-get-rows tbl))
          0
          (strcat "Длина "
                  (vla-get-textstring (car att1))
                  "-"
                  (vla-get-textstring (car att2))
                  ) ;_ end of strcat
          ) ;_ end of vlax-invoke-method
        (vla-settext
          tbl
          (1- (vla-get-rows tbl))
          1
          (strcat
            "%<\\AcExpr ((abs(%<\\AcObjProp Object(%<\\_ObjId "
            (vl-princ-to-string (vla-get-objectid blk1))
            ">%).InsertionPoint \\f \"%pt1\">%-%<\\AcObjProp Object(%<\\_ObjId "
            (vl-princ-to-string (vla-get-objectid blk2))
            ">%).InsertionPoint \\f \"%pt1\">%)+abs(%<\\AcObjProp Object(%<\\_ObjId "
            (vl-princ-to-string (vla-get-objectid blk1))
            ">%).InsertionPoint \\f \"%pt2\">%-%<\\AcObjProp Object(%<\\_ObjId "
            (vl-princ-to-string (vla-get-objectid blk2))
            ">%).InsertionPoint \\f \"%pt2\">%))/1000) \\f \"%lu2%pr1\">%"
            ) ;_ end of strcat
          ) ;_ end of vlax-invoke-method
        ) ;_ end of while
      ) ;_ end of progn
    ) ;_ end of if
  (command "_.pspace")
  (vla-endundomark *kpblc-activedoc*)
  (princ)
  ) ;_ end of defun
Для вызова команда filltable
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.07.2007, 16:50
#15
Дима_

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


Я бы за 51 минуту этого просто не переписал бы. Крыс - это по моему коллектив разработчиков под одним псевдонимом, очень мощно и ОГРОМНОЕ СПАСИБО - ОЧЕНЬ ПОМОГЛО, сколько пива за день можешь выпить?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 12.07.2007, 17:03
#16
Кулик Алексей aka kpblc
Moderator

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


Ик! Приходи, ик! увидишь ик!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.07.2007, 17:07
#17
Дима_

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


Так куда идти - то напиши, приду с ПИВОМ!!! http://dwg.ru/forum/sm/sm700.gif
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 12.07.2007, 17:19
#18
Кулик Алексей aka kpblc
Moderator

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


Дык ента... В Арену
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.07.2007, 17:21
#19
Дима_

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


Блин постараюсь конечно, но обещать не могу - по сему до сих пор и не вписывался. Serg01у тоже отдельное спасибо, тему нарисовал нужную.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 13.07.2007, 05:10
#20
serg01


 
Регистрация: 04.07.2005
Иркутск
Сообщений: 213


Кулик Алексей aka kpblc
Ух ты сколько всего за одну ночь Все пропустил интересное
Цитата:
В “блок А” мы сами заносим длину линии, которая под ним находится например. Заносится она в атрибут “METRAZ”. Теперь чтоб метраж занесся в атрибут “блока Б” нужно вызвать некую команду, результатом которой должен явиться запрос с указанием блока и его атрибута, из которого должен браться метраж предыдущего участка, следующей линии и снова блока, в который должно занестись уже посчитанное (суммированное) значение (тоже с выбором атрибутов “METRAZ” или “SSILKA”).
Все задачи решили кроме моей Сейчас расскажу
Цитата:
Так я не понял, надо просто с блока снять данные атрибутов? И все?
По сути да, и с блока, и с линии ее длину.
Цитата:
тогда давайте нормальное имя блока
Блок переименовал в uchastok.
Цитата:
нормальные тэги атрибутов
Не совсем понял что это значит :?: Там есть METRAZ и SSILKA
Цитата:
надо ли проходить по внутренностям блоков
Надо, но только по двум: METRAZ или SSILKA
Постараюсь понятнее объяснить:
В “Блок А” (название его uchastok) мы сами заносим длину линии (A). Заносится она в атрибуты “METRAZ” или "SSILKA" (или в тот или в другой).
Теперь нужно вызвать некую команду, результатом которой должен явиться запрос, который бы "просил" указать:
1) блок (например "Блок А" на схеме);
2) его атрибуты "METRAZ" или "SSILKA" на выбор;
3) линию или множество линий (например D);
4) блока и его атрибутов "METRAZ" или "SSILKA" на выбор (на схеме "Блок Б").

В четвертом пункте в атрибуты "METRAZ" или "SSILKA" на выбор должна записаться сумма значений пунктов 2, 3 (длина линии или сумма длин линий).
Фуф, вот такая задача у меня.
[ATTACH]1184289032.dwg[/ATTACH]
serg01 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Подсчет кабеля при помощи дин. блока с атрибутами

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

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