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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как извлечь координаты начала и конца из описания Lisp'ом?

Как извлечь координаты начала и конца из описания Lisp'ом?

Ответ
Поиск в этой теме
Непрочитано 19.02.2016, 17:42 #1
Как извлечь координаты начала и конца из описания Lisp'ом?
onix
 
Регистрация: 20.05.2011
Сообщений: 38

Здравствуйте!
Есть дамп маджикадовского примитива кабель
Код:
[Выделить все]
 (
    (-1 . <Имя объекта: 7ffffb26cd0>)
    (0 . "MAGIELECTRICALCABLE")
    (330 . <Имя объекта: 7ffffb039f0>)
    (5 . "28975")
    (100 . "AcDbEntity")
    (67 . 0)
    (410 . "Model")
    (8 . "ПР_ЭС_РО_КАБ_")
    (62 . 5)
    (6 . "Continuous")
    (100 . "MAGIELECTRICALENTITY")
    (70 . 801)
    (71 . 0)
    (72 . 3)
    (40 . 1.0)
    (41 . 1.0)
    (73 . 0)
    (74 . 0)
    (75 . 0)
    (76 . 0)
    (70 . 2)
    (70 . 2001)
    (70 . 5)
    (70 . 2002)
    (70 . -3)
    (70 . 10)
    (70 . 2001)
    (70 . 1001)
    (70 . 1011)
    (280 . 0)
    (70 . 6046)
    (300 . "1tkrFiq5f99Be$4n6901bH")
    (70 . 2015)
    (70 . 1)
    (70 . 3001)
    (90 . 1)
    (70 . 3002)
    (90 . 2)
    (70 . 3004)
    (90 . 228)
    (70 . 6053)
    (300 . "1088000050")
    (70 . 6054)
    (300 . "1088000050")
    (70 . 2010)
    (70 . 3)
    (100 . "MAGIELECTRICALPOLYLINE")
    (70 . 0)
    (40 . 10.0)
    (41 . 0.0)
    (42 . 0.0)
    (43 . 0.0)
    (44 . 0.0)
    (45 . 0.0)
    (46 . 0.0)
    (71 . 6)
    (10 245798.0 1988.15 2400.0)
    (10 246395.0 1988.15 2400.0)
    (10 246395.0 8183.57 2400.0)
    (10 249310.0 8183.57 2400.0)
    (10 249310.0 9142.48 2400.0)
    (10 248798.0 9137.57 2400.0)
    (72 . 0)
    (74 . 0)
  )
как отсюда Lisp'ом извлечь координаты начала и конца кабеля.
Я так понимаю что они здесь
(10 245798.0 1988.15 2400.0)
(10 246395.0 1988.15 2400.0)
(10 246395.0 8183.57 2400.0)
(10 249310.0 8183.57 2400.0)
(10 249310.0 9142.48 2400.0)
(10 248798.0 9137.57 2400.0)
превое и последнее. Но через assoc извлекается только первое вхождение. Как быть?

Последний раз редактировалось Кулик Алексей aka kpblc, 19.02.2016 в 19:50.
Просмотров: 2156
 
Непрочитано 19.02.2016, 19:35
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Код:
[Выделить все]
 (defun mgc-elcable-points (cable) 
  (mapcar 'cdr
          (vl-remove-if-not (function (lambda (x) (= 10 (car x))))
                            (entget cable) ) ) )

(setq pts (mgc-elcable-points (entsel)))
(list (car l) (last l))

Последний раз редактировалось gomer, 19.02.2016 в 20:02. Причина: Ошибка в коде
gomer вне форума  
 
Непрочитано 19.02.2016, 19:51
#3
Кулик Алексей aka kpblc
Moderator

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


gomer, а key чему равен?
P.S. Ну и названьице у темы... Начало чего? Конец чего? Неужели трудно дать нормальный заголовок?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.02.2016, 20:03
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
а key чему равен?
Ты прав, key = 10
gomer вне форума  
 
Автор темы   Непрочитано 20.02.2016, 09:46
#5
onix


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


Доброе утро!
Спасибо за ответы, постараюсь писать более понятнее)

Цитата:
Сообщение от gomer Посмотреть сообщение
Код:
[Выделить все]
 (defun mgc-elcable-points (cable) 
  (mapcar 'cdr
          (vl-remove-if-not (function (lambda (x) (= 10 (car x))))
                            (entget cable) ) ) )

(setq pts (mgc-elcable-points (entsel)))
(list (car l) (last l))
Запускаю, выбираю примитив - выдаёт ошибку:

Выберите объект: неверный тип аргумента: lentityp (<Имя объекта: 7ffffb1cd80> (37433.9 1081.47 0.0))


Дамп примитива
Код:
[Выделить все]
 
