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

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

Выбор элементов автокад с заданнанными свойствами

Ответ
Поиск в этой теме
Непрочитано 10.06.2015, 08:16 #1
Выбор элементов автокад с заданнанными свойствами
nynokne
 
Регистрация: 17.02.2014
Сообщений: 50

Здравствуйте.
Подскажите пожалуйста, как при помощи autolisp на чертеже выбрать все элементы "LINE", лежащие в слое "Слой_1" с углом 270 градусов длиной более 5 единиц?
Я пытаюсь написать так:
Код:
[Выделить все]
 (ssget "_X" '((0 . "LINE") (8 . "Слой_1") (50. 4.71238898)))
Как длину задать не знаю, но и угол не работает, автокад выдаёт ошибку о неверно заданном списке SSGET.

Подскажите пожалуйста, где можно найти список всех кодов для всех элементов на русском языке и возможные варианты выбора через "ssget "_X" (я видел в примерах использования кода "-4", но без разъяснений, как это работает, сложно понять)? А то в справке написано просто "код 50-58 - Углы", и что это значит, не понятно (для текста код 50 работает, для дуги 50 и 51 работают, а для отрезка непонятно какой код должен быть).

Последний раз редактировалось nynokne, 10.06.2015 в 08:37. Причина: Изменение заголовка в соответствии с п.4.3 правил
Просмотров: 4194
 
Непрочитано 10.06.2015, 08:23
#2
Кулик Алексей aka kpblc
Moderator

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


1. DXF Reference в руки
2. Найди разницу между '(50. 4.71238898) и '(50 . 4.71238898)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.06.2015, 08:33
#3
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Думаю сначала нужно выбрать отрезки в слое "Слой_1" и сформировать список. А уже из этого списка фильтровать по углу и длине. Т.к. ssget не выберет отрезок по углу если он будет отличаться в 16-м знаке (или выберет?), т.е. фильтровать так или иначе нужно в каком то допуске (например, от 269.9999 до 270,0001 градусов, ну в пересчете на радианы разумеется). Ну а длина отрезка в dxf вообще не прописана, её сначала вычислить нужно будет.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 10.06.2015, 08:34
#4
Кулик Алексей aka kpblc
Moderator

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


Krieger, ну помимо прочего есть еще группа -4 и логические операторы
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.06.2015, 08:39
#5
nynokne


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


А можно поподробнее про группу -4 и логические операторы? где почитать про это можно подробно?

----- добавлено через ~10 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Найди разницу между
В самом коде точка стоит правильно:
(50 . 4.71238898038469)
но всё равно не работает...
Буду читать про
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
DXF Reference
nynokne вне форума  
 
Непрочитано 10.06.2015, 08:53
#6
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от nynokne Посмотреть сообщение
А можно поподробнее про группу -4 и логические операторы? где почитать про это можно подробно?
справка по ssget
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.06.2015, 08:54
#7
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Цитата:
Сообщение от nynokne Посмотреть сообщение
А можно поподробнее про группу -4 и логические операторы? где почитать про это можно подробно?
Посмотри в справке по ssget.
Цитата:
Krieger, ну помимо прочего есть еще группа -4 и логические операторы
А-а-а-а, да что вы мне мозги пудрите, у отрезков нет угла в DXF, его тоже нужно вычислять. У отрезка через DXF можно вытянуть только координаты точек.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 10.06.2015, 08:56
#8
Кулик Алексей aka kpblc
Moderator

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


ТЬфу, е-мое... Я еще не проснулся, похоже ))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.06.2015, 15:47
#9
nynokne


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


Почему не работает код?

