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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как с помощью Assoc вытащить то что надо?

Как с помощью Assoc вытащить то что надо?

Ответ
Поиск в этой теме
Непрочитано 31.08.2004, 15:22 #1
Как с помощью Assoc вытащить то что надо?
Lenich
 
Опер дир
 
Москва
Регистрация: 28.04.2004
Сообщений: 291

Уважаемые,

Есть такой список ((а 50) (b 20) (b 30) (b 50))
Так вот. Как вытацить именно (b 50), а не первый (b 20)?
Может есть другой способ?
Количество подсписков может менятся а нужен доступ и к 1-у и ко 2-му и к 3-ему b.
Что делать?
Просмотров: 5261
 
Непрочитано 31.08.2004, 15:46
#2
Геннадий aka PG

Машиностроение, Проектирование
 
Регистрация: 15.09.2003
Москва
Сообщений: 1,113
<phrase 1=


Если надо извлекать по порядковому номеру то подойдет NTH,
ASSOC же подразумевает первый элемент оригинальный для одного лишь данного списка.
Не понятно что нужно, вытаскивать списки по номерам или вытаскивать все b-списки по очереди.
Может тогда что-то сделать иначе при формировании списков...
__________________
С уважением,
Геннадий aka PG
Геннадий aka PG вне форума  
 
Непрочитано 31.08.2004, 15:47
#3
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,291


Может так пойдет?:
Код:
[Выделить все]
(foreach v1 (list (а 50) (b 20) (b 30) (b 50)) 
    (if (= (car v1) b)
        (cons (cadr v1) l1)
    )  
)
Получим список значений b:
(20 30 50)

Только я не понял: a и b это что?
Символы? Тогда 'a 'b
Литералы? Тогда "a" "b"
Pilot вне форума  
 
Автор темы   Непрочитано 31.08.2004, 16:00
#4
Lenich

Опер дир
 
Регистрация: 28.04.2004
Москва
Сообщений: 291


Пробовал объяснить на примере, но чтобы не вводить в заблуждение поясню:
Есть списки:
1-ый) ((-1 . <Entity name: 400f89d0>) (0 . "LEADER") (330 . <Entity name: 400ebcf8>)
(5 . "DDDA") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "7-02") (100 .
"AcDbLeader") (3 . "ESCD") (71 . 1) (72 . 0) (73 . 0) (74 . 0) (75 . 1) (40 .
2.52387) (41 . 7.853) (76 . 7) (10 118.511 230.768 0.0) (10 130.265 256.221
0.0) (10 153.037 261.115 0.0) (10 144.712 279.715 0.0) (10 162.832 279.96 0.0)
(10 172.02 284.789 0.0) (10 174.52 284.789 0.0)
(340 . <Entity name: 400f89d8>)
(211 1.0 0.0 0.0) (210 0.0 0.0 1.0) (212 0.0 0.0 0.0) (213 0.0 0.0 0.0))
2-ой) ((-1 . <Entity name: 400fbc80>) (0 . "LEADER") (330 . <Entity name: 400ebcf8>)
(5 . "D4D8") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "7-02") (100 .
"AcDbLeader") (3 . "ESCD") (71 . 1) (72 . 0) (73 . 0) (74 . 1) (75 . 1) (40 .
7.37096) (41 . 33.2384) (76 . 3) (10 190.674 212.243 0.0) (10 182.303 227.374
0.0) (10 179.803 227.374 0.0)
(340 . <Entity name: 400fbc78>) (211 1.0 0.0 0.0)
(210 0.0 0.0 1.0) (212 0.0 0.0 0.0) (213 -0.938057 4.98198 0.0))

Так вот, списки с 10-ами это координаты точек и нужно изменить последнюю 10-ку а остальные оставить.

2Геннадий aka PG
nth - не подходит т.к. 10-ок разное кол-во.

2Pilot,
Может все-таки есть стандартная команда, а то наворачивать такой цикл неохота. Но если не будет ничего другого то так и сделаю.
Lenich вне форума  
 
Непрочитано 31.08.2004, 16:21
#5
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Если элемент последний , то все просто
Код:
[Выделить все]
(assoc 10 (reverse a));где а-список
Если нет , то можно выбрать все 10-ки и покопаться в них.
Код:
[Выделить все]
(vl-remove-if-not '(lambda(x)(=(car x)10))a)
Эдуард вне форума  
 
Непрочитано 31.08.2004, 16:34
#6
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,291


Имхо ничего сложного.

(foreach v1 (list ...)
(if (= (car v1) 10)
(cons v1) l1)
)
)

Получаем список списков (координат):
((10 7 8 9)(10 5 6 7)(10 1 2 3))
Причем список этот будет отреверсированный.
Меняем ему 1-й элемент (в исходном списке он был последним), и реверсируем посредством (reverse.
Осталось из исходного списка удалить все элементы (10... и слить его с нашим новым списком.
Pilot вне форума  
 
Автор темы   Непрочитано 31.08.2004, 16:43
#7
Lenich

Опер дир
 
Регистрация: 28.04.2004
Москва
Сообщений: 291


Цитата:
Сообщение от Эдуард
Если элемент последний , то все просто
Код:
[Выделить все]
(assoc 10 (reverse a));где а-список
Вот это то что надо! 8) Спасибо! А то с циклами мудрить лениво.
Lenich вне форума  
 
Непрочитано 31.08.2004, 17:03
#8
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,291


Точно. Я что-то сразу не додумался. Вот что значит стандартность мышления
Pilot вне форума  
 
Непрочитано 01.09.2004, 10:33
#9
Random

Инженер-электрик
 
Регистрация: 06.07.2004
С-Пб
Сообщений: 1
<phrase 1=


Можно еще vl-remove-if-not или vl-remove-if попробовать.
в хелпе есть пример, в который даже я вкурил :-)
Random вне форума  
 
