Тема: LISP. Объединение штриховок (2006 ACAD)

;|====================================================
Программа для 2006 ACAD'а для оъединения штриховок
1. Сохрани текст в файле "HatchUnion_Den.lsp"
2. Помести файл в любой каталог, который видит ACAD
3. Макрос для кнопки:
^C^C^P(load "HatchUnion_Den");HatchUnion_Den
====================================================|;
(defun C:HatchUnion_Den (/ b c d)
(princ "\nВыбор штриховок для объединения:")
(if (setq b (ssget '((0 . "hatch"))))(progn
(setvar "CMDECHO" 0)
(command "_.undo" "_g")
(setq c (sslength b)
      d (ssadd))
(repeat c
(setq c (1- c))
(command "_-hatchedit" (ssname b c) "_b" "_r" "_n")
(setq d (ssadd (entlast) d))
)
(command "_.union" d "")
(setq d (entlast))
(command "_.bhatch" "_s" d "" ""
     "_.matchprop" (ssname b 0)(entlast) ""
     "_.erase" d b "")
(command "_.undo" "_e")
(setvar "CMDECHO" 1)
))
(princ)
)
(princ)

Re: LISP. Объединение штриховок (2006 ACAD)

Я попробовал пользоваться Вашей программой. Штриховки, созданные в 2007'м AutoCAD'е она объединяет; штриховки, созданные экспортом из T-Flex 9015 в AutoCAD - уничтожает. Почему? Как сделать, чтобы штриховки, созданные экспортом в dwg из других программ, Ваш lisp не уничтожал?

Re: LISP. Объединение штриховок (2006 ACAD)

А в Аcad2008 это прога работать будет?

Re: LISP. Объединение штриховок (2006 ACAD)

> Vanek531
Должна работать и в Аcad2008

Re: LISP. Объединение штриховок (2006 ACAD)

> Гнутарь
Попробуй следующий вариант (правда, особо не тестировал):

;|============================================
Оъединение штриховок (с 2006 ACAD'а)
  HatchUnion_Den от 17.07.08
Макрос для кнопки:
^C^C^P(load "HatchUnion_Den");HatchUnion_Den
==============================================|;
(defun C:HatchUnion_Den (/ b c d e)
(princ "\nВыбор штриховок для объединения:")
(if (setq b (ssget '((0 . "hatch"))))(progn
(setvar "CMDECHO" 0)
(command "_.undo" "_g")
(setq c (sslength b)
      d (ssadd)
      e (entlast))
(while (entnext e)
(setq e (entnext e))
)
(repeat (1- c)
(setq c (1- c))
(command "_-hatchedit" (ssname b c) "_b" "_r" "_n")
(if (not (entnext e))
(command "_-hatchedit" (ssname b c) "_b" "_p" "_n")
)
(if (entnext e)
(while (entnext e)
(setq e (entnext e)
      d (ssadd e d)))
)
)
(if (> (sslength d) 0)
(command "_-hatchedit" (ssname b 0) "_ad" "_s" d "" ""
     "_.erase" d (ssdel (ssname b 0) b) "")
)
(command "_.undo" "_e")
(setvar "CMDECHO" 1)
))
(princ)
)

Re: LISP. Объединение штриховок (2006 ACAD)

> Денис Флюстиков
Спасибо большое, этот вариант работает. Штриховки, созданные в T-Flex, не уничтожает.

Re: LISP. Объединение штриховок (2006 ACAD)

Денис! Спасибо большое. Большинство твоих прог работает отлично. МОЛОДЕЦ!!!

Re: LISP. Объединение штриховок (2006 ACAD)

Денис, а реально написать прогу которая наоборот, разделяет штриховку на две части по заданной линии, проходящей через нее?

Re: LISP. Объединение штриховок (2006 ACAD)

> Mameluk
Сейчас в отпуске, компа с AutoCAD’ом под рукой нет, да и не уверен, что и позже получится что-то рабочее. Сейчас могу только посоветовать обратиться с данной просьбой в другую ветку форума. Возможно, кто-нибудь имеет готовый код, идеи, ссылки или заинтересован, по работе, в решении этой задачки и напишет программу с нуля. Удачи!

Re: LISP. Объединение штриховок (2006 ACAD)

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

(изменено: Александр 3151020, 17 октября 2011г. 14:14:24)

Re: LISP. Объединение штриховок (2006 ACAD)

здравствуйте.
подскажите, каким образом можно вызвать эту функцию другой, передавая ей параметры о двух или нескольких штриховках?


------ добавлено
имею ввиду, нельзя ли обойтись без наборов ?
для меня это пока глухой лес

------ вопрос снят
сделал по-тупому на первое время

добавил в ssget фильтр на нужный слой. строка стала выглядеть так
(defun HatchUnion ($lay / b c d)
    (C:ai_selall) ; выделить всё.. далее сработает фильтр ssget
    (princ "\nВыбор штриховок для объединения:")
    (if (setq b (ssget (list (cons 8 $lay) '(0 . "hatch"))))
где $lay - входной параметр в функцию со строковым параметром имени нужного слоя.
а ля (setq $lay "слой")