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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > как придать признак замкнутости всем полилиниям, чьи начало и конец совпадают?

как придать признак замкнутости всем полилиниям, чьи начало и конец совпадают?

Ответ
Поиск в этой теме
Непрочитано 18.10.2011, 02:00 #1
как придать признак замкнутости всем полилиниям, чьи начало и конец совпадают?
АлексЮстасу
 
топограф, технолог
 
Москва
Регистрация: 24.05.2009
Сообщений: 3,072

Есть множество полилиний (в данном случае горизонталей, но бывают и контуры домов на планах и т.д., и т.п.). Часть из них замкнута, но не по признаку "Замкнуто==Closed", а фактически - начало и конец совпадают. Для обработки данных часто необходимо обращаться именно к таким полилиниям - выделять их, как-то манипулировать (расставлять бергштрихи, удалять слишком мелкие, искать дыры и т.д и т.п.).
Как такие полилинии, чьи начало и конец совпадают, находить, и придавать им признак "Замкнуто==Closed"? Чтобы в дальнейшем легко их отлавливать по этому признаку.
Просмотров: 5894
 
Непрочитано 18.10.2011, 09:03
#2
Свиридов

ведущий инженер отдела автоматизации проектных работ
 
Регистрация: 18.05.2009
Воронеж
Сообщений: 391


Можно было бы быстрым выбором по замкнутости попробовать, но тогда выберутся ВСЕ незамкнутые полилинии.. Скорее всего, тут поможет какая-нибудь прога на Lisp-е.

Последний раз редактировалось Свиридов, 18.10.2011 в 09:11.
Свиридов вне форума  
 
Непрочитано 18.10.2011, 10:29
#3
igorni


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


Если на голом АКАДе то можно выделить по свойству Closed все незамкнутые полилинии и выполнить _region. Фактически замкнутые полилинии преобразуются в регион.
Короче лисп нада.
igorni вне форума  
 
Непрочитано 18.10.2011, 12:18
1 | #4
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


k2k
Вложения
Тип файла: zip k2k.zip (849 байт, 75 просмотров)
Victor вне форума  
 
Непрочитано 18.10.2011, 12:52
#5
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Да, теме место в разделе программирование, вот еще вариант
Код:
[Выделить все]
 
; Вызов: cl_p
(defun c:cl_pl()
  (vl-load-com)
  ((lambda(nbr)
     (if (and nbr
              (not (vl-catch-all-error-p nbr))
              )
       (foreach item (vl-remove-if 'listp (mapcar 'cadr (ssnamex nbr)))
         (if (equal (vlax-curve-getStartPoint item) (vlax-curve-getEndPoint item) 0.0001)
           ((lambda(ed)
              (setq ed (subst (cons 70 1) (assoc 70 ed) ed))
              (entmod ed)
              (entupd item)
              )
             (entget item)
             )
           )
         )
       )
     )
    (vl-catch-all-apply 'ssget
                        (list (list (cons 0 "*POLYLINE")))
                        )
    )
  (princ)
  ); end close_pl
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 18.10.2011, 13:24
#6
Дима_

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


то TararykovDG - тут бы по хорошему надо последний сегмент удалять, но небольшая возня с "бубликами" будет и я бы из набора замкнутые сразу исключил.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 18.10.2011, 14:03
#7
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Круто! Аж два варианта. А чем k2k Victor отличается от cl_pl TararykovDG?
И мелкая проблемка: обе почему-то заменяют признак генерации линий с ДА на НЕТ. Можно оставлять признак генерации без изменений? Нам важно сохранять Enabled.
АлексЮстасу вне форума  
 
Непрочитано 18.10.2011, 14:29
1 | #8
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


АлексЮстасу, попробуй так. Исправил, по возможности, с учетом рекомендаций Дима_ (из набора замкнутые сразу исключил) и АлексЮстасу (признак генерации линий)
Код:
[Выделить все]
 
