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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > каким инструментом сшивать (объединять) горизонтали на планах

каким инструментом сшивать (объединять) горизонтали на планах

Ответ
Поиск в этой теме
Непрочитано 24.12.2010, 05:10 #1
каким инструментом сшивать (объединять) горизонтали на планах
АлексЮстасу
 
топограф, технолог
 
Москва
Регистрация: 24.05.2009
Сообщений: 3,072

Чем можно сшить горизонтали (обычые двумерные полилинии, отрезки на своих высотах), имеющие разрывы? Горизонтали с ненужными разрывами получаются из других программ (из того же Кредо), у исполнителей в процессе неравных сражений, при сшивании листов в цельный объект и т.п.
Особенность сшивания горизонталей в том, что нужно сшивать только горизонтали с одинаковой высотой (Elevation), одинаковыми типами линий (бывают и разные пунктирные), одинаковой толщины (бывают варианты и с весом, и с глобальной толщиной), одинакового слоя и одинакового цвета (бывают и коричневые, и черные, и зеленые). Все сшивающие (объединяющие) средства, какие я знаю, ничего из этого не учитывают.

Например, в приложенном файле разрывы достигают 4-5 метров.
И еще - таких файлов за проект бывало от 10 до сотен.

Вложения
Тип файла: dwg
DWG 2004
Сшивание_горизонталей.dwg (904.9 Кб, 1336 просмотров)

Просмотров: 5479
 
Непрочитано 24.12.2010, 08:40
#2
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Наиболее гибкий инструмент есть в ToolPac там можно сшивать линии с разным типом, цветом, высотой, весом, итд. Но, если расстояние между соседними линиями будет меньше чем с одновысотными то ToolPac сошьет соседние... Короче он берет наименьшее расстояние. Получается почти вручную. ToolPac->Polyline->Modifi->Join Segments. Еще есть PLtools там можно сшивать все линии лишь бы они были соединены и лежали на одном уровне. Так что идеального инструмента нет. Хотя без вышеперечисленных приложений я уже не знаю как и работать. Поставь - не пожалеешь. Поиск подскажет где взять. А универсальным решением мог бы стать лисп. Ну а с этим к "перцам" Вещь будет ОЧЕНЬ нужная!!!
Krovlaf вне форума  
 
Непрочитано 24.12.2010, 09:30
#3
Лиспер


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


А почему бы не использовать _.qselect вкупе с pedit?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 24.12.2010, 13:32
#4
АлексЮстасу

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


Krovlaf - ToolPac, PLtools у меня есть, с удовольствием пользуюсь, VVA - молодец!
DSTP_PLJOIN из ToolPac как и другие известные мне средства (например, Drawing Cleanup из Autocad Map), действительно сошьют что ближе - без учета высот. DSTP_PLJOIN еще и из разновысотных сшитых горизонталей сделает 3Д полилинии!

Цитата:
Сообщение от Лиспер Посмотреть сообщение
А почему бы не использовать _.qselect вкупе с pedit?
_.qselect, SelSim использовать бесполезно, т.к. число сочетаний критериев - высота, цвет, толщина, тип линий, слой - слишком большое.
pedit, PL-JOIN для данной задачи ничего не даст, т.к. они не сшивают линии с разрывами.

Последний раз редактировалось АлексЮстасу, 24.12.2010 в 13:44.
АлексЮстасу вне форума  
 
Непрочитано 24.12.2010, 13:49
#5
Лиспер


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


В качестве первого приближения:
Код:
[Выделить все]
(defun select-plines (lst / filter selset)
                     ;|
*    Выбирает полилинии с указанными критериями.
*    Параметры вызова:
	lst			список критериев выбора:
	'(("height" . <Высота расположения полилиний>)
		("color" . <Цвет>)
		("width" . <Глобальная ширина>)
		("lt" . <Тип линии>)
		("lw" . <Вес линии>); Вес линии умножать на 100.
		("layer" . <Слой>)
		("closed" . <Признак замкнутости>)
		)
