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

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

кнопка для вывода координаты Z заданной точки.

Ответ
Поиск в этой теме
Непрочитано 18.10.2010, 15:58
кнопка для вывода координаты Z заданной точки.
alexdub
 
инженер-конструктор
 
Регистрация: 20.05.2010
Сообщений: 20

Добрый день! задача следующая: файле (автокад) есть около 5 тыс. точек. у каждой свое значение координаты Z. нужна команда, которая будет при нажатии на точку вставлять рядом текст с этой координатой. сами понимаете, что смотреть координату в свойствах (или через inquiry), а потом печатать текстом слишком уж долго
посоветуйте, пожалуйста, литературу по написанию макросов (в детстве хорошо дружил с информатикой , думаю разберусь) а может у кого-то была похожая задача и подскажете советом, спасибо!

Вложения
Тип файла: dwg
DWG 2004
dots.dwg (80.4 Кб, 1663 просмотров)


Последний раз редактировалось alexdub, 18.10.2010 в 17:00.
Просмотров: 9078
 
Непрочитано 19.10.2010, 16:19
#21
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Offtop:
Дима_, вопрос к Вам не по теме топика, а по искусству программирования, поэтому и оффтопом.
Ваш код, пост #13
Строка (cons 10 ((lambda (pt) (list (- (car pt) 200 ) (+ 50 (cadr pt)))) pt))
зачем здесь использовать lambda, а не просто (list (- (car pt) 200 ) (+ 50 (cadr pt))), ведь выше ((lambda (pt) (entmakex ...)) (cdr (assoc 10 (entget ent)))) Вы уже локализовали переменную pt?
Или я чего-то непонимаю? Прошу ответить, этот вопрос не ирония

Во сказанул: вопрос не по теме топика - масло масленное
__________________
cadtools

Последний раз редактировалось TararykovDG, 19.10.2010 в 16:30.
TararykovDG вне форума  
 
Непрочитано 19.10.2010, 16:39
#22
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Здесь лишнее, заметил когда выложил и испралять не стал - вначале писал чуть по другому - pt использовалось 2 раза только в той строке, а потом "вытащил" в главную - без нареканий со своей стороны можно заменить на "просто" (list (- (car pt) 200 ) (+ 50 (cadr pt))).
p.s. Тебе зачет за внимательность.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.10.2010, 16:44
#23
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Дима_, спасибо
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 19.10.2010, 20:02
#24
gomer

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
НЕ ДОЛЖНО БЫТЬ В ЛИСПЕ ПЕРЕМЕННЫХ
С чего вы взяли? используя лямбду вы создаете "переменную" Это во первых... Во вторых тогда уж так...
Код:
[Выделить все]
(defun c:test ( / ss doc *error*)
  (defun *error* (msg) princ)
  (prompt "\nВыберите точки: ")
  (cond ((setq ss (ssget '((0 . "POINT"))))
    (vla-startundomark (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))))
    (mapcar
      '(lambda (x / z)
         (entmakex
           (list
             (cons 0 "TEXT")
             (cons 10 (list (- (car x) 200 ) (+ 50 (cadr x))))
             (cons 8 "Отклонения")
             (cons 40 300)
             (cons 1 (strcat (if (<= 0 (setq z (fix (last x)))) "+" "")(itoa z)))
           )
         )
      )
      (mapcar '(lambda (x) (cdr (assoc 10 (entget x))))
        (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
      )
    )
    (vla-endundomark doc)
    )
    (T (alert "Необходимо выбрать хотя бы одну точку"))
  )
  (princ)
)

Последний раз редактировалось gomer, 19.10.2010 в 20:20.
gomer вне форума  
 