Код:
[Выделить все]
 (setq SS (ssget "_X" '((0 . "LINE") (8 . "Слой_1"))))
(setq i 0)
	(while (< i (sslength SS))
		(setq lineObj (ssname SS i))
		(setq line (entget lineObj))
		(setq p1 (cdr (assoc 10 line)))
		(setq p2 (cdr (assoc 11 line)))
	
		(setq x1 (nth 0 p1))
		(setq x2 (nth 0 p2))
		(setq y1 (nth 1 p1))
		(setq y2 (nth 1 p2))
			(if (and ((= x1 x2) (> (y1 - y2) 5)))
				(command "_.copytolayer" line "" "Слой_2" "_exit")	
			)
	)
Идея у меня заключается в следующем: создать список всех отрезков слоя Слой_1
Пройтись циклом по всем этим отрезкам, вытащить из каждого коодринаты начала и конца (р1 и р2), из координат вытащить отдельно Х и У, сравнить Х начала отрезка и Х конца отрезка, при их равенстве (то есть вертикальная линия) и разнице Y-ков более 5, перетаскивать такие отрезки в слой Слой_2
nynokne вне форума  
 
Непрочитано 10.06.2015, 16:43
#10
Кулик Алексей aka kpblc
Moderator

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


nynokne, выполняй пошаговую отладку и выясняй, в каком месте у тебя ошибка.
P.S. вместо "-.copytolayer" можно выполнить элементарную замену 8 группы. Эффект будет таким же.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.06.2015, 18:46
1 | #11
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


1. У тебя разность неправильно написана
(y1 - y2), надо так -> (- y1 y2)
2. У функции and всего один аргумент
(and ((= x1 x2) (> (y1 - y2) 5))) надо так -> (and (= x1 x2) (> (- y1 y2) 5))
3. Счетчик забыл. У тебя i то не меняется, добавь это в конце:
(setq i (1+ i))
4. Функции command нужно скармливать не dxf коды, а entity name, т.е. у тебя это не переменная line, а lineObj:
(command "_.copytolayer" lineObj "" "слой_2" "_exit")
5. Команда copytolayer не сработает, если нет в чертеже слоя "слой_2", поэтому нужно предусмотреть его создание.
6. Ну и координаты нужно все таки сравнивать с некоторым допуском.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 10.06.2015, 22:15
#12
nynokne


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


Код:
[Выделить все]
 (setq SS (ssget "_X" '((0 . "LINE") (8 . "Слой_1"))))
	(setq i 0)
	    (while (< i (sslength SS))
	        (setq lineObj (ssname SS i))
	        (setq line (entget lineObj))
	        (setq p1 (cdr (assoc 10 line)))
	        (setq p2 (cdr (assoc 11 line)))
	        (setq x1 (nth 0 p1))
	        (setq x2 (nth 0 p2))
	        (setq y1 (nth 1 p1))
	        (setq y2 (nth 1 p2))
	            (if (and (= x1 x2) (> (- y1 y2) 5))
	                (command "_.copytolayer" lineObj "" "0" "_exit")  
	            )
		(setq i (+ 1 i))
	    )
все равно не работает. лисп загружается, но ничего не происходит.
nynokne вне форума  
 
Непрочитано 10.06.2015, 23:47
1 | #13
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Поправил немного код. Вызывается командой test. Посмотри про entmod. Нужно стараться избегать использование "command".

Код:
[Выделить все]
 
(defun c:test ( / )
(setq SS (ssget "_X" '((0 . "LINE") (8 . "1"))))
(setq i 0)
    (while (< i (sslength SS))
        (setq lineObj (ssname SS i))
        (setq line (entget lineObj))
        (setq p1 (cdr (assoc 10 line)))
        (setq p2 (cdr (assoc 11 line)))
        (setq x1 (nth 0 p1))
        (setq x2 (nth 0 p2))
        (setq y1 (nth 1 p1))
        (setq y2 (nth 1 p2))
            (if (and (= x1 x2) (> (abs(- y1 y2)) 5))
                (command "_.copytolayer" lineObj "" "0" "")  
            )
	(setq i (+ 1 i))
    )
	)
P.S. Про угол не дочитал. Ну это не долго переделать.

Последний раз редактировалось Mozgunov, 11.06.2015 в 00:57.
Mozgunov вне форума  
 
Автор темы   Непрочитано 15.06.2015, 17:00
#14
nynokne


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


А как при помощи lisp объединить все отрезки в определённом слое?
Я пробую так:
Код:
[Выделить все]
 (setq SS (ssget "_X" '((0 . "LINE") (8 . "Слой_1"))))
(command "_Join" SS "")
Не выходит...

Пробую так:
Код:
[Выделить все]
 (setq SS (ssget "_X" '((0 . "LINE") (8 . "Слой_1"))))
(command "_PEDIT" "_m" SS "_y" "" "_join" "" "")
Тоже эффекта нет.

Я так понимаю, команда JOIN требует обязательного выделения объектов "руками".
Но как выделить объекты программно?

----- добавлено через ~15 мин. -----
попробовал так:
Код:
[Выделить все]
 (sssetfirst nil (ssget "_X" '((0 . "LINE") (8 . "Слой_1")))))
(command "_join")
Сначала выделяю, потом объединяю. Первая строка работает без второй, но при добавлении JOIN, автокад опять требует выбрать объекты.

Последний раз редактировалось nynokne, 15.06.2015 в 17:15.
nynokne вне форума  
 
Непрочитано 15.06.2015, 17:42
#15
Кулик Алексей aka kpblc
Moderator

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


nynokne, во-первых, один вопрос = одна тема. Во-вторых, проверяй вызов команды. В-третьих, посмотри pltools (есть в Download).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.06.2015, 17:49
#16
nynokne


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
во-первых
В следующий раз учту обязательно

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Во-вторых
не понял, о чём ты...

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В-третьих
Видел, грузил, работает, но я пытаюсь лисп написать не для себя, а для большого числа коллег, поэтому сторонних приложений стараюсь избегать.
nynokne вне форума  
 
Непрочитано 15.06.2015, 19:06
#17
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Цитата:
Сообщение от nynokne Посмотреть сообщение
Пробую так:
Код:
[Выделить все]
 (setq SS (ssget "_X" '((0 . "LINE") (8 . "Слой_1"))))
(command "_PEDIT" "_m" SS "_y" "" "_join" "" "")
Чуть чуть по другому:
Код:
[Выделить все]
 (setq SS (ssget "_X" '((0 . "LINE") (8 . "0"))))
(command "_pedit" "_M" ss "" "_Y" "_J" "" "")
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Выбор элементов автокад с заданнанными свойствами



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Документация Проектировщику на Torrents DEM Разное 263 03.09.2024 12:25
Создание дополнительных параметров Visibility Set в динамических блоках. Supermax Программирование 716 22.07.2024 11:04
SCAD Неверен список координат для элементов, неверна геометрическая форма элементов alexandrei99 SCAD 5 02.06.2015 15:56
DwgRuLispLib: Функции чтения и установки свойств рисунка (_dwgprops) VVA Библиотека функций 15 14.12.2013 10:04
Расчет плоских элементов по СП 52-103-2007 Ал-й Конструкции зданий и сооружений 3 29.12.2010 09:46