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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Обрезать все линии внутри нескольких выбранных полилиний

Обрезать все линии внутри нескольких выбранных полилиний

Ответ
Поиск в этой теме
Непрочитано 26.06.2010, 16:32 #1
Обрезать все линии внутри нескольких выбранных полилиний
Alea
 
Регистрация: 25.01.2010
Сообщений: 7

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

Спасибо!

Миниатюры
Нажмите на изображение для увеличения
Название: 823459dfc3b9.jpg
Просмотров: 375
Размер:	16.2 Кб
ID:	41415  


Последний раз редактировалось Кулик Алексей aka kpblc, 26.06.2010 в 16:54.
Просмотров: 13126
 
Непрочитано 26.06.2010, 16:55
#2
Кулик Алексей aka kpblc
Moderator

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


http://dwg.ru/pub/12
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.06.2010, 17:13
#3
Alea


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


Спасибо,но это не совсем то, что нужно: все прямоугольники разного размера (это окна реального дома, геодезическая съемка), они есть на чертеже изначально, линии (сетка) накладывается потом.
Alea вне форума  
 
Непрочитано 26.06.2010, 17:26
#4
VVA

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


Alea, Добро пожаловать на форум!
Тебе помогут сделующие команды:
1. EXTRIM из ExpressTools (на всякий случай ExpressTools или иногда ET - это бесплатное дополнение к Автокаду, входит в дистрибутив)
2. CookieCutter2 - more fun with ET extrim
Судя по вопросу с лиспом обращаться умеешь. Если нет - читай по ссылке в моей подписи.
По поводу поста #2 - это тоже то, что нужно. Создаешь блок размером 1x1 с маскировкой (часть 2 статьи). Задавая в свойствах масштаб по x и y легко превращаешь его в окно нужного размера.
Можно при определенном навыке сделать этот блок динамическим.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 26.06.2010, 17:55
#5
Alea


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


И EXTRIM и CookieCutter2 выбирает только одну полилинию и нужно указывать сторону, где резать. В любом случае, гораздо удобнее обычного trim, спасибо, не знала про эти команды! Но у меня этих прямоугольников (окошек) больше 200 на каждом доме, для каждого нужно повторять операцию отдельно, что резать, что блок с маскировкой ставить(((
Хотя идею подали: можно все окошки тупо заштриховать солидом в цвет листа (белым) и поставить штриховку на передний план, на экране выглядит погано, а при печати - то, что нужно)))

И все же, может быть можно программку написать? Чтобы выбрать все прямоугольники и вырезать то, что попало внутрь? Кто-нибудь пишет на заказ и сколько такая программка может стоить?

Т.е., получается, нужно команду EXTRIM , переделать так, чтобы можно было выбрать режущие кромки рамкой, все сразу, и указать точки внутри ВСЕХ прямоугольников.

Последний раз редактировалось Alea, 26.06.2010 в 18:00.
Alea вне форума  
 
Непрочитано 26.06.2010, 20:57
#6
Кулик Алексей aka kpblc
Moderator

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


У команды _trim есть замечательная опция _fence...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.06.2010, 21:20
#7
Alea


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


А толку? То же самое делает и рамка... Все равно, тем или иным образом, нужно выбирать линии внутри каждого прямоугольника, а их (прямоугольников)- много...
Т.е. в программе нужно выбрать прямоугольники, секущая линия - это диагональ каждого прямоугольника...алгоритм, кажется, понятен.. напишите кто-нибудь, а?!

Последний раз редактировалось Alea, 26.06.2010 в 21:26.
Alea вне форума  
 
Непрочитано 26.06.2010, 23:59
#8
VVA

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


Alea, Проще "закрыть" их маскировками (WIPEOUT)

Цитата:
Сообщение от Alea Посмотреть сообщение
нужно выбирать линии внутри каждого прямоугольника
Если каждый прямоугольник - это ЗАМКНУТАЯ полилиния.
Код:
[Выделить все]
(defun c:WFP ( / ss)
  ;;;Wipeout From Polyline
 (setq ss (ssget "_I" (list (cons 0  "LWPOLYLINE")(cons 70  1))));_Предварительный выбор
 (SSSETFIRST)
  (and
    (or ss
        (setq ss (ssget  (list '(0 . "LWPOLYLINE") '(70 . 1))))
        )
    (wipe-from-pl ss nil)
    )
  (princ)
  )