Непрочитано 19.10.2010, 21:12
#25
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от gomer Посмотреть сообщение
С чего вы взяли? используя лямбду вы создаете "переменную
В языках подразумевающих постоянное использование переменных (бейсик, паскаль) их тип всегда задается явно, либо определяется через имя - для того, чтоб при их изменении не "плыла память", под них сразу отводится ячейки памяти соответствующего размера (кроме строк чуть по другому - схоже с лиспом, но не совсем) - лисп т.н. функциональный язык - то есть состоящий из функций - которые имеют входные и выходные аргументы - подобно математическим (в отличие от других языков где, как правило, функция еще обращается к десятку-другому переменных). В лиспе переменные (те самые которые задаются через / ) аттавизм наподобие goto в паскале. Используя лямбду я, как раз, никаких переменных не создаю поэтому и рекомендую их использовать (лямбды). Если Вы в своей программе используете setq значит "заведомо" теряете функциональность - Вам нужно постоянно отслеживать что хранится в Ваших переменных и можно, либо, нет вызвать какую либо функцию - это давно уже тупиковый путь и никакая большая программа так не работает - в ООП используются "объекты" с "закрытыми" переменными (даже в ассемблере есть локализация и уже по факту полностью отошли от задания аргументов через "общие" регистры). Лисп (при правильном написании) тем и силен, что любую функцию можно вызвать в любой момент времени (рекурсивно?) - я за все время писания на лиспе НИ РАЗУ не использовал отладчик (на ассемблере (а на нем, в свое время, я тоже не мало поработал) я можно сказать только в нем и писал). Еще раз повторю - не должно в лиспе быть переменных (есть ряд исключений связанных с "несовершенством" автолиспа), оно-же как и массивов (был бы автолисп нормально рекурсивным я б с удовольствием сюда еще и циклы добавил - но т.к. хвотовой рекурсии в автолиспе нет - приходиться пользоваться).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.10.2010, 21:50
#26
gomer

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


Дима_, вот еще вариант... Сравните размер, функциональность и попробуйте избавиться от переменной doc
Код:
[Выделить все]
(defun c:test ( / ss doc z *error*)
  (defun *error* (msg) princ)
  (prompt "\nВыберите точки: ")
  (cond ((setq ss (ssget '((0 . "POINT"))))
      (vla-startundomark (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))))
      (foreach pt (mapcar '(lambda (x) (cdr (assoc 10 (entget x))))
                  (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
        (entmakex
          (list
            (cons 0 "TEXT")
            (cons 10 (list (- (car pt) 200 ) (+ 50 (cadr pt))))
            (cons 8 "Отклонения")
            (cons 40 300)
            (cons 1 (strcat (if (<= 0 (setq z (fix (last pt)))) "+" "")(itoa z)))
          )
        )
      )
      (vla-endundomark doc)
    )
    (T (alert "Необходимо выбрать хотя бы одну точку"))
  )
  (princ)
)
ps #24 думаю будет быстрее этого кода и вашего

Последний раз редактировалось gomer, 19.10.2010 в 21:55.
gomer вне форума  
 
Непрочитано 19.10.2010, 22:19
#27
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


1. сравнил у меня 18 строк у Вас 23 (да у Вас добавленна "мощная строка" (defun *error* (msg) princ) - то есть если произойдет какая-либо ошибка мы даже не узнаем какая).
2.
Код:
[Выделить все]
((lambda (doc)
(vla-startundomark doc)
...
(vla-endundomark doc))
(vla-get-ActiveDocument (vlax-get-acad-object)))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.10.2010, 22:38
#28
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Осторожно! Пост №25 -бред. От первого до последнего слова.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 19.10.2010, 22:40
#29
gomer

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


Дима, По нажатии эскейп в кс выпадает *Отмена*, чем не индикатор... + у меня еще и алерт чтоб узер не заснул...
По поводу 2. Согласен с вами.. в этом есть даже некая эстетика...
Однако же большое количество лямбд может запутать любого программера, даже автора... так как ломает привычную "узерскую" логику... К тому же при таком подходе в хвосте скапливается большое кол-во "мусора"
зы Pastor, аргументируйте
gomer вне форума  
 
Непрочитано 19.10.2010, 22:44
#30
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Однако же большое количество лямбд может запутать любого программера, даже автора...
Если ты не спользуешь setq то можешь не париться по поводу что у тебя "попадется" внутри определения какакя-либо функция (под-под-под функция) которая "исправит" твою "одноименную" переменную doc и тебе глубоко паралельно в какой последовтельности будут вызываться функции - т.к. они "замкнуты" и никак не зависят от "общих" переменных.
Пастор бред - это то что Вам понять не под силу?
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 19.10.2010 в 22:57.
Дима_ вне форума  
 
Непрочитано 19.10.2010, 22:52
#31
Кулик Алексей aka kpblc
Moderator

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


Дима_, касательно #25...
Представь себе ситуевину: есть fun1, которая вызывает fun2, передавая ей в качестве параметра указатель на COM-сервер (создается в fun1), указатель на графический примитив, обрабатываемый этим СОМ-сервером, ну и до кучи свойство примитива и значение этого свойства. Все должно работать а) быстро; б) вся занятая память должна быть очищена после выхода из fun1. Одного vlax-release-object недостаточно.
Задача: реализовать без применения локальных или глобальных переменных.
Скажу честно: я на такое не способен
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.10.2010, 23:05
#32
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