(defun c:cl_pl()
  (vl-load-com)
  ((lambda(nbr)
     (if (and nbr
              (not (vl-catch-all-error-p nbr))
              )
       (foreach item (vl-remove-if 'listp (mapcar 'cadr (ssnamex nbr)))
         (if (equal (vlax-curve-getStartPoint item) (vlax-curve-getEndPoint item) 0.0001)
           ((lambda(ed)
              (setq ed (subst (cons 70 (1+ (cdr (assoc 70 ed)))) (assoc 70 ed) ed))
              (entmod ed)
              (entupd item)
              )
             (entget item)
             )
           )
         )
       )
     )
    (vl-catch-all-apply 'ssget
                        (list (list (cons 0 "*POLYLINE") (cons -4 "<NOT") (cons -4 "&") (cons 70 1) (cons -4 "NOT>")))
                        )
    )
  (princ)
  ); end close_pl
P. S. Чем отличается мой код от кода Victor, не знаю, так как Victor выложил скомпилированный fas-файл
To Дима_, последний сегмент не удаляю, боюсь для сглаженных полилиний последный сегмент важен для сохранения изначальной геометрии. С бубликами вроде проблем не обнаружил
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 18.10.2011, 19:31
#9
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
АлексЮстасу (признак генерации линий)
To Дима_, последний сегмент не удаляю, боюсь для сглаженных полилиний последный сегмент важен для сохранения изначальной геометрии. С бубликами вроде проблем не обнаружил
Спасибо, генерация сохраняется!
Да, не нужно ничего удалять. При передаче в другие программы (не ведающие о существовании автокадовского спец. признака Closed) нужно, чтобы замкнутые контуры оставались замкнутыми фактически.

Два вопроса (все как всегда, и как всегда все хуже, чем думалось):
Первый: Можно ли добавить допуск на несовпадение? Как водится, обнаружилось, что не все концы с концами...
Или попробовать воспользоваться PL-JOIN из PL-TOOLS, но с допуском?

А второй не только в эту тему, но к оч. многим программам. Может быть и в отдельную тему?
Можно ли как-то использовать данную программу (и многие-многие другие) пакетно, для обработки сразу множества файлов? Например, в данном случае косяки обнаружились сразу в 90 файлах.
И чтобы можно было каждый файл обрабатывать не одной программой, а последовательностью из нескольких?

Последний раз редактировалось АлексЮстасу, 18.10.2011 в 19:38.
АлексЮстасу вне форума  
 
Непрочитано 18.10.2011, 19:57
1 | #10
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,171


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Первый: Можно ли добавить допуск на несовпадение? Как водится, обнаружилось, что не все концы с концами...
так ведь есть, в 8 строке кода из #8. Там он равен 0,0001, сделайте побольше, настолько там концы с концами расходятся.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Можно ли как-то использовать данную программу (и многие-многие другие) пакетно, для обработки сразу множества файлов
Именно эту - проще простого. Дописать в конце приведенного в #8 кода, после самой последней скобки
Код:
[Выделить все]
 
(c:cl_pl)
(vla-close (vla-get-ActiveDocument (vlax-get-acad-object)) :vlax-true)
и добавить в автозагрузку.
Это чтобы при открытии файла проводилась процедура, после чего он сразу закрывается с сохранением изменений.
После обработки нужных файлов не забыть убрать из автозагрузки
Сложные варианты с выбором папки и использованием DBX не рассматриваем

По поводу других прог - смотря что и как они делают. Возможно, с ними такой фокус не пройдет. И вообще, вопрос пакетной обработки не раз обсуждался.
kp+ вне форума  
 
Автор темы   Непрочитано 19.10.2011, 14:45
#11
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Цитата:
Сообщение от kp+ Посмотреть сообщение
так ведь есть, в 8 строке кода из #8. Там он равен 0,0001, сделайте побольше, настолько там концы с концами расходятся.

Именно эту - проще простого. Дописать в конце приведенного в #8 кода, после самой последней скобки
Код:
[Выделить все]
 