|;
  (setq lst (cons '(0 . "LWPOLYLINE")
                  (mapcar
                    (function
                      (lambda (x)
                        (setq x (cons (strcase (car x) t) (cdr x)))
                        (cons
                          (cond
                            ((= (car x) "height") 38)
                            ((= (car x) "color") 62)
                            ((= (car x) "width") 43)
                            ((= (car x) "lt") 6)
                            ((= (car x) "lw") 370)
                            ((= (car x) "layer") 8)
                            ((= (car x) "closed") 70)
                            ) ;_ end of cond
                          (cdr x)
                          ) ;_ end of cons
                        ) ;_ end of lambda
                      ) ;_ end of function
                    lst
                    ) ;_ end of mapcar
                  ) ;_ end of mapcar
        ) ;_ end of setq
  (if (= (type (vl-catch-all-apply
                 (function
                   (lambda ()
                     (setq selset (ssget lst))
                     ) ;_ end of lambda
                   ) ;_ end of function
                 ) ;_ end of vl-catch-all-apply
               ) ;_ end of type
         'pickset
         ) ;_ end of =
    (sssetfirst selset selset)
    ) ;_ end of if
  ) ;_ end of defun
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 24.12.2010, 14:18
#6
АлексЮстасу

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
В качестве первого приближения:
Да, запустил (select-plines). Ничего внешне не произошло. Создаются где-то выборки? Как ими воспользоваться?

По-моему, выборки вообще можно не делать. Нужно только к возможности сшивания добавить проверку соответствия критериям одинаковой высоты, цвета, типа, толщин и пр.

Последний раз редактировалось АлексЮстасу, 24.12.2010 в 14:29.
АлексЮстасу вне форума  
 
Непрочитано 24.12.2010, 14:27
#7
Лиспер


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


(select-plines nil) -> выделяет любые полилинии
(select-plines '(("color" . 1))) -> выделяет полилинии с цветом 1 (красный)
И т.д.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 24.12.2010, 14:42
#8
VVA

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


АлексЮстасу,
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
pedit, PL-JOIN для данной задачи ничего не даст, т.к. они не сшивают линии с разрывами.
есть же опция _fuzz
Найди в pltools.ls поиском PL-JOIN, там найди строчки
Код:
[Выделить все]
(if (and (getvar "PEDITACCEPT") (= (getvar "PEDITACCEPT") 1))
    (vl-cmdf "_pedit" "_Multiple" ssnab "" "_Join" 0 "")
    (vl-cmdf "_pedit" "_Multiple" ssnab "" "_Y" "_Join" 0 ""))
  )
