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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Создание спецификаций на Lisp

Создание спецификаций на Lisp

Ответ
Поиск в этой теме
Непрочитано 24.01.2009, 14:20 #1
DILev
 
Регистрация: 26.11.2008
Сообщений: 4

Прошу помочь доделать програмку для создания спецификаций в AutoCAD-е моя програмка работает но не до коца (процентов на 50) приходится дощитывать спецификацию в ручную. Проблема в том что колличество одинаковых блоков и колличество позиций у меня не совпадать. Во вложеном файле есть Readme в котором подробна описана проблема и предложен способ ее решения но как это реализовать в Lisp я не знаю. Кроме того там вложен чертеж с динамическими блоками (в которых подсчитываются данные для спецификаций) зон армирования которые и необходимо внести в спецификацию. Если возможно то прошу доделать или прислать замечания по данному Lisp файлу на сколько это возможно.
Зарание благодарен.
Смотри прикрепленый фаил в следующем сообщении.

Фаил почемуто не прикрепился я первый раз тут пытаюсь чегонибудь создать поэтому пытаюсь еще раз

Архив брать "Армирование+спец 2007" иниже (2 сообщение)

Вложения
Тип файла: zip Армирование+спец.zip (738.8 Кб, 205 просмотров)


Последний раз редактировалось DILev, 25.01.2009 в 09:43. Причина: неправильный архив
Просмотров: 5397
 
Непрочитано 25.01.2009, 00:22
#2
Кулик Алексей aka kpblc
Moderator

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


В архиве не увидел readme. О формате файлов можно было бы и предупредить: каталог АсadMenu2005 заставил предположить, что "образец.dwg" в формате 2004-го, а он - 2007.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.01.2009, 09:42 НОРМАЛЬНЫЙ АРХИВ ЗДЕСЬ
#3
DILev


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


Извеняюсь файл дейчтвительно совместим с 2007 там динамические блоки помоему ранее 2007 их не было. Добавил редми и перезалил. Фаил образец попал в архив по ошибке. См. фаил "Армир.dwg" в папке AcadMenu 2005
Вложения
Тип файла: zip Армирование+спец 2007.zip (95.1 Кб, 141 просмотров)

Последний раз редактировалось DILev, 25.01.2009 в 09:53.
DILev вне форума  
 
Непрочитано 26.01.2009, 15:07
#4
Кулик Алексей aka kpblc
Moderator

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


В качестве общих замечаний:
  1. В коде нет обработчика ошибок.
  2. Все переменные глобальные.
  3. Поскольку ты работаешь с версиями, поддерживающими таблицы, почему бы не использовать их?
  4. Атрибуты можно "извлекать" и не прибегая к файловым операциям.