(c:cl_pl)
(vla-close (vla-get-ActiveDocument (vlax-get-acad-object)) :vlax-true)
и добавить в автозагрузку.
Это чтобы при открытии файла проводилась процедура, после чего он сразу закрывается с сохранением изменений.
После обработки нужных файлов не забыть убрать из автозагрузки
Сложные варианты с выбором папки и использованием DBX не рассматриваем

По поводу других прог - смотря что и как они делают. Возможно, с ними такой фокус не пройдет. И вообще, вопрос пакетной обработки не раз обсуждался.
За подсказку о допуске спасибо!

Вы про пакетную обработку правильно поняли - выбрать в нормальном окне папку, в которой лежат файлы, натаскать из списка программ нужные в нужной последовательности, установить параметры выполнения этих программ, и сидеть ждать готовых результатов, потирая довольно ручонки
А иначе - сами представляете, что значит просто последовательно открыть Автокадом (!) те же 90 неслабых файлов, выделять их содержимое, ждать исполнения, а потом ждать сохранения каждого. Кстати, Автокад после открытия-закрытия нескольких файлов часто любит уйти в полный отказ...
АлексЮстасу вне форума  
 
Непрочитано 19.10.2011, 15:51
1 | #12
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,171


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Вы про пакетную обработку правильно поняли - выбрать в нормальном окне папку, в которой лежат файлы, натаскать из списка программ нужные в нужной последовательности, установить параметры выполнения этих программ, и сидеть ждать готовых результатов, потирая довольно ручонки
Тянет на проект "Малой красной кнопки" (МКК, не путать с утопической БКК) Это уже достаточно серьезная работа, за которую не грех заплатить денежку (жаль, не мне . Не возьмусь сейчас).

Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
выделять их содержимое
Этому горю можно помочь. Рискую предположить, что все полилинии в модели.
В мой код дописать в начале
Код:
[Выделить все]
 (setvar "ctab" "Model")
а строку 21 из #8 видоизменить так
Код:
[Выделить все]
(list "_X" (list (cons 0 "*POLYLINE") (cons -4 "<NOT") (cons -4 "&") (cons 70 1) (cons -4 "NOT>")))
При открытии Акад сразу переключается в модель, выделяет ВСЕ полилинии без приглашения, проводит процедуру и закрывает файл с сохранением.

Цитата:
что значит просто последовательно открыть Автокадом (!)
Ну, Акад может открывать и по несколько с одного вызова команды Open.


Цитата:
Кстати, Автокад после открытия-закрытия нескольких файлов часто любит уйти в полный отказ...
По 10 за раз - не должен, не всю же без малого сотню сразу.

Последний раз редактировалось kp+, 19.10.2011 в 16:23.
kp+ вне форума  
 
Непрочитано 19.10.2011, 16:53
#13
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
За подсказку о допуске спасибо!

Вы про пакетную обработку правильно поняли - выбрать в нормальном окне папку, в которой лежат файлы, натаскать из списка программ нужные в нужной последовательности, установить параметры выполнения этих программ, и сидеть ждать готовых результатов, потирая довольно ручонки
А иначе - сами представляете, что значит просто последовательно открыть Автокадом (!) те же 90 неслабых файлов, выделять их содержимое, ждать исполнения, а потом ждать сохранения каждого. Кстати, Автокад после открытия-закрытия нескольких файлов часто любит уйти в полный отказ...
АлексЮстасу, именно для этой задачи сделать пакетную обработка просто, без всяких добавлений в автозагрузку, открываний каждого файла, удаления из автозагрузки
Открываешь чистый чертеж, загружаешь лисп, вызываешь (CPL_ALL 0.0001) выбираешь папку с чертежами и все.
Код:
[Выделить все]
 
; Пример вызова: (CPL_ALL 0.0001) - 0.0001 погрешность определения замкнутости
(defun CPL_ALL(eps_close / )
  (vl-load-com)
  (close-pl (Directory-Dia "Укажите папку: "))
  (princ)
  ); end CPL_ALL

