Как разбить все объекты автокада (СПДСа и VetCADа) одним действием при помощи лиспа
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как разбить все объекты автокада (СПДСа и VetCADа) одним действием при помощи лиспа

Как разбить все объекты автокада (СПДСа и VetCADа) одним действием при помощи лиспа

Ответ
Поиск в этой теме
Непрочитано 03.08.2010, 12:13 #1
Как разбить все объекты автокада (СПДСа и VetCADа) одним действием при помощи лиспа
megabeton
 
Регистрация: 03.12.2009
Сообщений: 87

Господа, есть такая проблема - хочется написать лисп, который умел бы одним действием разбивать все объекты автокада на примитивы.
Пробую такую вещь:

(defun C:ъ ()
(command "расчленить" "в" "")
(princ)
)

Выдает - "такое то" количество объектов не может быть расчленено, и ничего не разбивает.
Просмотров: 8505
 
Непрочитано 03.08.2010, 13:09
#2
TararykovDG

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


А полилинию, которая уже является примитивом автокада тоже "расчленять" на отрезки? Если нужно "расчленить" все, что расчленяется, то попробуй так:

(defun Explode_All( / nbr obj i len)
(vl-load-com)
(setq nbr (ssget "_X"))
(if nbr
(progn
(setq len (sslength nbr))
(setq i 0)
(while (< i len)
(setq obj (vlax-ename->vla-object (ssname nbr i)))
(if (vlax-method-applicable-p obj 'Explode)
(vla-Explode obj)
)
(setq i (1+ i))
)
)
)
)

Последний раз редактировалось TararykovDG, 03.08.2010 в 13:22.
TararykovDG вне форума  
 
Автор темы   Непрочитано 03.08.2010, 13:51
#3
megabeton


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


Да - разбивать надо все до последнего (до состояния: отрезок, дуга, круг).
Только не понял - как этот лисп запустить (после того как подгружаешь лисп - какую команду вводить). Спасибо.
megabeton вне форума  
 
Непрочитано 03.08.2010, 13:54
#4
Кулик Алексей aka kpblc
Moderator

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


TararykovDG, ты не проходишь по составу блоков. А также забыл про зарегистрированные приложения. Ну а про неграфические записи (читай - словари) я молчу.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 03.08.2010, 14:04
#5
TararykovDG

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


Алексей, абсолютно согласен с недоработкой по поповоду состава блока, а вот словари и приложения - это же, как Вы сами сказали, не графические объекты, а я так понял автору темы нужно "расчленять" лишь то что он видить на чертеже.


megabeton, загрузил лисп, в командной строке ACada введи (Explode_All)
или в лиспе исправь:
(defun Explode_All( / nbr obj i len)
на
(defun c:Explode_All( / nbr obj i len) и в командной строке ACada введи Explode_All (т. е. уже без скобок)
TararykovDG вне форума  
 
Непрочитано 03.08.2010, 14:08
#6
Кулик Алексей aka kpblc
Moderator

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


Оба-на, меня опять размножили ...
Мне кажется, что автору как раз надо полностью очистить файл от следов СПДС / VetCAD. Хотя лично я рекомендовал бы открывать файлы в новом профиле с demandload = 2 или 1, а там уже запускать ExplodeAllProxy и RemoveAllProxy (за авторством А.Ривилиса). Это будет наиболее просто, мне так кажется.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.08.2010, 17:35
#7
megabeton


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


TararykovDG, все так и сделал (исправил, загрузил, написал Explode_All), пишет:

; ошибка: Ошибка Automation. Неверный ввод

Кулик Алексей aka kpblc, от следов спдса и веткада я избавляюсь средствами самого спдса и веткада примерно так:

(defun C:ъ ()
(command "spEXPLODEALL" "" "")
(command "BURST_VC" "в" "")
(command "ОЧИСТИТЬ" "в" "*" "н")
(princ)
)

мне впринципе хватает, хотя ExplodeAllProxy и RemoveAllProxy тоже не плохо.
Хотелось бы дополнить сей лисп глобальным расчленением всего автокадовского
megabeton вне форума  
 
Непрочитано 03.08.2010, 17:41
#8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


У Vetcad'a нет своих объектов. Все делается штатными Автокадовскими примитивами. Поэтому наверное для СПДС - ExplodeProxy с Demandload, VetCAD - explode. Еще два замечания
1.- Explode убъет атрибуты.
2. Если блок подрезан, можно получить неожиданный редультат
С блоками попробуй
BGBLEXP - Взрывает блок и все блоки, входящие в него, превращая видимые атрибуты в текст
Описание там же в #19
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 03.08.2010, 17:53
#9
megabeton


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


Цитата:
Сообщение от VVA
У Vetcad'a нет своих объектов. Все делается штатными Автокадовскими примитивами.... , VetCAD - explode
Согласен, но при взрываний позиций спецификации веткада командой "расчленить" получаешь неадекватный результат (текст увеличивается в размерах). Куда проще ввести команду "BURST_VC"

Но это все лирика... Вопрос то - "Как расчленить объекты автокада", а предложенный TararykovDG вариант не работает
megabeton вне форума  
 
Непрочитано 03.08.2010, 17:56
#10
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от megabeton Посмотреть сообщение
"Как расчленить объекты автокада", а предложенный TararykovDG вариант не работает
Второй вариант
Код:
[Выделить все]
(defun C:EXPLALL ( / ss i)
  (vl-load-com)
  (setq i 0)
  (while (setq ss nil ss (ssget "_X" (list '(0 . "INSERT,*POLYLINE,REGION,MTEXT,HATCH")(cons 410 (getvar "CTAB")))))
    (foreach item (vl-remove-if 'listp (mapcar 'cadr(ssnamex ss)))
      (grtext -2 (strcat "Обрабатываю " (itoa (setq i (1+ i))) " элемент"))
      (if (vlax-write-enabled-p (vlax-ename->vla-object item))
	(vl-cmdf "_.Explode" item)
	)
      )
    )
  (princ)
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 03.08.2010, 17:57
#11
TararykovDG

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


megabeton, Попробуй этот, код. Во-первых, должен “расчленять” все составные части блоков до самого конца, а во-вторых, лучше (vl-cmdf "_.explode" obj "") чем (vla-Explode obj), так как (vla-Explode obj) оставляет за собой исходный (расчленяемый) объект. У меня работает (ACad 2008), если не заработает, ну попробуй в Редакторе VisualLisp в пошаговом режиме и тогда скажи на какой именно строке происходит ошибка. Данный код не учтет те, замечания, что сделал VVA относительно атрибутов и подрезанных блоков!!!

(defun c:Explode_All( / nbr obj a_obj i len flag_stop)
(vl-load-com)
(setq flag_stop nil)
(while (not flag_stop)
(setq nbr (ssget "_X"))
(if nbr
(progn
(setq flag_stop T)
(setq len (sslength nbr))
(setq i 0)
(while (< i len)
(setq obj (ssname nbr i))
(setq a_obj (vlax-ename->vla-object obj))
(if (vlax-method-applicable-p a_obj 'Explode)
(progn
(vl-cmdf "_.explode" obj "")
(setq flag_stop nil)
)
)
(setq i (1+ i))
)
)
(setq flag_stop T)
)
)
)
TararykovDG вне форума  
 
Автор темы   Непрочитано 03.08.2010, 17:58
#12
megabeton


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


Гранд мерси за оперативность, пробую!!!

VVA и TararykovDG, спасибо - оба кода работают,

VVA, я так понял лисп разбивает все что перечислено - "INSERT,*POLYLINE,REGION,MTEXT,HATCH"
и если еще захочу размеры разбить, то надо просто дописать к перечисленному что то вроде "димлайнер"

TararykovDG, лисп игнорирует штриховки, текст и размеры. Все равно спасибо БОЛЬШОЕ что откликнулись

В обоих случаях, правда, автокад (2010 русский) изрядно подвисает при больших файлах и заканчивают
действие после нажатия эскейпа (при небольших файлах все отлично).

И еще.
Извиняюсь за наглость, а нельзя ли соединить действия:
"ExplodeAllProxy и RemoveAllProxy" ,
"BURST_VC или что либо адекватное по разбиению блоков веткада" и "расчленить все автокадовское" в один лисп (и желательно сохранить
последовательность)
Заранее благодарен

Так как никто не откликается сделал следующее:

(defun C:Explode_All ( / ss i)
(command "spEXPLODEALL" "" "")
(command "BURST_VC" "в" "")
(vl-load-com)
(setq i 0)
(while (setq ss nil ss (ssget "_X" (list '(0 . "INSERT,*POLYLINE,REGION,MTEXT")(cons 410 (getvar "CTAB")))))
(foreach item (vl-remove-if 'listp (mapcar 'cadr(ssnamex ss)))
(grtext -2 (strcat "Обрабатываю " (itoa (setq i (1+ i))) " элемент"))
(if (vlax-write-enabled-p (vlax-ename->vla-object item))
(vl-cmdf "_.Explode" item)
)
)
)
(princ)
)

Все работает - меня устраивает
Спасибо всем откликнувшимся

Последний раз редактировалось megabeton, 04.08.2010 в 15:44.
megabeton вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как разбить все объекты автокада (СПДСа и VetCADа) одним действием при помощи лиспа



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Как оптом сохранить все чертежи в формате 14-го автокада? Соня AutoCAD 26 20.03.2011 14:59
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46
БРЕД СИВОЙ КОБЫЛЫ Kryaker Разное 1876 29.12.2006 23:41