(
    (-1 . <Имя объекта: 7ffffb1cd80>)
    (0 . "MAGIELECTRICALCABLE")
    (330 . <Имя объекта: 7ffffb039f0>)
    (5 . "27198")
    (100 . "AcDbEntity")
    (67 . 0)
    (410 . "Model")
    (8 . "ПР_ЭС_АО_КАБ_")
    (62 . 1)
    (6 . "штриховая C")
    (100 . "MAGIELECTRICALENTITY")
    (70 . 801)
    (71 . 0)
    (72 . 3)
    (40 . 1.0)
    (41 . 1.0)
    (73 . 0)
    (74 . 0)
    (75 . 0)
    (76 . 0)
    (70 . 2)
    (70 . 2001)
    (70 . 1)
    (70 . 2002)
    (70 . -3)
    (70 . 10)
    (70 . 2001)
    (70 . 1001)
    (70 . 1011)
    (280 . 0)
    (70 . 6046)
    (300 . "3sTZvwn5fBeOpSaaYi9ACo")
    (70 . 2015)
    (70 . 1)
    (70 . 3001)
    (90 . 1)
    (70 . 3002)
    (90 . 3)
    (70 . 3004)
    (90 . 14)
    (70 . 6053)
    (300 . "1088000050")
    (70 . 6054)
    (300 . "1088000050")
    (70 . 2010)
    (70 . 3)
    (100 . "MAGIELECTRICALPOLYLINE")
    (70 . 0)
    (40 . 10.0)
    (41 . 0.0)
    (42 . 0.0)
    (43 . 0.0)
    (44 . 0.0)
    (45 . 0.0)
    (46 . 0.0)
    (71 . 6)
    (10 43626.9 1424.7 2400.0)
    (10 43471.3 1424.7 2400.0)
    (10 43471.3 1072.69 2400.0)
    (10 35592.9 1072.69 2400.0)
    (10 35592.9 1439.31 2400.0)
    (10 35016.9 1432.36 2400.0)
    (72 . 0)
    (74 . 0)
  )
И ещё хотел спросить ключ 70 на что указывает в описании?
Мне надо выбрать ещё точечные пары, которые следуют за (70 . 6053) и (70 . 6054), т.е. выбрать (300 . "1088000050") и (300 . "1088000050")
onix вне форума  
 
Непрочитано 20.02.2016, 09:49
1 | #6
Кулик Алексей aka kpblc
Moderator

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


Замени
Код:
[Выделить все]
(setq pts (mgc-elcable-points (entsel)))
на
Код:
[Выделить все]
(setq pts (mgc-elcable-points (car(entsel))))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 20.02.2016, 10:03
#7
onix


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Замени
Код:
[Выделить все]
(setq pts (mgc-elcable-points (entsel)))
на
Код:
[Выделить все]
(setq pts (mgc-elcable-points (car(entsel))))
Заменил
Код:
[Выделить все]
  (defun mgc-elcable-points (cable) 
  (mapcar 'cdr
          (vl-remove-if-not (function (lambda (x) (= 10 (car x))))
                            (entget cable) ) ) )

(setq pts (mgc-elcable-points (car(entsel))))
(setq startendpoint (list (car l) (last l)))
(princ startendpoint)
Запускаю, выдаёт
Выберите объект: (nil nil)

Дамп примитива выше в сообщении.
onix вне форума  
 
Непрочитано 20.02.2016, 10:19
1 | #8
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Так попробуй, что-то старею я...
Код:
[Выделить все]
 (defun mgc-elcable-points (cable)
  (mapcar 'cdr
          (vl-remove-if-not (function (lambda (x) (= 10 (car x))))
                            (entget cable) ) ) )

(setq pts (mgc-elcable-points (car (entsel "Укажите кабель: "))))

(setq startendpoint (list (car pts) (last pts)))

(princ startendpoint)
gomer вне форума  
 
Автор темы   Непрочитано 20.02.2016, 10:27
#9
onix


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


Спасибо, так работает!

Цитата:
Сообщение от gomer Посмотреть сообщение
Так попробуй, что-то старею я...
Код:
[Выделить все]
 (defun mgc-elcable-points (cable)
  (mapcar 'cdr
          (vl-remove-if-not (function (lambda (x) (= 10 (car x))))
                            (entget cable) ) ) )

(setq pts (mgc-elcable-points (car (entsel "Укажите кабель: "))))

(setq startendpoint (list (car pts) (last pts)))

(princ startendpoint)
А почему с entsel без "Укажите кабель: " не работает???

----- добавлено через ~1 мин. -----
А, всё понял, там дело в этом было (setq startendpoint (list (car pts) (last pts)))
переменная
недоглядел)

----- добавлено через 54 сек. -----
И ещё хотел спросить ключ 70 на что указывает в описании?
Мне надо выбрать ещё точечные пары, которые следуют за (70 . 6053) и (70 . 6054), т.е. выбрать (300 . "1088000050") и (300 . "1088000050")

Дамп примитива
Код:
[Выделить все]
 