(defun close-pl(path_folder / lst_files path_file odbx ent index)
  (setq index 1)
  (if path_folder
    (if (setq lst_files (get-all-files-in-folder path_folder "dwg"))
      (foreach path_file lst_files
        (setvar "MODEMACRO" (strcat "Всего файлов: " (itoa (length lst_files)) "     Обработано: " (itoa index) "     Текущий файл: " path_file))
        (if (setq odbx (_lispru-odbx))
          (progn
            (vla-open odbx path_file)
            (vlax-for ent (vla-get-ModelSpace odbx)
              (if (or (= (vla-get-objectname ent) "AcDbPolyline")
                      (= (vla-get-objectname ent) "AcDb2dPolyline")
                      )
                (if (equal (vlax-curve-getStartPoint ent) (vlax-curve-getEndPoint ent) eps_close)
                  (vla-put-Closed ent :vlax-true)
                  )
                )
              )
            (vla-saveas odbx path_file)
            (vlax-release-object odbx)
            (setq odbx nil)
            )
          )
        (setq index (1+ index))
        )
      )
    )
  (setvar "MODEMACRO" "")
  ); end close-pl


;|	Для работы с неактивным документом используется метод ObjectDBX
	http://autolisp.ru/2010/04/08/proceed-unactive-document/
|;
; Функции _lispru-acad-version и _lispru-odbx взяты отсюда http://autolisp.ru/2010/04/08/proceed-unactive-document/
;	Directory-Dia - http://www.caduser.ru/forum/index.php?PAGE_NAME=message&FID=23&TID=48293&MID=269115#message269115 пост #2


(defun _lispru-acad-version ()	; http://autolisp.ru/2010/04/08/proceed-unactive-document/
;|
*    Возвращает номер сборки AutoCAD'a. Для 2005 вернет 16.1, для 2006 - 16.2
* и т.д.
|;
(atof (getvar "acadver"))
) ;_ end of defun


(defun _lispru-odbx (/)	; http://autolisp.ru/2010/04/08/proceed-unactive-document/
                    ;|
*    функция возвращает интерфейс IAxDbDocument (для работы с файлами DWG без
* их открытия). Если интерфейс не поддерживается, возвращает nil. Проверено
* на ACAD 2002, 2004, 2005, 2006, 2007, 2008, 2010
*    Автор - Fatty aka Олег jr. 
*    Параметры вызова:
* нет
*    Примеры вызова:
(_lispru-odbx)
|;
  (cond
    ((< (_lispru-acad-version) 15.06)
     (alert
       "ObjectDBX method not applicable\nin this AutoCAD version"
       ) ;_ end of KPBLC-MSG-ALERT
     nil
     )
    ((= (fix (_lispru-acad-version)) 15)
     (if (not (vl-registry-read
                "HKEY_CLASSES_ROOT\\ObjectDBX.AxDbDocument\\CLSID"
                ) ;_ end of vl-registry-read
              ) ;_ end of not
       (startapp "regsvr32.exe"
                 (strcat "/s \"" (findfile "axdb15.dll") "\"")
                 ) ;_ end of startapp
       ) ;_ end of if
     (vla-getinterfaceobject
       (vlax-get-acad-object)
       "ObjectDBX.AxDbDocument"
       ) ;_ end of vla-getinterfaceobject
     )
    (t
     (vla-getinterfaceobject
       (vlax-get-acad-object)
       (strcat "ObjectDBX.AxDbDocument." (itoa (fix (_lispru-acad-version))))
       ) ;_ end of vla-getinterfaceobject
     )
    ) ;_ end of cond
) ;_ end of defun