Красный 0 это и есть fuzz distance. Сделай себе PL-JOIN1 с нужной fuzz
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 24.12.2010, 15:07
#9
АлексЮстасу

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
И т.д.
Таких "И т.д." будет в каждом файле = число высот*число цветов*число толщин*число типов линий. Причем набор высот будет в каждом файле разным, и трудно поддающимся контролю ((

Цитата:
Сообщение от VVA Посмотреть сообщение
Найди в pltools.ls поиском PL-JOIN, там найди строчки
Спасибо. В ком. строке запроса не было - я и не знал. Через правку файла pltools.ls устанавливать допуск неудобно и опасно - легко забыть туда залезть перед запуском для проверки установленного допуска, и посшивать лишнее. А добиться этого от простых исполнителей - себе дороже. Ведь допуск устанавливается в зависимости от ситуации, т.е. меняется от файла к файлу, от проекта к проекту и т.п. ((
Да и PL-JOIN все равно сошьет "что ближе", без учет высот и пр.
АлексЮстасу вне форума  
 
Непрочитано 24.12.2010, 15:15
#10
Лиспер


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


АлексЮстасу, а я и не говорил, что решение окончательное и обжалованию не подлежит. Можно диалог, например, сделать, или несколько кнопок с разными параметрами вызова... Вариантов немеряно.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 24.12.2010, 15:26
#11
АлексЮстасу

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
АлексЮстасу, а я и не говорил, что решение окончательное и обжалованию не подлежит. Можно диалог, например, сделать, или несколько кнопок с разными параметрами вызова... Вариантов немеряно.
Это понятно, и охаиванию не подлежит
Просто путь через выборки здесь не годится. Вместо того, чтобы делать сотни выборок и запусков сшивания, нужно сделать один вызов сшивания, и в нем критерии одинаковости высот и пр.
АлексЮстасу вне форума  
 
Непрочитано 24.12.2010, 15:33
#12
VVA

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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Да и PL-JOIN все равно сошьет "что ближе", без учет высот и пр.
Нет. Pedit сшивает с учетом высоты. Проверял. Можно сделать запрос fuzz distance.
Код:
[Выделить все]
(defun C:PL-JOIN1 ( / ssnab count en *error* ss fuzz)
  (setq *error* pltool-err)
  (or *pl-activedoc* (setq *pl-activedoc* (vla-get-activedocument (vlax-get-acad-object))))
  (vla-StartUndoMark *pl-activedoc*)
  (pl:error-save-sysvar '(("PEDITACCEPT" 1)("CMDECHO" 0)))
  (setq ssnab (ssget "_I"))
  (while (not ssnab)(setq ssnab (ssget)))
  ;;;И 3d полилинии
  ;(setq ssnab(3dpljn ssnab 1e-6 "AcDb3dPolyline"))
  (setq count 0)
  (initget  5)
  (setq fuzz (getdist "\nMax величина разрыва (fuzz): "))
  (while (setq en (ssname ssnab count))
    (if (member '(100 . "AcDb3dPolyline")(entget en))
      (ssdel en ssnab)
      (setq count (1+ count))
    )
    )
  (setq en (entlast) count 0 ss (ssadd))
  (if (> (sslength ssnab) 1)
  (if (and (getvar "PEDITACCEPT") (= (getvar "PEDITACCEPT") 1))
    (vl-cmdf "_pedit" "_Multiple" ssnab "" "_Join" fuzz "")
    (vl-cmdf "_pedit" "_Multiple" ssnab "" "_Y" "_Join" fuzz ""))
  )
  (while (and (setq en (entnext en))
	      (= (cdr(assoc 0 (entget en))) "LWPOLYLINE"))
    (setq count (1+ count))(ssadd en ss)
    )
(if (> count 0)
(if (= (getvar "SysCodePage") "ANSI_1251")
    (princ (strcat "\nСоздано " (itoa count) " простых полилиний"))
    (princ (strcat "\nСreated "(itoa count)" LW polylines"))
    ))
  (if (> (sslength ss) 0)(vl-cmdf "_.SELECT" ss ""))
  (setq ssnab nil ss nil)
  (pl:error-restore-sysvar)
  (vla-EndUndoMark *pl-activedoc*)
  (princ))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 24.12.2010, 15:45
#13
АлексЮстасу

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


Цитата:
Сообщение от VVA Посмотреть сообщение
Нет. Pedit сшивает с учетом высоты. Проверял. Можно сделать запрос fuzz distance.
Отлично, что с учетом высоты!
Но пока выдала:

Command: PL-JOIN1
; error: no function definition: PL:ERROR-SAVE-SYSVAR

Добавлено:
Сделал обычную PL-JOIN с допуском 5 - увы, легко посшивала с разными высотами, толстые с тонкими и пр.

Последний раз редактировалось АлексЮстасу, 24.12.2010 в 16:32.
АлексЮстасу вне форума  
 
Непрочитано 24.12.2010, 22:23
#14
VVA

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


АлексЮстасу, У меня на чертеже из #1 не сшивала.
Давай так
1. Версия Автокада
2. Еще раз четреж с парой линий, толстые, тонкие, разные высоты
3.
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
; error: no function definition: PL:ERROR-SAVE-SYSVAR
Нужно предварительно загрузить pltools (вызови любую команду) или добавить PL-JOIN1 к pltools.lsp
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 25.12.2010, 03:53
#15
АлексЮстасу

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


Цитата:
Сообщение от VVA Посмотреть сообщение
АлексЮстасу, У меня на чертеже из #1 не сшивала.
Давай так
1. Версия Автокада
2. Еще раз четреж с парой линий, толстые, тонкие, разные высоты
3.

Нужно предварительно загрузить pltools (вызови любую команду) или добавить PL-JOIN1 к pltools.lsp
1. Autodesk Map 3D 2006, AutoCAD Civil 3D 2008.
2. Про чертеж не понял - приложенного к посту 1 не достаточно?
Нужен другой пример?
3. Скачал последнюю версию pltools. Добавил PL-JOIN1 в pltools.lsp. PlTools загружаю.
Сообщение одинаково и для 2006 и для 2008:
Command: PL-JOIN1
Unknown command "PL-JOIN1". Press F1 for help.
Если делаю PL-JOIN1 отдельным файлом, то 2008 сообщает:
Command: PL-JOIN1
ERRNO # 2: no function definition: PL:ERROR-SAVE-SYSVAR
А 2006 пишет:
Command: PL-JOIN1
ERRNO # 8: no function definition: PL:ERROR-SAVE-SYSVAR
_.redrawall

Вероятно, я где-то путаюсь?
АлексЮстасу вне форума  
 
Непрочитано 25.12.2010, 18:34
#16
VVA

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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
2. Про чертеж не понял - приложенного к посту 1 не достаточно?
Нужен другой пример?
Для примера 900 кб многовать. Из этого чертежа я выборочно сшил пару пару горизонталей - у меня сшились. Поэтому и прошу - оставь только пару полилиний, с которыми
Цитата:
PL-JOIN с допуском 5 - увы, легко посшивала с разными высотами, толстые с тонкими и пр
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Если делаю PL-JOIN1 отдельным файлом, то 2008 сообщает:
перед вызовом pl-join1 вызови любую команнду pltools (например PL-JOIN). Нажми ESC и пробуй pl-join1
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 25.12.2010, 19:41
#17
АлексЮстасу

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


Цитата:
Сообщение от VVA Посмотреть сообщение
Для примера 900 кб многовать. Из этого чертежа я выборочно сшил пару пару горизонталей - у меня сшились. Поэтому и прошу - оставь только пару полилиний, с которыми



перед вызовом pl-join1 вызови любую команнду pltools (например PL-JOIN). Нажми ESC и пробуй pl-join1
Да я уж весь запереиспробовался. На 2010 у меня на другой машине то же самое. Видимо, я какую-то глупость у себя делаю
В какое место лиспа пожно вставлять pl-join1? Можно сразу после pl-join (после его " (princ))") ?
Нужно вставить какой-то разделитель?

Я все-таки оставил достаточно большой файл (Сшивание_горизонталей_1.dwg), чтобы можно было посмотреть разные случаи. Обрезть всегда же можно.
Во втором файле (Сшивание_горизонталей_15.dwg) показано, что у меня получилось при допуске 5 - обведены окружностями разные неправильные и спорные результаты. В том числе и сшивание горизонталей с разной высотой.

Добавлено:
Когда я добавляю pl-join2_5 (pl-join с допуском 5) в текст pltools, то пишет ошибку.
А из отдельного файла эта pl-join2_5 выполняется.
Вложения
Тип файла: dwg
DWG 2004
Сшивание_горизонталей_15.dwg (334.8 Кб, 1317 просмотров)
Тип файла: dwg
DWG 2004
Сшивание_горизонталей_1.dwg (336.5 Кб, 1316 просмотров)

Последний раз редактировалось АлексЮстасу, 25.12.2010 в 20:01.
АлексЮстасу вне форума  
 
Автор темы   Непрочитано 30.01.2011, 04:00
#18
АлексЮстасу

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


Я, похоже, разобрался, почему ни PL-JOIN, ни pljoin принципиально для сшивания горизонталей не годятся. Дело в том, что допуски в них действуют для расстояний в пространстве. Т.е., если горизонтали близко друг к другу, а разность их высот тоже невелика, то расстояние между концами разновысотных горизонталей может быть меньше указанного допуска.
Т.е. для сшивания горизонталей нужна программка, которая при разности высот (Elevation) полилиний, не сшивала бы их в принципе. Какой бы допуск ни был бы установлен.

Приложил специальный простой пример, в котором при допуске больше или равном 2 (больше всех разрывов в пространстве) нужно, чтобы сшивалась только верхняя пара линий с Elevation=300.5, пара с Elevation=200 и нижняя пара линий.
Вложения
Тип файла: dwg
DWG 2004
Сшивание_допуск_2м.dwg (199.1 Кб, 1311 просмотров)
АлексЮстасу вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > каким инструментом сшивать (объединять) горизонтали на планах