А в чем сложность? (apply (lambda <fun2>) (lambda (com) (list com (vlax-get-property com) ...) ) (vlax-create ...)) (gc)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.10.2010, 23:31
#33
Кулик Алексей aka kpblc
Moderator

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


Дима_, а теперь объясни разницу между переменной и параметром вызова. Особенно когда эта переменная локальная в одной функции и является параметром вызова второй
P.S. Спор, если честно, мне кажется бессмысленным - все равно каждый прав и каждый останется при своем мнении
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.10.2010, 23:41
#34
gomer

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


как быстро будет такое работать?
Код:
[Выделить все]
(mapcar
 '(lambda (x)
   ((lambda (com)
    (some_func com x)
    )
    (vlax-create-object "SomeSlow.Com")
   )
  )
  big_big_list
)
зы от внешней переменной мне так и не удалось избавиться...
gomer вне форума  
 
Непрочитано 19.10.2010, 23:45
#35
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


разница в том, что если принципально не подходить к аргументам как к переменным (проще говоря не использовать присваивания), то проблемы с порядком вызова процедур становяться глубоко паралельны - программа не использует ничего кроме входных параметров - а "общается" с другими ТОЛЬКО через выход - не нужно отслеживать "что сейчас в этой переменной", "инициализировал ли я ее и пр" - видим функцию (не важно кем написанную) видим ее входные параметры, а дальше что в ней творится - нам глубоко паралельно - если она протестированна со всеми вариантами входных параметров (имеется в виду диапазон) - то она 100% всегда будет работать - кто-бы и как ее не вызвал. А вот если она в пятой подпрограмме какой-либо "флажок" опрашивает (либо, не дай бог, устанавливает) - искать это можно крайне долго.
п.с. Пусть кто как хочет, так и пишет - полностью согласен.

то Gomer такое будет работать долго в отличие от
Код:
[Выделить все]
((lambda (com)
 (mapcar '(lambda (x)
          (some_func com x))
  big_big_list))
(vlax-create-object "SomeSlow.Com"))
п.п.с по хорошему big_big_list надо тоже в аргумент записать
п.п.п.с твой намек верный - в более "серьезных" версиях лиспа предыдущий бы код работал, но вынеси mapcar в отдельную функцию - закончился бы ошибкой т.к. com там определяется только внутри лямбды и что-бы его увидела другая функция - нужно его явно передать (я поначалу на этом не мало копий наломал - пока не понял что четкое разграничение пространства видимости - это "великое благо" и писать так гораздо удобней и лаконичней (мне по крайней мере)).
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 20.10.2010 в 00:43.
Дима_ вне форума  
 
Непрочитано 20.10.2010, 17:25
#36
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Очень странный спор у вас возник...
С одной стороны, без setq, получается код свободный от переменной, хотя с другой стороны, переменная создается внутри безымянной функции и удаляется после завершения.

По сути, создание и загрузка дополнительной функции, может занять больше времени, с другой, можно для таких целей сделать постоянную функцию, которая будет выполнять код только при ненулевом аргументе.