; Исходный код http://www.caduser.ru/forum/index.php?PAGE_NAME=message&FID=23&TID=48293&MID=269115#message269115 пост #2
(defun Directory-Dia (Message / sh folder folderobject result)
    ;; By Tony Tanzillo
    ;; Modified by Tim Willey
    ;; 16 Will let you type in the path
    ;; 64 Will let you create a new folder
    ;; Use
    ;; (Directory-Dia "Create Sheet Index \nSelect directory to grab Drawings \nBy Tim Willey 09/13/07")

    (setq sh
      (vla-getInterfaceObject
        (vlax-get-acad-object)
        "Shell.Application"
      )
    )
    (setq folder
      (vlax-invoke-method
        sh
        'BrowseForFolder
        (vla-get-HWND (vlax-get-Acad-Object))
        Message
        0 ;;; This is the bit number to change.
               ;;; Вместо 0 можно попробовать (+ 16 64)
		;;; 16 - позволяет набирать путь 
		;;; 64 - позволяет создавать новую папку
	""	; - корневой каталог, не обязательный параметр !!! НЕЛЬЗЯ БУДЕТ ВЕРНУТЬСЯ НА УРОВЕНЬ ВЫШЕ !!!
      )
    )
    (vlax-release-object sh)
    (if   folder
      (progn
   (setq folderobject
          (vlax-get-property folder 'Self)
   )
   (setq result
          (vlax-get-property FolderObject 'Path)
   )
   (vlax-release-object folder)
   (vlax-release-object FolderObject)
   (if (/= (substr result (strlen result)) "\\")
     (setq result (strcat result "\\"))
     result
   )
      )
    )
) ;_ end of defun


; Выбрать все файлы из указанной папки с учетом вложенный папок
;	folder_path - путь до папки
;	extension - расширение выбираемых файлов
;	result - список выбранных файлов
(defun get-all-files-in-folder(folder_path extension / result)
  ((lambda(current_path f-rec)
     (f-rec current_path)
     result
     )
    folder_path
    (lambda(path)
      (foreach item (vl-directory-files path (strcat "*." extension) 1)
        (setq result (cons (strcat path item) result))
        )
      (foreach item (cddr (vl-directory-files path "*.*" -1))
        (f-rec (strcat path item "\\"))
        )
      )
    )
  (reverse result)
  ); end get-all-files-in-folder
; -----------------------------------------------------------
P. S. Для "натаскать из списка программ нужные в нужной последовательности, установить параметры выполнения этих программ, и сидеть ждать готовых результатов, потирая довольно ручонки" как сказал kp+ сложнее особенно если учесть что при работе с DBX есть ограничения
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 19.10.2011, 17:26
#14
Кулик Алексей aka kpblc
Moderator

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


TararykovDG, забыл про проверку состояния слоев. И напрочь забыл о пространствах листов Ну, про блоки и внешние ссылки молчу...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.10.2011, 19:47
#15
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
TararykovDG, забыл про проверку состояния слоев. И напрочь забыл о пространствах листов Ну, про блоки и внешние ссылки молчу...
Ну двойка мне. Добавил исключение объектов с блокированных слоев, обработку/не обработку объектов в пространствах листов сделал входным параметром. Про блоки и внешние ссылки, честно говоря, не понял. Если имеются ввиду блоки и внеш. ссылки внутри обрабатываемого файла так они и так будут пропущены не пройдя проверку на то, что объект является полилинией, если имеется ввиду что сам файл может быть описанием блока или использоваться в др. файлах как внеш. ссылка, то это уж пользователь сам выбирает папку и набор файлов для обработки.
Код:
[Выделить все]
  
; Пример вызова: (CPL_ALL 0.0001 t) - 0.0001 погрешность определения замкнутости; t - значит обрабатывать объекты в пространствах листов/ nil - пропускать пространства листов
(defun CPL_ALL(eps_close paper_space / )
  (vl-load-com)
  (close-pl (Directory-Dia "Укажите папку: "))
  (princ)
  ); end CPL_ALL

(defun close-pl(path_folder / lst_files path_file odbx ent index layer lst_locked_layer)
  (setq index 1)
  (if path_folder
    (if (setq lst_files (get-all-files-in-folder path_folder "dwg"))
      (foreach path_file lst_files
        (setvar "MODEMACRO" (strcat "Всего файлов: " (itoa (length lst_files)) "     Обработано: " (itoa index) "     Текущий файл: " path_file))
        (if (setq odbx (_lispru-odbx))
          (progn
            (vla-open odbx path_file)
	    (vlax-for layer (vla-get-Layers odbx)
	      (if (= (vla-get-Lock layer) :vlax-true)
		(setq lst_locked_layer (cons (vla-get-Name layer) lst_locked_layer))
		)
	      )
            (vlax-for ent (vla-get-ModelSpace odbx)
              (if (and (or (= (vla-get-objectname ent) "AcDbPolyline")
                           (= (vla-get-objectname ent) "AcDb2dPolyline")
                           )
		       (not (member (vla-get-Layer ent) lst_locked_layer))
		       )
                (if (equal (vlax-curve-getStartPoint ent) (vlax-curve-getEndPoint ent) eps_close)
                  (vla-put-Closed ent :vlax-true)
                  )
                )
              )
	    (if paper_space
	      (vlax-for blk (vla-get-Blocks odbx)
		(if (and (= (vla-get-IsLayout blk) :vlax-true)
			 (not (= (vla-get-Name blk) "*Model_Space"))
			 )
		  (vlax-for ent blk
		    (if (and (or (= (vla-get-objectname ent) "AcDbPolyline")
				 (= (vla-get-objectname ent) "AcDb2dPolyline")
				 )
			     (not (member (vla-get-Layer ent) lst_locked_layer))
			     )
		      (if (equal (vlax-curve-getStartPoint ent) (vlax-curve-getEndPoint ent) eps_close)
			(vla-put-Closed ent :vlax-true)
			)
		      )
		    )
		  )
		)
	      )
            (vla-saveas odbx path_file)
            (vlax-release-object odbx)
            (setq odbx nil
		  lst_locked_layer nil
		  )
            )
          )
        (setq index (1+ index))
        )
      )
    )
  (setvar "MODEMACRO" "")
  ); end close-pl


;|	Для работы с неактивным документом используется метод ObjectDBX
	http://autolisp.ru/2010/04/08/proceed-unactive-document/
|;
; Функции _lispru-acad-version и _lispru-odbx взяты отсюда http://autolisp.ru/2010/04/08/proceed-unactive-document/
;	Directory-Dia - http://www.caduser.ru/forum/index.php?PAGE_NAME=message&FID=23&TID=48293&MID=269115#message269115 пост #2


(defun _lispru-acad-version ()	; http://autolisp.ru/2010/04/08/proceed-unactive-document/
;|
*    Возвращает номер сборки AutoCAD'a. Для 2005 вернет 16.1, для 2006 - 16.2
* и т.д.
|;
(atof (getvar "acadver"))
) ;_ end of defun


(defun _lispru-odbx (/)	; http://autolisp.ru/2010/04/08/proceed-unactive-document/
                    ;|
*    функция возвращает интерфейс IAxDbDocument (для работы с файлами DWG без
* их открытия). Если интерфейс не поддерживается, возвращает nil. Проверено
* на ACAD 2002, 2004, 2005, 2006, 2007, 2008, 2010
*    Автор - Fatty aka Олег jr. 
*    Параметры вызова:
* нет
*    Примеры вызова:
(_lispru-odbx)
|;
  (cond
    ((< (_lispru-acad-version) 15.06)
     (alert
       "ObjectDBX method not applicable\nin this AutoCAD version"
       ) ;_ end of KPBLC-MSG-ALERT
     nil
     )
    ((= (fix (_lispru-acad-version)) 15)
     (if (not (vl-registry-read
                "HKEY_CLASSES_ROOT\\ObjectDBX.AxDbDocument\\CLSID"
                ) ;_ end of vl-registry-read
              ) ;_ end of not
       (startapp "regsvr32.exe"
                 (strcat "/s \"" (findfile "axdb15.dll") "\"")
                 ) ;_ end of startapp
       ) ;_ end of if
     (vla-getinterfaceobject
       (vlax-get-acad-object)
       "ObjectDBX.AxDbDocument"
       ) ;_ end of vla-getinterfaceobject
     )
    (t
     (vla-getinterfaceobject
       (vlax-get-acad-object)
       (strcat "ObjectDBX.AxDbDocument." (itoa (fix (_lispru-acad-version))))
       ) ;_ end of vla-getinterfaceobject
     )
    ) ;_ end of cond
) ;_ end of defun


; Исходный код http://www.caduser.ru/forum/index.php?PAGE_NAME=message&FID=23&TID=48293&MID=269115#message269115 пост #2
(defun Directory-Dia (Message / sh folder folderobject result)
    ;; By Tony Tanzillo
    ;; Modified by Tim Willey
    ;; 16 Will let you type in the path
    ;; 64 Will let you create a new folder
    ;; Use
    ;; (Directory-Dia "Create Sheet Index \nSelect directory to grab Drawings \nBy Tim Willey 09/13/07")

    (setq sh
      (vla-getInterfaceObject
        (vlax-get-acad-object)
        "Shell.Application"
      )
    )
    (setq folder
      (vlax-invoke-method
        sh
        'BrowseForFolder
        (vla-get-HWND (vlax-get-Acad-Object))
        Message
        0 ;;; This is the bit number to change.
               ;;; Вместо 0 можно попробовать (+ 16 64)
		;;; 16 - позволяет набирать путь 
		;;; 64 - позволяет создавать новую папку
	""	; - корневой каталог, не обязательный параметр !!! НЕЛЬЗЯ БУДЕТ ВЕРНУТЬСЯ НА УРОВЕНЬ ВЫШЕ !!!
      )
    )
    (vlax-release-object sh)
    (if   folder
      (progn
   (setq folderobject
          (vlax-get-property folder 'Self)
   )
   (setq result
          (vlax-get-property FolderObject 'Path)
   )
   (vlax-release-object folder)
   (vlax-release-object FolderObject)
   (if (/= (substr result (strlen result)) "\\")
     (setq result (strcat result "\\"))
     result
   )
      )
    )
) ;_ end of defun


; Выбрать все файлы из указанной папки с учетом вложенный папок
;	folder_path - путь до папки
;	extension - расширение выбираемых файлов
;	result - список выбранных файлов
(defun get-all-files-in-folder(folder_path extension / result)
  ((lambda(current_path f-rec)
     (f-rec current_path)
     result
     )
    folder_path
    (lambda(path)
      (foreach item (vl-directory-files path (strcat "*." extension) 1)
        (setq result (cons (strcat path item) result))
        )
      (foreach item (cddr (vl-directory-files path "*.*" -1))
        (f-rec (strcat path item "\\"))
        )
      )
    )
  (reverse result)
  ); end get-all-files-in-folder
; -----------------------------------------------------------
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 20.10.2011, 16:22
#16
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Ох, и ничего себе! Это пять!
Для вящей пущести, можно было б добавить сохранение путей, маску файлов и пр. красоты. Но важнее б добавить отчетность - чего и сколько сделано. Хотя бы, чтобы просто понятно было, что процесс прошел. Впрочем, это так - общие пожелания к каждой первой программке.

А про пакетную обработку в целом я все же тему создам. Вдруг что придумается?
АлексЮстасу вне форума  
 
Непрочитано 20.10.2011, 18:17
#17
Кулик Алексей aka kpblc
Moderator

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


Про пакетную обработку VVA уже делал решения.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > как придать признак замкнутости всем полилиниям, чьи начало и конец совпадают?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Печать под блоком Des501 AutoCAD 20 13.10.2010 15:59
как часто вы ходите в театр? Jоhnny Разное 61 15.06.2009 13:19