Разрыв и соединение объектов
Можно разорвать и объединить два объекта с зазором или нет. Объекты также можно соединить, чтобы создать один или несколько объектов.
Разрыв объектов
Используйте команду РАЗОРВАТЬ, чтобы создать зазор в объекте для образования двух объектов с зазором между ними. Команда РАЗОРВАТЬ часто используется для создания пространства для вставки блока или текста.
Можно создать разрывы в большинстве геометрических объектов, кроме блоков, размеров, мультилиний и областей. В качестве альтернативы используйте команду РАСЧЛЕНИТЬ для этих типов объектов и создайте разрывы в диссоциированной геометрии.
Чтобы разделить такой объект, как линия, дуга или разомкнутая полилиния в одной точке без зазора, используйте команду РАЗОРВАТЬВТОЧКЕ.
Соединение объектов
Для соединения отрезков, дуг, эллиптических дуг, полилиний, 3D-полилиний и сплайнов по их конечным точкам в один объект используйте команду СОЕДИНИТЬ.
Прим.: Спирали в AutoCAD LT не поддерживаются.
Результат операции соединения зависит от выбранных объектов. Типичные области применения
- Замена двух коллинеарных линий одной линией.
- Закрытие зазора в линии, ставшей результатом разрыва.
- Превращение дуги в окружность или эллиптической дуги в эллипс. Для доступа к инструменту «Закрыть» выберите одну дугу или эллиптическую дугу.
- Объединение нескольких длинных полилиний на топографической карте.
- Объединение двух сплайнов с сохранением излома между ними.
Обычно соединение объектов, расположенных впритык, но не лежащих в одной плоскости, приводит к созданию 3D-полилиний и сплайнов.
Прим.: Можно также использовать параметр «Соединить» команды ПОЛРЕД для комбинирования нескольких отрезков, дуг и полилиний в одной полилинии
Понятия, связанные с данным
4.3. Редактирование полилиний
Для изменения сложных примитивов, с учетом их специфики, в системе предусмотрены особые команды. Начнем рассмотрение таких операций с модификации полилиний. Специальное редактирование двумерных полилиний выполняется с помощью команды ПОЛРЕД (PEDIT), которой соответствует кнопка , входящая в панель Редактирование (Modify) ленты и в панель инструментов Редактирование-2 (Modify II) (рис. 4.64). Команду ПОЛРЕД (PEDIT) можно также вызвать двойным щелчком на полилинии (при этом в чертеже не должны быть выделены другие объекты). Рис. 4.64. Панель инструментов Редактирование-2 Мы уже использовали эту команду в главе 2 для выполнения операции объединения в полилинию отрезков и дуг. Рассмотрим другие возможности команды ПОЛРЕД (PEDIT). После выбора полилинии в ответ на запрос Выберите полилинию или [Несколько]: (Select polyline or [Multiple]:) система AutoCAD выдает следующий перечень опций: Задайте параметр [Замкнуть/Добавить/Ширина/Вершина/СГладить/СПлайн/ Убрать сглаживание/Типлин/оБратить/Отменить]: (Enter an option [Close/Join/Width/Edit vertex/Fit/Spline/Decurve/Ltype gen/Reverse/Undo]:) Перечислим опции команды с кратким описанием: Замкнуть (Close) — замыкает разомкнутую (открытую) полилинию; если же была отмечена замкнутая полилиния, то опция изменится на Разомкнуть (Open); Добавить (Join) — добавляет новые сегменты к полилинии; Ширина (Width) — изменяет ширину всех сегментов полилинии на новое постоянное значение; Вершина (Edit vertex) — переходит в режим редактирования вершин полилинии (перемещение вершин, удаление вершин, добавление вершин, изменение ширины отдельных сегментов и т. д.);
Редактирование примитивов | 211 |
СГладить (Fit) — сглаживает полилинию с помощью дуговых сегментов; СПлайн (Spline) — проводит сплайн, проходящий через начальную и конечную точки полилинии по специальному уравнению; Убрать сглаживание (Decurve) — убирает сглаживание, выполненное опциями СГладить (Fit) и СПлайн (Spline); Типлин (Ltype gen) — управляет применением типа линий (для сегментов по отдельности или для всей полилинии в целом); оБратить (Reverse) — изменяет направление полилинии на противоположное; Отменить (Undo) — отменяет последнюю операцию, выполненную в данной команде ПОЛРЕД (PEDIT). Кроме того, нажатие клавиши
212 | Глава 4 |
из прямолинейных сегментов) и после сглаживания (состоит из дуговых сегментов). Исходные вершины полилинии остаются на старых местах, но к ним могут быть добавлены промежуточные, которые исчезают после ликвидации сглаживания (см. описание опции Убрать сглаживание (Decurve)). На рис. 4.67 приведена та же полилиния, но сглаженная с помощью опции СПлайн (Spline). Видно, что промежуточные вершины новой полилинии не совпадают с вершинами старой полилинии. Опция Убрать сглаживание (Decurve) убирает сглаживание, выполненное опциями СГладить (Fit) или СПлайн (Spline). Результирующая полилиния состоит только из прямолинейных сегментов. Для несглаженных полилиний данная опция заменяет дуговые сегменты прямолинейными, сохраняя вершины на старых местах. Рис. 4.66. Сглаживание полилинии с помощью опции СГладить Рис. 4.67. Сглаживание полилинии с помощью опции СПлайн Как было уже сказано в разд. 4.1 , полилиния может быть представлена в информационном окне команды СПИСОК (LIST) (ей соответствует кнопка ) с двумя наименованиями: компактная полилиния и подробная полилиния (LWPOLYLINE и POLYLINE). Компактная полилиния превратится в подробную, если к ней применить операцию сглаживания с помощью опций СГладить (Fit) и СПлайн (Spline). Подробная полилиния может иметь дополнительные вершины, вычисленные системой AutoCAD, а компактная — не может. При отключении сглаживания подробные полилинии преобразуются в компактные полилинии. Опция Типлин (Ltype gen) может использоваться в случае, когда тип линий выбран отличным от сплошной (в AutoCAD этот тип линий называется CONTINUOUS). Опция выдает следующий запрос: Генерация типа линии по всей полилинии [Вкл/Откл] :
(Enter polyline linetype generation option [ON/OFF]
Редактирование примитивов | 213 |
В этот момент можно включить режим генерации типа линии по всей полилинии (по умолчанию он выключен, что ускоряет расчет). На рис. 4.68 приведен пример полилинии с типом линии штриховая (DASHED) при Типлин=Откл (Ltype gen=OFF), а на рис. 4.69 — при Типлин=Вкл (Ltype gen=ON).
Рис. 4.68. Полилиния при Типлин=Откл | Рис. 4.69. Полилиния при Типлин=Вкл |
На рис. 4.68 Типлин=Откл (Ltype gen=OFF) тип линий, состоящий из штрихов и пропусков заданных размеров, применен к каждому сегменту отдельно. Поэтому при недостаточной длине (не хватает длины, чтобы начать второй штрих после зазора) на сегменте вообще не образуются штрихи, как произошло со вторым, третьим и восьмым сегментами. При Типлин=Вкл (Ltype gen=ON) (см. рис. 4.69) длины штрихов откладываются, начиная с самой первой вершины полилинии, по всей полилинии в целом, поэтому штрихи присутствуют на всех сегментах. Недостатком второго режима является то, что зазор между штрихами может попасть на вершину. Самая сложная опция — Вершина (Edit vertex), которая вызывает режим работы с вершинами полилинии, что дает возможность изменять положение вершин, удалять их, добавлять, а также менять ширину конкретного сегмента и разрывать полилинию на части. В версии 2011 часть опций работы с вершинами появилась в меню многофункциональных ручек (см. рис. 4.13). Заметим, что опция преобразования дугового сегмента в прямолинейный или наоборот доступна только через ручки. После выбора опции Вершина (Edit vertex) система AutoCAD выдает запрос: Задайте параметр редактирования вершины [След/Пред/РАзорвать/ВСтавить/ПЕренести/РЕген/ВЫпрямить/Касательная/ Ширина/выХод] <С>: (Enter a vertex editing option [Next/Previous/Break/Insert/Move/Regen/Straighten/Tangent/Width/eXit] 🙂 При этом в первой вершине полилинии появляется знак (рис. 4.70), что означает отметку текущей вершины, к которой будут относиться последующие операции редактирования. Порядок следования вершин аналогичен той последовательности, с которой эти вершины создавались при построении полилинии. В данном режиме доступны такие опции: След (Next) — перейти на следующую вершину; Пред (Previous) — перейти на предыдущую вершину; РАзорвать (Break) — разорвать полилинию, начиная с текущей вершины; ВСтавить (Insert) — вставить новую вершину после текущей; ПЕренести (Move) — перенести текущую вершину на новое место;С>
214 | Глава 4 |
Рис. 4.70. Режим редактирования вершин полилинии РЕген (Regen) — регенерировать (перерисовать) полилинию с текущими установками; ВЫпрямить (Straighten) — выпрямить полилинию на участке, начиная с текущей вершины (удаление соседних вершин); Касательная (Tangent) — задать направление касательной к текущей вершине для будущей операции СГладить (Fit); Ширина (Width) — задать ширину полилинии на участке, начинающемся в текущей вершине; выХод (eXit) — выход из режима редактирования вершин и возврат к запросу Задайте параметр [Замкнуть/Добавить/Ширина/Вершина/СГладить/СПлайн/ Убрать сглаживание/Типлин/Отменить]: (Enter an option [Close/Join/Width/Edit vertex/Fit/Spline/Decurve/Ltype gen/Undo]:) . Опции След (Next) и Пред (Previous) дают возможность перемещаться между вершинами полилинии, чтобы добраться до той вершины, которую надо редактировать. Опция РАзорвать (Break) предназначена для разрыва полилинии. Начало разрыва — в текущей вершине, а окончание разрыва нужно указать в ответ на запрос: Задайте параметр [След/Пред/Выполнить/выХод] <С>: (Enter an option [Next/Previous/Go/eXit] 🙂 Если разрыв нужно выполнить в текущей вершине (после этого полилиния разделится на две полилинии, имеющие общую точку в месте разрыва), то следует воспользоваться опцией Выполнить (Go). При этом все сегменты исходной полилинии сохраняются, оказываясь в составе одной из двух новых полилиний. Если разрыв нужно начать в текущей вершине, а закончить в другой, расположенной дальше или ближе от текущей (и тем самым в результате разрыва удалить участки между текущей и другой вершиной), то необходимо в режиме Разорвать (Break) сначала с помощью опций След (Next) и Пред (Previous) перейти на ту вершину, в которой разрыв будет закончен, и только затем воспользоваться опцией Выполнить (Go). Если режим редактирования вершин больше не нужен, то можно выйти из него с помощью опции выХод (eXit).С>
Редактирование примитивов | 215 |
Рис. 4.71. Разрыв полилинии На рис. 4.71 в левой части изображена полилиния до разрыва, а в правой части — после разрыва, с удалением одного сегмента. Для добавления в полилинию новой вершины нужно воспользоваться опцией ВСтавить (Insert). Перед тем как перейти к этой опции, нужно переместиться к вершине, после которой добавляется новая вершина. Затем следует выбрать опцию ВСтавить (Insert). Система AutoCAD запрашивает: Положение новой вершины: (Specify location for new vertex:) Вы указываете положение новой вершины, вставляемой после текущей. На рис. 4.72 слева показан момент указания положения новой вершины, вставляемой между второй и третьей вершинами, а справа — результат операции вставки. Рис. 4.72. Добавление новой вершины в полилинию Нельзя с помощью этой опции вставить новую вершину перед первой вершиной полилинии. Опция ПЕренести (Move) используется, когда текущую вершину нужно перенести на новое место. При использовании опции выдается запрос: Новое положение помеченной вершины: (Specify new location for marked vertex:) Вам необходимо указать новое положение текущей вершины (рис. 4.73). Справа на рисунке показан результат переноса вершины на новое место.
Рис. 4.73. Перенос вершины полилинии
216 | Глава 4 |
Опция РЕген (Regen) позволяет, не выходя из команды ПОЛРЕД (PEDIT), перечертить (регенерировать) полилинию с текущими изменениями. Если надо удалить какие-то вершины из полилинии, то следует воспользоваться опцией ВЫпрямить (Straighten). Запрос, выдаваемый этой опцией, аналогичен запросу опции РАзорвать (Break): Задайте параметр [След/Пред/Выполнить/выХод] <С>: (Enter an option [Next/Previous/Go/eXit] :). Опция выпрямляет полилинию на участке, начиная с текущей вершины и заканчивая той, в которую можно перейти, перемещаясь по полилинии с помощью опции След (Next) и Пред (Previous). Опция Выполнить (Go) завершает операцию выпрямления. На рис. 4.74 в левой части изображена полилиния до выпрямления, а в правой части — после выпрямления, с удалением четырех вершин. Опция Касательная (Tangent) дает возможность задать направление касательной на вершинах полилинии для будущей операции СГладить (Fit), что позволяет воздействовать на форму линии, получаемой после сглаживания. После выбора опции Касательная (Tangent) следует запрос: Направление касательной в вершине: (Specify direction of vertex tangent:) Рис. 4.74. Выпрямление полилинии Направление задается углом в градусах или точкой. После задания на текущей вершине появляется временная стрелка с указанным направлением (см. вершину полилинии в левой части рис. 4.75). Направление будет использовано только тогда, когда вы в данном сеансе работы с системой AutoCAD выполните операцию сглаживания полилинии с помощью опции СГладить (Fit). В правой нижней части рис. 4.75 показан результат сглаживания, выполненного с учетом направления касательной в указанной ранее вершине. Для сравнения в правой верхней части рисунка приведена аналогичная полилиния, которая была сглажена без задания направления касательной.С>
Редактирование мультилиний в AutoCAD
Мультилиния, как было отмечено выше, представляет собой ломаную двухмерную линию, сегменты которой состоят из нескольких (от 1 до 16) параллельных отрезков. Причем каждый элемент может иметь свой цвет, тип линии и масштаб. В связи с тем, что элементы мультилинии рассматриваются как единый объект, многие команды общего редактирования для них недоступны (Break, Fillet, Lengthen, Extend, Chamfer и др.). Поэтому в AutoCAD имеется набор команд, ориентированный исключительно на работу с мультилиниями. Основной из них является команда Ml edit.
После вызова команды М led it открывается диалоговое окно Multiline Edit Tools (Инструменты редактирования мультилиний), изображенное на рис. 8.39.
В этом окне представлены пиктограммы 12 операций, расположенные в четырех столбцах по три в каждом. При выборе той или иной пиктограммы в нижней части окна появляется подсказка с наименованием соответствующей операции. Для подтверждения своего выбора достаточно нажать кнопку ОК.
В первом столбце окна Multiline Edit Tools расположены кнопки изменения типа взаимного пересечения двух мультилиний, во втором – оформления окончания одной мультилинии на другой (форматирование стыков), в третьем – обработки углового пересечения двух мультилиний или одной мультилинии (а также операций с вершинами) и в четвертом – операций разрывов (соединения) отдельных либо всех линий в мультилинии. Далее рассмотрим эти операции в указанном порядке.
Содержание
ИЗМЕНЕНИЕ ТИПА ВЗАИМНЫХ ПЕРЕСЕЧЕНИЙ
С помощью окна Multiline Edit Tools (Инструменты редактирования мультилиний) можно задать один из трех типов пересечения мультилиний (рис. 8.40).
Для того чтобы применить один из них в качестве пересечения мультилиний, следует вызвать команду М led it и в открывшемся окне щелкнуть по пиктограмме нужного типа. Далее на вопрос Select first mline нужно щелкнуть левой кнопкой мыши по первой линии, а на вопрос Select second mline – по второй.
Примечание. При оформлении пересечений существенное значение имеет то, какая именно из линий была выбрана первой, а какая – второй. Это влияет на последовательность наложений (перекрытий) мультилиний друг на друга – верхней оказывается мультилиния, выбранная в последнюю очередь.
«Закрытый крест» – в пересечении вырезается содержимое первой выделенной мультилинии, а содержимое второй остается без изменений (рис. 8.41).
«Открытый крест» – в пересечении удаляются все линии первой выбранной мультилинии и крайние линии второй (рис. 8.42).
«Сплошной крест» – в пересечении попарно соединяются все внутренние и удаляются крайние линии второй выбранной мультилинии (рис. 8.43).
ИЗМЕНЕНИЕ ТИПА ТАВРОВЫХ ПЕРЕСЕЧЕНИЙ
С помощью окна Multiline Edit Tools (Инструменты редактирования мультилиний) можно задать один из трех типов тавровых пересечений мультилиний (рис. 8.44).
Примечание. При изменении типа таврового пересечения также большое значение имеет то, какая из линий выбирается первой и где находится точка выбора (точка выбора должна находиться с той стороны, где мультилиния будет иметь продолжение).
«Закрытый тавр» – отсекается продолжение первой выбранной мультилинии со стороны, противоположной точке выбора; в пересечении вырезается содержимое первой мультилинии, а содержимое второй остается без изменений (рис. 8.45).
«Открытый тавр» – отсекается продолжение первой выбранной мультилинии со стороны, противоположной точке выбора, а в пересечении удаляется крайняя линия второй выбранной мультилинии (рис. 8.46).
«Сплошной тавр» – отсекается продолжение первой выбранной мультилинии со стороны, противоположной точке выбора, а в пересечении попарно соединяются все внутренние и удаляется крайняя линия второй мультилинии (рис. 8.47).
ОФОРМЛЕНИЕ УГЛА
Для оформления углового пересечения конечных сегментов двух мультилиний или одной мультилинии с вычислением всех необходимых пересечений используется пиктограмма панели Multiline Edit Tools (Инструменты редактирования мультилиний) (см. рис. 8.39). Эта опция позволяет создать угол, обрезая линии, расположенные за угловым стыком (рис. 8.48) с противоположной от точки выбора стороны. При этом линии со стороны выбора соединяются попарно.
Примечание. При построении угла, образованного пересечением двух мультилиний с разным количеством составляющих, соединяются только наружные линии, а остальные продолжаются до пересечения с ближайшей линией.
ДОБАВЛЕНИЕ И УДАЛЕНИЕ ВЕРШИН
Изменение количества вершин мультилинии выполняется в основном для добавления или удаления на ней «переломов».
Для вставки новой вершины используется пиктограмма , расположенная в окне Multiline Edit Tools (см. рис. 8.39). После вызова этой опции в ответ на вопрос Select mline следует щелкнуть левой кнопки мыши в той точке мультилинии, где нужно добавить вершину. Причем независимо от того, в каком месте по ширине мультилинии была указана эта точка, новая вершина добавляется на крайней левой линии (наблюдатель расположен вдоль продольной оси мультилинии лицом к конечной точке). Пример мультилинии с двумя добавленными вершинами приведен на рис. 8.49.
Для удаления вершин используется пиктограмма , расположенная в окне Multiline Edit Tools (см. рис. 8.39). Порядок удаления вершины очень похож на порядок вставки. Отличие заключается в том, что удаляется одна вершина, расположенная ближе всего к точке выделения мультилинии.
РАЗРЫВ И СОЕДИНЕНИЕ МУЛЬТИЛИНИЙ
В последнем столбце диалогового окна Multiline Edit Tools (Инструменты редактирования мультилиний) (см. рис. 8.39) представлены пиктограммы, выполняющие разрыв и соединение мультилиний.
Для разрыва одной линии мультилинии предназначена пиктограмма . В ответ на первый вопрос этой команды Select mline следует щелкнуть левой кнопки мыши по той линии, которую нужно прервать. Причем указанная точка будет принята за первую точку разрыва. Затем в ответ на вопрос Select second point достаточно обозначить положение второй точки разрыва. В данном случае уже не нужно выбирать разрываемую линию – вторая точка выделения будет обозначать положение разрыва только по длине мультилинии. На рис. 8.50 изображена мультилиния до и после разрыва ее серединной линии.
Для разрыва всех линий мультилинии предназначена пиктограмма порядок использования которой не отличается от рассмотренного выше. В свою очередь, пиктограмма восстанавливает целостность всех линий на отмеченном промежутке мультилинии. Если хотя бы одна из двух точек разрыва не попала в указанный промежуток, целостность линии не восстанавливается.
Разделение полилинии
Если известна точка разрыва, то по идее _.break. А так, для варианта «с заранее заданной длиной» — лично я вижу только программное решение.
__________________
Моя библиотека lisp-функций
—
Обращение ко мне — на «ты».
Все, что сказано — личное мнение.
Кулик Алексей aka kpblc |
Посмотреть профиль |
Посетить домашнюю страницу Кулик Алексей aka kpblc |
Найти ещё сообщения от Кулик Алексей aka kpblc |
Регистрация: 21.02.2005
Сообщений: 3,826
Стандартными методами
1 — команда _measure
2 — команда _break
ps см. внимательно командную строку
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Сообщение от Кулик Алексей aka kpblc
Если известна точка разрыва
А если не известно то _measure её найдёт, т.е. для разрыва одной полилинии придётся использовать 3 команды _measure->_break->_erase если иногда и мало, то ручками, если часто и много, то
Сообщение от Кулик Алексей aka kpblc
программное решение.
__________________
Почему все вдруг становятся умными, когда уже не надо?
Регистрация: 23.08.2008
Сообщений: 38
а можно создать такую команду?
LISP, C# (ACAD 200[9,12,13,14])
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,810
zenon, _.measure, например, при указанной длине сегмента 650 и общей длине полилинии 6890 понарасставляет точек / блоков по всей длине. Запаришься потом удалять. Конечно, вывернуться и тут можно, кто бы спорил Но лично мне было бы лениво
(vl-load-com) (defun c:break-at-dist (/ adoc *error* ent pt dist start end len_pt_start len_pt_end break_point ) (defun *error* (msg) (vla-endundomark adoc) (princ msg) (princ) ) ;_ end of defun (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))) ) ;_ end of vla-startundomark (if (and (= (type (setq ent (vl-catch-all-apply (function (lambda () (entsel "\nВыберите полилинию или отрезок : " ) ;_ end of entsel ) ;_ end of lambda ) ;_ end of function ) ;_ end of vl-catch-all-apply ) ;_ end of setq ) ;_ end of type 'list ) ;_ end of = (wcmatch (cdr (assoc 0 (entget (car ent)))) "*LINE") (= (type (setq dist (vl-catch-all-apply (function (lambda () (initget 7) (getdist "\nВведите длину сегмента : ") ) ;_ end of lambda ) ;_ end of function ) ;_ end of vl-catch-all-apply ) ;_ end of setq ) ;_ end of type 'real ) ;_ end of = (setq pt (cadr ent) ent (car ent) pt (vlax-curve-getclosestpointto ent pt) start (vlax-curve-getstartpoint ent) end (vlax-curve-getendpoint ent) len (vlax-curve-getdistatpoint ent end) len_pt_start (vlax-curve-getdistatpoint ent pt) len_pt_end (- len (vlax-curve-getdistatpoint ent pt)) ) ;_ end of setq (__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc |
Посмотреть профиль |
Посетить домашнюю страницу Кулик Алексей aka kpblc |
Найти ещё сообщения от Кулик Алексей aka kpblc |
Вот зверский код от Fantomas'а ( ) :
(defun c:делин(/ ACTDOC ACTLAY ACTSP CURPT CURVELAY CURVELEN DDIST ABSDIS DPNT ENDLN FILEN FIRSTSUMDIS INSLN LAYSTATE notClosed MIDPT MSGTEX NEWSPH NEXTDIS NEXTPT OBJLST OLDABSDIS OLDBLOCK OLDDELTADIS OLDDIST OLDDIVD OLDMODE OLDNEXTDIS OLDOSMODE OLDPT OLDSPH PTNDIRECT READIST REVFLAG SCURVE SELBL SELFLAG STLEN STPT DELTADIS UDIST UPNT *ERROR*) (vl-load-com) (defun Error_And_Quit(/) (if sCurve (vla-Highlight sCurve :vlax-false) ); end if (if stPt (vla-Delete stPt) ); end if (if newSph (vla-Delete newSph) ); end if (if layState (foreach lay layState (vla-put-Lock(car lay)(cadr lay)) ); end foreach ); end if (if oldOsmode (setvar "OSMODE" oldOsmode) ); end if (if(and curveLen objLst AbsDis) (progn (if(= odiv:Divd "Точка-точка") (setq stLen(apply '+(mapcar '(lambda(x)(nth 4 x))objLst)) fiLen(- stLen(nth 4(last objLst))) ); end setq ); end if (princ (strcat "\n++++++++++++++++++++ Репортаж ++++++++++++++++++++\n\n" "Текущий режим разметки: " (if(= odiv:Divd "Точка-точка") "Точка-Точка" "Старт-точка")"\n" "Длинна объекта: " (rtos curveLen) "\n" "Точек размечено: "(itoa(length objLst)) "\n" (if(= odiv:Divd "Точка-точка") (progn (princ (strcat "Длинна от стартовой до последней точки: "(rtos stLen) "\n" "Длинна от первой до последней точки: "(rtos fiLen) "\n" ); end strcat ); end princ ); end progn "" ); end if "\n+++++++++++++++++ Конец репортажа ++++++++++++++++\n" ); end strcat ); end princ ); end progn (princ "\n*** Выход из ДЕЛИН ***") ); end if (vla-EndUndoMark actDoc) (princ) ); end of Error_And_Quit (defun *error* (msg) (Error_And_Quit) (princ) ); end of *error* (setq actDoc(vla-get-ActiveDocument (vlax-get-acad-object))); end setq (vla-StartUndoMark actDoc) (if(not odiv:Mode)(setq odiv:Mode "Точки")) (if(not odiv:Block)(setq odiv:Block "не определен")) (if(not odiv:Divd)(setq odiv:Divd "Точка-точка")) (initget "Точки Блоки") (setq oldMode odiv:Mode odiv:Mode (getkword (strcat "\nВыберите тип разметки [Точки/Блоки] : ")) ); end setq (setq oldOsmode(getvar "OSMODE")) (if(= 1(vla-get-ActiveSpace actDoc)) (setq actSp(vla-get-ModelSpace actDoc)) (setq actSp(vla-get-PaperSpace actDoc)) ); end if (if(null odiv:Mode)(setq odiv:Mode oldMode)) (if(= "Блоки" odiv:Mode) (progn (while(not selFlag) (setq oldBlock odiv:Block odiv:Block (getstring (strcat "\nНазвание блока или [Выбрать на экране] : ")) ); end setq (if(= "" odiv:Block)(setq odiv:Block oldBlock)) (if(or(= "В" odiv:Block)(= "в" odiv:Block)) (progn (setq odiv:Block nil) (while(not selBl) (setq selBl(entsel "\nВыберите блок ")) (if (and selBl (/=(cdr(assoc 0(entget(car selBl)))) "INSERT") ); end and (setq selBl nil) (setq odiv:Block(cdr(assoc 2(entget(car selBl))))) ); end if ); end while ); end progn ); end if (if(tblsearch "BLOCK" odiv:Block) (setq selFlag T) (princ(strcat "\nБлок с названием: " odiv:Block " не найден! ")) ); end if ); end while ); end progn ); end if (initget "Точка-точка Старт-точка") (setq oldDivd odiv:Divd odiv:Divd (getkword (strcat "\nВыберите режим разметки [Точка-точка/Старт-точка] : "))) (if(null odiv:Divd)(setq odiv:Divd oldDivd)) (while(not uPnt) (setvar "OSMODE" 571) (setq uPnt (getpoint (strcat "\nВыберите точку на отрезке или кривой "))) (if(and uPnt (setq sCurve(ssget uPnt '((-4 . ""))) ); end setq ); end and (progn (setq sCurve(vlax-ename->vla-object(ssname sCurve 0)) curveLen(vlax-curve-getDistAtParam sCurve (vlax-curve-getEndParam sCurve)) actLay(vla-get-ActiveLayer actDoc) curveLay(vla-Item (vla-get-Layers actDoc) (vla-get-Layer sCurve)) layState(list (list actLay(vla-get-Lock actLay)) (list curveLay(vla-get-Lock actLay)) ); end list ); end setq (vla-put-Lock actLay :vlax-false) (vla-put-Lock curveLay :vlax-false) (vla-Highlight sCurve :vlax-true) (if(vlax-curve-isClosed sCurve) (progn (princ "\n*** Замкнутый контур ***") (setq notClosed nil) ); end progn (progn (if (> 0.1(distance (vlax-curve-getStartPoint sCurve) (vlax-curve-getEndPoint sCurve) ); end distance ) (princ "\n*** ВНИМАНИЕ! Возможно \"зрительно замкнутый\" (незамкнутый) контур ***") ); end if (setq notClosed T) ); end progn ); end if (setq stPt(vla-AddSphere actSp (vlax-3d-point uPnt) (/(getvar "VIEWSIZE")120)) ); end setq (vla-put-Color stPt 1) (if notClosed (progn (cond ((equal uPnt(vlax-curve-getStartPoint sCurve)) (setq revFlag 0) ); end condition #1 ((equal uPnt(vlax-curve-getEndPoint sCurve)) (setq revFlag 1) ); end condition #2 (t (setq revFlag 2) ); end condition #3 ); end cond ); end progn (setq revFlag 2) ); end if ); end progn (setq uPnt nil) ); end if ); end while (if(= revFlag 2) (progn (while(not dPnt) (if (setq dPnt (getpoint (strcat "\nУкажите точку в направлении разметки "))) (progn (if (not (setq dDist(vlax-curve-getDistAtPoint sCurve dPnt))) (progn (princ "\nТочка не пренадлежит линии!") (setq dPnt nil) ); end progn ); end if ); end progn (princ "\nТочка не выбрана!") ); end if );end while ); end progn ); end if (setq uDist(vlax-curve-getDistAtPoint sCurve uPnt)) (if(and uDist dDist) (progn (if(>= uDist (/ curveLen 2)) (progn (setq midPt(vlax-curve-getPointAtDist sCurve (- uDist (/ curveLen 2))) ); end setq (if(and (>= dDist(vlax-curve-getDistAtPoint sCurve midPt)) (= dDist 0.0) (= dDist(vlax-curve-getDistAtPoint sCurve midPt)) ( : ")) ); end setq (if(= "" nextDis)(setq nextDis oldDist)) (if (vl-string-search "," nextDis) (setq nextDis(vl-string-subst "." "," nextDis)) ); end if (cond ((and (setq reaDist(distof nextDis)) (not(member nextDis '("в" "В" "о" "О"))) ); end and (progn (if(minusp reaDist) (setq reaDist(- reaDist)) ); end if (setq oldDist DeltaDis) (cond ((not notClosed) (if(= odiv:Divd "Точка-точка") (progn (if(not ptnDirect) (progn (if(>= curveLen(+ DeltaDis reaDist)) (setq DeltaDis(+ DeltaDis reaDist)) (setq DeltaDis(-(+ DeltaDis reaDist)curveLen)) ); end if ); end progn ); end if (if ptnDirect (progn (if(= curveLen(+ uDist reaDist)) (setq DeltaDis (+ uDist reaDist)) (setq DeltaDis(-(+ uDist reaDist)curveLen)) ); end if ); end progn ); end if (if ptnDirect (progn (if(= curveLen AbsDis)) (and(/= revFlag 2)(>= curveLen AbsDis)) (and notClosed(= revFlag 2)(= curveLen(+ uDist AbsDis)) ); end and (and notClosed(= revFlag 2)(> uDist dDist) ( 1(length objLst)) (progn (setq AbsDis(nth 2(cadr objLst)) DeltaDis(cadar objLst) ); end setq ); end progn (progn (setq AbsDis 0.0 DeltaDis firstSumDis ); end setq ); end progn ); end if (if newSph (progn (vla-Delete newSph) (setq newSph nil) (if(/= 1(length objLst)) (progn (setq newSph(vla-AddSphere actSp (vlax-3d-point(nth 3(cadr objLst))) (/(getvar "VIEWSIZE")120)) ); end setq (vla-put-Color newSph 3) ); end progn ); end if ); end progn ); end if (setq objLst(cdr objLst)) ); end progn (princ "\nНечего отменять!") ); end if ); end progn ); end condition #2 ((member nextDis '("в" "В")) (Error_And_Quit) ); end condition #3 (t (progn (if(< 15(strlen nextDis)) (setq msgTex (strcat(substr nextDis 1 15)". ")) (setq msgTex nextDis) ); end if (alert (strcat "ВВЕДЕНЫ ОШИБОЧНЫЕ ДАННЫЕ: " msgTex " \n\n" "ВНИМАНИЕ!\n\n" "Если вы используете массив данных скопированный через\n" "буфер обмена из MS Excel или другой программы, выйдите\n" "из программы и исправьте ошибку.\n\n" "Если ввод данных осуществляется вручную, можете продолжить\n" "работу программы.") ); end alert ); end progn ); end condition #6 ); end cond ); end while (princ) ); end of defun (princ "\n*** ДЕЛИН для запуска ***")
Обсуждение было здесь:
http://www.caduser.ru/forum/index.ph. ID=2&TID=20718