Для оценки двух подходов, стоит выбрать точку зрения и вектор, который считать верным...
- выбирайте:
1. простой и лаконичный код
2. простая и удобная поддержка кода с возможностью его многократно использовать и занести в библиотеку
3. быстрый код
4. крутой код - сложный в понимании основной массой программистов

Мое мнение:
1. лучший код в этой теме - первый работающий код, именно он позволил решить задачу просящему помощи и это не зависит от качества, скорости или других свойств программы!
2. Для форума, я обычно использую вариант, в котором меньше всего букв и это не зависит от setq или других функций и подходов.
3. Если уж блистать сутью лиспа, то стоит использовать mapcar и рекурсии, а так же бить код на подпрограммы.

Ps. ну вот, теперь огребу ото всех разом...
pps. я бы написал все совсем по другому...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/

Последний раз редактировалось Елпанов Евгений, 20.10.2010 в 17:28. Причина: add >> pps
Елпанов Евгений вне форума  
 
Непрочитано 20.10.2010, 19:12
#37
gomer

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


А что тут думать, логика простая: для всех точек, выбранных юзером, рисуем тексты, содержащие координаты точек соответственно...
Все остальное исправление граблей, на которые будет натыкаться юзер, а не программер...
gomer вне форума  
 
Непрочитано 21.10.2010, 10:15
#38
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Offtop: Спрашивают программистов сколько кода надо написать чтобы программа вывела на экран сообщение "Hellow World!"
Программист Майкрософт написал 5 страниц кода.
Студент программист написал 10 строчек.
Хакер написал 1 слово.
Victor вне форума  
 
Непрочитано 02.11.2010, 11:11
#39
bem_ua


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


Ребята, вы извините меня, я тут новичек и меня тоже интересует возможность использования скрипта, который бы выполнял за меня определенную работу - готов оплатить вебмани за такой скриптик. Тот скрипт, что Выложил Дима - супер, только одно но - он выставляет округленное значение в меньшую сторону - для меня достаточно критично, хотя бы округлял по математике и еще чтоб было больше возможностей настройки. И еще одно надо чтоб на место существующей точки ставил еще одну точку - это мне надо для того, чтоб наглядно было видно место, отклонение. Ситуация заключается в том, что при съемке тахеометром фасада здания я получаю точки - но вижу эти точки нормально только в режиме сверху, если же я переключаю режим камеры - спереди - я вижу свой фасад как положено, потом я поворачиваю таким образом, чтоб в режиме сверху я его видел как в режиме спереди - грубо говоря в 2д его кладу, но при всех этих режимах я вижу не точки, а их боковое сечение, т.е. если назначит формат отображения точки перекрестье в кружке - я буду на него смотреть сбоку - т.е. буду видеть просто линию для того, чтоб нормально отображить точку - мне надо в на существующую точку с боковым сечение поставить еще одну точку, но уже при камере сверху - и тогда она будет отображаться нормально (пример смотрите на приложенных фотках). Желательно получить скрипт такого типа, чтоб сам ставил точку на место точки, и выносил значения - чтоб можно было редактировать в скрипте место куда он будет выносить это значение и естественно шрифт, так же желательно иметь настройки сколько знаков после запятой показывать и естественно, как существующий скрипт - надо чтоб если значение по Z у меня меньше нуля - то естественно, чтоб отображалось значение с минусом, а если больше - с плюсом.

(Описание приложения - фотка 1 - это то как я вижу точки смотря на них сверху до изменения их формата отображения; фотка-2 - это после того, как я поменял формат отображения точек на тот, какой мне нужен; фотка 3 - это конечный вид после того, как ставлю на каждую точку новую точку, чтоб я ее нормально мог видеть и ставлю рядом с ней ее значение по Z)
Миниатюры
Нажмите на изображение для увеличения
Название: вид точек(до изменения формата отображения).jpg
Просмотров: 44
Размер:	59.0 Кб
ID:	47542  Нажмите на изображение для увеличения
Название: вид точек после изменениея вида отображения.jpg
Просмотров: 48
Размер:	68.9 Кб
ID:	47543  Нажмите на изображение для увеличения
Название: конечный вид.jpg
Просмотров: 53
Размер:	64.0 Кб
ID:	47544  