Я не очень понял логику программы, если честно. Вот вариант получения всех атрибутов выделенных блоков по твоим условиям:
Код:
[Выделить все]
(defun temp_spec (/ selset _dwgru-conv-pickset-to-list _dwgru-conv-value-vla-to-list att_lst)

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

;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * _dwgru-conv-pickset-to-list
;;; *
;;; * 03/12/2007 Версия 0001. 
;;; ************************************************************************

  (defun _dwgru-conv-pickset-to-list (value / lst item)
;;; Назначение:
;;; Преобразовывает набор (pickset) в обычный список имен примитивов (ename)
;;; Низкоуровневая функция. Контроль соответствия типов не производится

;;; Параметры: 
;;; value - набор (pickset) или nil если пустой набор
;;; Возврат:
;;;   - список примитивов (Ename)
;;;; Пример
    ;|
(setq point (vla-addpoint (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-3d-point '(0 0 0))))
(_dwgru-conv-pickset-to-list (ssget "_L")) ;_(<Имя объекта: 7ef85e00>)
(_dwgru-conv-pickset-to-list (ssadd)) ;_nil
  |;
    (repeat (setq item (sslength value)) ;_ end setq
      (setq lst (cons (ssname value (setq item (1- item))) lst))
      ) ;_ end repeat
    lst
    ) ;_ end of defun

  (vl-load-com)
  (if (= (type
           (vl-catch-all-apply
             (function
               (lambda ()
                 (setq selset (ssget '((0 . "INSERT")
                                       (66 . 1)
                                       (-4 . "<NOT")
                                       (2 . "*spec*")
                                       (-4 . "NOT>")
                                       )
                                     ) ;_ end of ssget
                       ) ;_ end of setq
                 ) ;_ end of lambda
               ) ;_ end of function
             ) ;_ end of vl-catch-all-apply
           ) ;_ end of type
         'pickset
         ) ;_ end of =
    (progn
      (setq selset  (mapcar (function vlax-ename->vla-object) (_dwgru-conv-pickset-to-list selset))
            att_lst (mapcar
                      (function
                        (lambda (x / res)
                          (mapcar
                            (function
                              (lambda (a)
                                (cons (vla-get-tagstring a) (vla-get-textstring a))
                                ) ;_ end of lambda
                              ) ;_ end of function
                            (apply (function append)
                                   (mapcar
                                     (function _dwgru-conv-value-vla-to-list)
                                     (list (vla-getattributes x)
                                           (vla-getconstantattributes x)
                                           ) ;_ end of list
                                     ) ;_ end of mapcar
                                   ) ;_ end of apply
                            ) ;_ end of mapcar
                          ) ;_ end of lambda
                        ) ;_ end of function
                      selset
                      ) ;_ end of mapcar
            ) ;_ end of setq
      ) ;_ end of progn
    ) ;_ end of if
  att_lst
  ) ;_ end of defun
Список возвращается не сортированным, без группировки
P.S. Дин.блоки, кстати, появились в 2006 версии, а там формат файла 2004
---
Добавлено: посмотри на такой вариант твоего блока армирования (формат 2007). Обрати внимание на атрибут FullNameAuto и его изменение после регенерации.
Вложения
Тип файла: dwg
DWG 2007
Блоки армирования.dwg (238.2 Кб, 839 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.01.2009, 01:24
#5
DILev


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


Я попытаюсь все это учесть, но пока что не знаю как это зделать. На разных форумах есть куча разных способов посчитать количество одинаковых блоков и составить список, проблема в том что мои частично одинаковы. Вот этого я нигде найти не могу.
А до таблиц мне вообще еще очень далеко.
В отдельные файлы я сбрасываю все это для наглядности, потом можно будет что-либо поменять.
Атрибут после регенерации обновляется, мои тоже (я в 2009 пытаюсь работать, может раньше с этим возникали проблемы – незнаю).
Про 2004 чесано не знал, с кульмана за 2002 пересел - не до блоков было.
P.S. Все что обязательно прочитать - прочел.
DILev вне форума  
 
Непрочитано 27.01.2009, 04:14
#6
wetr

инженер
 
Регистрация: 09.08.2006
Владивосток
Сообщений: 1,536
<phrase 1= Отправить сообщение для wetr с помощью Skype™


Во-первых, очень неплохо для студента (про чертежи)!
По теме.
1.Как можно попробовать решить эту задачу без лиспа.
С помощью _dataextraction. Можно динамические блоки извлекать и сортировать по их свойствам.
Я описывал некоторые возможности с примерами здесь.
2. Чем отличаются твои блоки я не понял. По моему можно их совместить с помощью параметра видимости.
Тогда и лисп твой подойдет
3. У меня была такая же задача. Я вставляю динамические блоки с помощью лиспа, а подсчет
блоков осуществляется с помощью VetCAD++. Он же формирует "Ведомость расхода стали".
Если интересно см. вложение


Порадовал слой "блевный". Даже буква "б" оказалась не проблемой
Вложения
Тип файла: rar Блоки для VetCAD.rar (106.9 Кб, 122 просмотров)
__________________
14 Ибо если вы будете прощать людям согрешения их, то простит и вам Отец ваш Небесный (Мф 6, 14)
wetr вне форума  
 
Автор темы   Непрочитано 27.01.2009, 17:53
#7
DILev


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


Видимо я не правильно объяснил.
Проблемы с извлечением атрибутов нет. Я их извлек, потом с горем пополам отсортировал.
Получилось два файла со списками:
1) C:\Program Files\AcadMenu 2005\Blocks\Спецификации\attextres11.txt – не отсортированный.
2) C:\Program Files\AcadMenu 2005\Blocks\Спецификации\attextres21.txt – отсортированный.

Теоретически должен получится третий attextres31.txt. В котором будут удалены строки в которых совпадают символы на промежутках 1-70 и 82-100, при этом символы 71-81 (цисла) будут просуммированы и записаны в полученную строку.

Пример:
Файл attextres11.txt:
2 %%C6ГОСТ 5781-82* L=100 1 0.02
2 %%C6ГОСТ 5781-82* L=100 2 0.02
2 %%C6ГОСТ 5781-82* L=100 3 0.02
1 %%C18ГОСТ 5781-82* L=2700 10 5.39
1 %%C18ГОСТ 5781-82* L=2700 20 5.39
1 %%C18ГОСТ 5781-82* L=2700 30 5.39
1 %%C18ГОСТ 5781-82* L=2700 40 5.39
3 %%C10ГОСТ 5781-82* L=100 2 0.06

Файл attextres21.txt:
1 %%C18ГОСТ 5781-82* L=2700 10 5.39
1 %%C18ГОСТ 5781-82* L=2700 20 5.39
1 %%C18ГОСТ 5781-82* L=2700 30 5.39
1 %%C18ГОСТ 5781-82* L=2700 40 5.39
2 %%C6ГОСТ 5781-82* L=100 1 0.02
2 %%C6ГОСТ 5781-82* L=100 2 0.02
2 %%C6ГОСТ 5781-82* L=100 3 0.02
3 %%C10ГОСТ 5781-82* L=100 2 0.06

И должен получится файл attextres31.txt:
1 %%C18ГОСТ 5781-82* L=2700 100 5.39
2 %%C6ГОСТ 5781-82* L=100 6 0.02
3 %%C10ГОСТ 5781-82* L=100 2 0.06
К сожалению пробелы в файле не сохрнились.

Блок забавный как такого эффекта добиться я не понял.

Я переделал файл specif.lsp и выкладываю чтобы были видны временные файлы в C:\Program Files\AcadMenu 2005\Blocks\Спецификации\

P.S. Чертеж образец2 не мой я его где-то здесь скачал и по ошибке внес в архив. Когда я учился у нас был ознакомительный курс по AutoCAD 6 или 10 не помню. Поэтому таких чертежей нам и не снилось.
Вложения
Тип файла: lsp specif.lsp (4.2 Кб, 179 просмотров)
DILev вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Создание спецификаций на Lisp



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание небольшой игры на языке LISP TwoZero LISP 9 10.06.2010 18:08
Создание спецификаций Малюк AutoCAD 7 02.08.2007 17:44
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19
Одна из целей: Создание экспертных систем на базе AutoCAD. Сергей Юрьевич Программирование 9 01.01.2005 15:17