Непрочитано 02.09.2004, 12:06
#10
Лентяй


 
Сообщений: n/a


Если вам нужно вытаскивать координаты конца стрелки, чтобы их потом изменить, то это удобнее делать в виде ActiveX safearray.
(setq sap (vlax-variant-value (vla-get-coordinates leader_obj))); массив координат
(setq xn (- (vlax-safearray-get-u-bound sap 1) 2));номер х-координаты последней точки
(setq xn (- (vlax-safearray-get-u-bound sap 1) 1)); то же, y
(setq x0 (vlax-safearray-get-element sap xn); исходное знвчение x
(setq y0 (vlax-safearray-get-element sap yn); то же, y
;Из значений х0 и у0 вычисляем ноиые х и у
(vlax-safearray-put-element sap xn x)); замена x
(vlax-safearray-put-element sap yn y)); замена y
(vla-put-coordinates leader_obj sap); модификация объекта
 
 
Автор темы   Непрочитано 03.09.2004, 16:59
#11
Lenich

Опер дир
 
Регистрация: 28.04.2004
Москва
Сообщений: 291


Лентяй, Тоже вариант.
Но эти vlax-ы пока не знаю.
Попробовал твой код. И есть вопрос: А как поменять например привязку к тексту и т.д.?

Кстати, может кто знает где можно почитать про:

((-1 . <Entity name: 400f89d0>) (0 . "LEADER") (330 . <Entity name: 400ebcf8>) (5 . "DDDA") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "7-02") (100 . "AcDbLeader") (3 . "ESCD") (71 . 1) (72 . 0) (73 . 0) (74 . 0) (75 . 1) (40 . 2.52387) (41 . 7.853) (76 . 7) (10 118.511 230.768 0.0) (10 130.265 256.221 0.0) (10 153.037 261.115 0.0) (10 144.712 279.715 0.0) (10 162.832 279.96 0.0) (10 172.02 284.789 0.0) (10 174.52 284.789 0.0) (340 . <Entity name: 400f89d8>) (211 1.0 0.0 0.0) (210 0.0 0.0 1.0) (212 0.0 0.0 0.0) (213 0.0 0.0 0.0))

т.е. что значит "40, 41, 213, 71" эти все наименования? Про некоторые можно догадаться а про некоторые НЕТ.
Lenich вне форума  
 
Непрочитано 03.09.2004, 17:04
#12
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


"Эти наименования" - называются DXF кодами.
А прочитать о них можно в Хелпе или книгах.
Эдуард вне форума  
 
Непрочитано 04.09.2004, 02:02
#13
Лентяй


 
Сообщений: n/a


[quote]Но эти vlax-ы пока не знаю
Цитата:

Здря! До черезвычайности удобная и весьма полезная вещь.

Цитата:
А как поменять например привязку к тексту и т.д.?
В каком смысле? Привязать/отвязать от текста или изменить выравнивание, скажем, Середина на Сверху? Если первое, то:
(vla-put-Annotation leader_object nil); Отвязать
(vla-put-annotatuin leader_object text_object); Привязать

а если второе, то:
(vla-put-VerticalTextPosition leader_object 0); Середина
(vla-put-VerticalTextPosition leader_object 1); Сверху
(vla-put-VerticalTextPosition leader_object 2); Снаружи
 
 
Автор темы   Непрочитано 06.09.2004, 11:09
#14
Lenich

Опер дир
 
Регистрация: 28.04.2004
Москва
Сообщений: 291


Цитата:
Сообщение от Эдуард
"Эти наименования" - называются DXF кодами.
А прочитать о них можно в Хелпе или книгах.
Чегото в моем хелпе про них ничегошеньки нет.
Может есть ссылка на хелп (желательно русский).

Цитата:
Сообщение от Лентяй
Здря! До черезвычайности удобная и весьма полезная вещь.
Походу с хелпом меня обделили по полной программе. Про весьма удобную штуку тоже ничего не написали.
Повторюсь: Может есть ссылка на хелп (желательно русский).
Lenich вне форума  
 
Автор темы   Непрочитано 06.09.2004, 17:43
#15
Lenich

Опер дир
 
Регистрация: 28.04.2004
Москва
Сообщений: 291


Оказывается хэлпы то есть
Почему-то через Ф1 в них не сходить :?: Только если отдельно файло открыть.
Странно всё это...
Lenich вне форума  
 
Непрочитано 06.09.2004, 17:55
#16
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Отчего же не получается то...
Прям из меню Help -> Developer Help
vk вне форума  
 
Автор темы   Непрочитано 07.09.2004, 10:10
#17
Lenich

Опер дир
 
Регистрация: 28.04.2004
Москва
Сообщений: 291


Цитата:
Сообщение от vk
Отчего же не получается то...
Прям из меню Help -> Developer Help
А я все по старинке через F1...
Lenich вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как с помощью Assoc вытащить то что надо?