(
    (-1 . <Имя объекта: 7ffffb1cd80>)
    (0 . "MAGIELECTRICALCABLE")
    (330 . <Имя объекта: 7ffffb039f0>)
    (5 . "27198")
    (100 . "AcDbEntity")
    (67 . 0)
    (410 . "Model")
    (8 . "ПР_ЭС_АО_КАБ_")
    (62 . 1)
    (6 . "штриховая C")
    (100 . "MAGIELECTRICALENTITY")
    (70 . 801)
    (71 . 0)
    (72 . 3)
    (40 . 1.0)
    (41 . 1.0)
    (73 . 0)
    (74 . 0)
    (75 . 0)
    (76 . 0)
    (70 . 2)
    (70 . 2001)
    (70 . 1)
    (70 . 2002)
    (70 . -3)
    (70 . 10)
    (70 . 2001)
    (70 . 1001)
    (70 . 1011)
    (280 . 0)
    (70 . 6046)
    (300 . "3sTZvwn5fBeOpSaaYi9ACo")
    (70 . 2015)
    (70 . 1)
    (70 . 3001)
    (90 . 1)
    (70 . 3002)
    (90 . 3)
    (70 . 3004)
    (90 . 14)
    (70 . 6053)
    (300 . "1088000050")
    (70 . 6054)
    (300 . "1088000050")
    (70 . 2010)
    (70 . 3)
    (100 . "MAGIELECTRICALPOLYLINE")
    (70 . 0)
    (40 . 10.0)
    (41 . 0.0)
    (42 . 0.0)
    (43 . 0.0)
    (44 . 0.0)
    (45 . 0.0)
    (46 . 0.0)
    (71 . 6)
    (10 43626.9 1424.7 2400.0)
    (10 43471.3 1424.7 2400.0)
    (10 43471.3 1072.69 2400.0)
    (10 35592.9 1072.69 2400.0)
    (10 35592.9 1439.31 2400.0)
    (10 35016.9 1432.36 2400.0)
    (72 . 0)
    (74 . 0)
  )
----- добавлено через ~6 ч. -----
А не подскжите ещё как тут быть: у меня есть дамп примитива и есть координата точки. Как мне узнать, что точка расположена внутри границ примитива MAGIELECTRICALSYMBOL?
Код:
[Выделить все]
 (
    (-1 . <Имя объекта: 7ffffb148f0>)
    (0 . "MAGIELECTRICALDEVICE")
    (330 . <Имя объекта: 7ffffb039f0>)
    (5 . "25F17")
    (100 . "AcDbEntity")
    (67 . 0)
    (410 . "Model")
    (8 . "ПР_ЭС_СРО_3_СВЕТ_")
    (62 . 3)
    (100 . "MAGIELECTRICALENTITY")
    (70 . 801)
    (71 . 0)
    (72 . 4)
    (40 . 1.0)
    (41 . 1.0)
    (73 . 0)
    (74 . 0)
    (75 . 0)
    (76 . 0)
    (70 . 2)
    (70 . 2001)
    (70 . 3)
    (70 . 2002)
    (70 . -3)
    (70 . 15)
    (70 . 2001)
    (70 . 1002)
    (70 . 1011)
    (280 . 0)
    (70 . 6046)
    (300 . "00mViEPsHCIfyFFJvCy$gS")
    (70 . 2015)
    (70 . 1)
    (70 . 3001)
    (90 . 1)
    (70 . 3002)
    (90 . 21)
    (70 . 3003)
    (90 . 110)
    (70 . 3004)
    (90 . 54)
    (70 . 4001)
    (40 . 600.0)
    (70 . 4002)
    (40 . 600.0)
    (70 . 4003)
    (40 . 88.0)
    (70 . 6005)
    (300 . "Рћ-2.4.1-10")
    (70 . 6006)
    (300 . "ЩО-2.4.1")
    (70 . 11002)
    (330 . <Имя объекта: 7ffffb1b760>)
    (70 . 1006)
    (280 . 1)
    (100 . "MAGIELECTRICALSYMBOL")
    (10 82448.0 15436.4 2400.0)
    (210 6.12323e-017 1.0 0.0)
    (211 0.0 0.0 1.0)
    (340 . <Имя объекта: 7ffffb03910>)
    (340 . <Имя объекта: 7ffffbdd020>)
    (70 . 256)
    (71 . 0)
    (72 . 2)
    (212 1.0 0.0 0.0)
    (73 . 0)
    (40 . 0.0)
    (340 . <Имя объекта: 0>)
    (340 . <Имя объекта: 7ffffbe5990>)
    (340 . <Имя объекта: 7ffffbe59a0>)
    (340 . <Имя объекта: 0>)
    (74 . 0)
    (70 . 0)
    (70 . 0)
    (70 . 0)
  )

Последний раз редактировалось onix, 20.02.2016 в 16:39.
onix вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как извлечь координаты начала и конца из описания Lisp'ом?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Линии электрических соединений Shoorup Программирование 23 07.02.2015 15:13
Какое расстояние от начала или конца лестницы до двери должно быть? Aleksoid Архитектура 6 21.01.2012 14:43
Как определить координаты начала и конца отрезка, координаты центра окружности? voverrr Программирование 6 20.01.2011 20:10
ACAD: Где хранятся координаты точек начала и конца объекта IAcadDimRotated Main Urod Программирование 1 25.02.2009 17:47