Последний раз редактировалось bem_ua, 02.11.2010 в 11:24. Причина: вставка изображения
bem_ua вне форума  
 
Непрочитано 02.11.2010, 14:22
1 | #40
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Вобщем,прочитав 4 раза "запрос" я выяснил следующие:
1. нужно чтоб округлялось согласно правилам математики;
2. чтоб прорисовывалась дополнительная точка в "округленном" месте и она была видна в двух проекциях (с переди и с верху)
3. Была возможность регулировки шрифта.
Код:
[Выделить все]
(vl-load-com)
(defun c:set-test-param ()
  (setq list-test-parametr
        (mapcar '(lambda (mes value)
                   ((lambda (x) (if x x value)) (getreal (strcat "\n" mes " <"  (rtos value) "> "))))
                '("Введите высоту шрифта" "Отступ метки по X" "Отступ метки по Y")
                (if list-test-parametr list-test-parametr '(2.5 2 0.5))))
  (princ))
(defun c:test()
  ((lambda (ss)
     (if ss (progn
             (vla-startundomark (vlax-get-property (vlax-get-acad-object) 'ActiveDocument))
             (mapcar '(lambda (ent)
                        ((lambda (pt)
                           (mapcar '(lambda (vector lay)
                                      (entmakex (list
                                                 (cons 0 "text")
                                                 (cons 10 ((lambda (pt) (trans (list (- (car pt) (if list-test-parametr (cadr list-test-parametr) 2))
                                                                                     (+ (cadr pt) (if list-test-parametr (caddr list-test-parametr) 0.5))
                                                                                     (last pt)) 0 vector)) pt))
                                                 (cons 8 lay)
                                                 (cons 40 (if list-test-parametr (car list-test-parametr) 2.5))
                                                 (cons 1 ((lambda (z) (strcat (if (> z -1) "+" "")(itoa z) )) (last pt)))
                                                 (cons 210 vector)))
                                      (entmakex (list (cons 0 "point")
                                                      (cons 10 pt)
                                                      (cons 8 "Исправленные")
                                                      (cons 210 vector))))
                                   '((0 0 1) (0 -1 0))
                                   '("Отклонения" "Отклонения (фронтальные)")))
                         ((lambda (r-pt)
                            (reverse (cons ((lambda (x) ((lambda (c) (if (>= (- x c) 0.5) (1+ c) c)) (fix x))) (car r-pt))
                                           (cdr r-pt))))
                          (reverse (cdr (assoc 10 (entget ent)))))))
                     (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
             (vla-endundomark (vlax-get-property (vlax-get-acad-object) 'ActiveDocument)))))
   (ssget (list (cons 0 "point"))))
  (princ))
шрифт и прочие параметры - set-test-param, округленные по Z точки создаются на слое "Исправленные".

p.s. это пример который показывает недостаток автолиспа - отсутствие т.н. "замыканий" - (то что я имел в виду в #25 под "рядом исключений") - поэтому "приходится" использовать setq - но обращаю внимание это глобальная переменная (без нее настройки не сохранить) локальных по прежнему нет (и надеюсь не будет).
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 02.11.2010 в 16:34.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > кнопка для вывода координаты Z заданной точки.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как средствами VBA нарисовать дугу, зная координаты центра, радиус, начальную и конечную точки? tata-tau Программирование 9 03.03.2010 04:07
Нужно узнать координаты каждой точки 3D модели Babun AutoCAD 8 14.10.2008 08:38
Провести линию параллельно заданной через заданные координаты. bizon2008 Программирование 8 02.10.2008 17:23
Координаты точки пересечения line и pline (LISP) paradoxvaha LISP 3 10.07.2007 13:04
Координаты точки, лежащей на полилинии Al_Taron Программирование 1 27.11.2006 09:45