(defun c:WFPD ( / ss)
  ;;;Wipeout From Polyline with Delete Polyline
 (setq ss (ssget "_I" (list (cons 0  "LWPOLYLINE")(cons 70  1))));_Предварительный выбор
 (SSSETFIRST)
  (and
    (or ss
        (setq ss (ssget  (list '(0 . "LWPOLYLINE") '(70 . 1))))
        )
    (wipe-from-pl ss t)
    )
  (princ)
  )
(defun wipe-from-pl ( ss del / cnt e1 osm clay ssmask *error* )
  ;;; ss - набор с полилиниями 
  ;;; del - t - удалять полилинии
  ;;; nil - нет
  (vl-load-com)
  (defun *error* (msg / image_set)
        (while (> (getvar "CMDACTIVE") 0) (command))
        (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
        (princ msg)
        (princ)
      )
  (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (setq osm (getvar "OSMODE"))
  (setvar "OSMODE" 0)
  (setvar "CMDECHO" 0)
  (setq clay (getvar "CLAYER"))
  (command "_.LAYER" "_M" "Маскировка" "")
  (setq ssmask (ssadd))
  (and 

       (repeat (setq cnt (sslength ss))
         (setq e1 (ssname ss (setq cnt (1- cnt))))
         (setq ptlist (mapcar 'cdr
                            (vl-remove-if-not 
                              (function (lambda (x) (= 10 (car x))))(entget e1))))
         (command "_WIPEOUT")
         (foreach pt ptlist (command (trans pt 0 1)))
         (command "")
         (ssadd (entlast) ssmask)
         (and del (entdel e1))
         )
       )
  (if (> (sslength ssmask)  0)
    (command "_DRAWORDER" ssmask "" "_F")
    )
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (setvar "CLAYER" clay)
  (setvar "OSMODE" osm)
  (princ "\nОбработано ")
  (princ (sslength ssmask))
  (princ " замкнутых полилиний")
  (setq ss nil ssmask nil)
  (princ)
  )
(princ "\nType WFP or WFPD in command line")
Другие версии здесь
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 26.05.2011 в 15:40. Причина: Обработка предварительного выбора
VVA вне форума  
 
Автор темы   Непрочитано 27.06.2010, 01:37
#9
Alea


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


Подходит!!! Спасибо!! А как сделать, чтобы сначала можно было выбрать те полилинии, которые нужно обрабатывать?
Alea вне форума  
 
Непрочитано 27.06.2010, 10:21
#10
VVA

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


В строке
Цитата:
(setq ss "_X" (ssget (list '(0 . "LWPOLYLINE")
убери "_X".
PS. Я подправил #8. Если нужны и незамкнутые полилинии, то убери из красной строчки '(70 . 1)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 30.06.2010, 22:47
#11
Alea


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


Все работает, спасибо огромное!)
Только если в готовом чертеже запускать - маскировку рисует не на полилиниях, а где-то в другом месте, но это не проблема, один раз и перетащить не трудно))) Маскировкой раньше практически не пользовалась, ведет она себя мало предсказуемо (для меня), порядок слоев меняется, часть маскировки уходит назад, часть остается впереди.... нервирует. Нет ли возможности в автокаде зафиксировать порядок слоев, типа как в фотошопе? "Штатной" функции не нашла(((

Последний раз редактировалось Alea, 30.06.2010 в 22:53.
Alea вне форума  
 
Непрочитано 01.07.2010, 10:13
#12
VVA

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


Цитата:
Сообщение от Alea Посмотреть сообщение
маскировку рисует не на полилиниях, а где-то в другом месте
Добавил обработку ПСК в #8

Цитата:
Сообщение от Alea Посмотреть сообщение
Нет ли возможности в автокаде зафиксировать порядок слоев
Меню Вид->Регенерировать все
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 01.07.2010, 19:51
#13
vade


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


А было бы еще супер если сразу и заменять полилинию маскировкой
vade вне форума  
 
Непрочитано 01.07.2010, 20:49
#14
VVA

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


Цитата:
Сообщение от vade Посмотреть сообщение
А было бы еще супер если сразу и заменять полилинию маскировкой
Я предпочитаю отключать контур (в команде _WIPEOUT опция Контур/Frame)
Код:
[Выделить все]
(defun C:OKNA ( / ss cnt e1 osm clay ssmask )
  (vl-load-com)
  (setq osm (getvar "OSMODE"))
  (setvar "OSMODE" 0)
  (setvar "CMDECHO" 0)
  (setq clay (getvar "CLAYER"))
  (command "_.LAYER" "_M" "Маскировка" "")
  (setq ssmask (ssadd))
  (and 
       ;;;(setq ss (ssget "_X"  (list '(0 . "LWPOLYLINE")
       ;;;                                   '(70 . 1)(cons 410 (getvar "CTAB")))))
       (setq ss (ssget "_:L"  (list '(0 . "LWPOLYLINE") '(70 . 1))))

       (repeat (setq cnt (sslength ss))
         (setq e1 (ssname ss (setq cnt (1- cnt))))
         (setq ptlist (mapcar 'cdr
                            (vl-remove-if-not 
                              (function (lambda (x) (= 10 (car x))))(entget e1))))
         (command "_WIPEOUT")
         (foreach pt ptlist (command (trans pt 0 1)))
         (command "")
         (ssadd (entlast) ssmask)
         (entdel e1)
         )
       )
  (if (> (sslength ssmask)  0)
    (command "_DRAWORDER" ssmask "" "_F")
    )
  (setvar "CLAYER" clay)
  (setvar "OSMODE" osm)
  (princ "\nОбработано ")
  (princ (sslength ssmask))
  (princ " замкнутых полилиний")
  (setq ss nil ssmask nil)
  (princ)
  )
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 01.07.2010 в 22:44.
VVA вне форума  
 
Непрочитано 01.07.2010, 21:14
#15
vade


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


Извиняюсь, наверное не так выразился. А нужно так "А было бы еще супер если сразу и заменять удалять автоматически полилинию после выполнения маскировки
vade вне форума  
 
Непрочитано 01.07.2010, 22:43
#16
VVA

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


vade, Разницы нету. Ты код в #14 смотрел? (нажми на +)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 02.07.2010, 01:01
#17
vade


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


Извинняюсь еще раз, не то подгрузил.
Спасибо большое.
vade вне форума  
 
Непрочитано 13.12.2010, 18:17
#18
АлексЮстасу

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


Отличный, очень нужный лисп создания оптом масок - я тоже искал такой ))
По поводу удаления-обрезания-вырезания.
Tool Pack-->Object-->Erase-->Inside Objects позволяет удалять все элементы, попадающие внутрь контуров, причем, контуров можно сразу указать много. И никаких точек-элементов внутри указывать не требуется!
Проблема там, во-первых, в том, что удалятся элементы целиком, а не обрежутся по границам контуров. Во-вторых, даже если элементы предварительно разбить на границах контуров, то эта утилита либо внутри контуров не удалит все примыкающие к границе (Erase Crossing Objects - N), либо удалит все - и внешние тоже (Erase Crossing Objects - Y).
Разрезание элементов на пересечениях есть - http://forum.dwg.ru/showthread.php?t...t=breakobjects

Можно на основе этих наработок сделать и удаление всех частей всех элементов внутри множества указанных контуров, не указывая точек или элементов внутри контуров?
АлексЮстасу вне форума  
 
Непрочитано 18.05.2011, 19:15
#19
АлексЮстасу

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


Цитата:
Сообщение от Alea Посмотреть сообщение
А как сделать, чтобы сначала можно было выбрать те полилинии, которые нужно обрабатывать?
Цитата:
Сообщение от VVA Посмотреть сообщение
В строке (setq ss "_X" (ssget (list '(0 . "LWPOLYLINE")
убери "_X".
PS. Я подправил #8.
Предварительный выбор полилиний у меня сейчас не обрабатывается.
Оттого, что у меня 2006?
АлексЮстасу вне форума  
 
Непрочитано 19.05.2011, 14:17
#20
VVA

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


Обновил #8. Сделал 2 команды (с удалением и без удаления исходных полилиний)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Обрезать все линии внутри нескольких выбранных полилиний

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание нового типа линий Apelsinov AutoCAD 915 08.07.2022 12:36
Не все линии проекции отображаются при использовании Sectionplane NK2891 AutoCAD 9 02.06.2009 09:09
все линии отображаются одной толщиной это при включенном LWG lisa4ka AutoCAD 7 05.02.2007 20:36
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46
Переход в пунктирные линии примитивов,блоков внутри rectang DDlis Программирование 3 12.03.2005 11:39