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

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

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

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

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

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


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

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от alexdub Посмотреть сообщение
Добрый день! задача следующая: файле (автокад) есть около 5 тыс. точек. у каждой свое значение координаты Z. нужна команда, которая будет при нажатии на точку вставлять рядом текст с этой координатой. сами понимаете, что смотреть координату в свойствах (или через inquiry), а потом печатать текстом слишком уж долго
посоветуйте, пожалуйста, литературу по написанию макросов (в детстве хорошо дружил с информатикой , думаю разберусь) а может у кого-то была похожая задача и подскажете советом, спасибо!
Offtop: А сидеть, и как дятел 5 тыс. раз судорожно кликать мышью - это быстро?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 18.10.2010, 16:21
#3
Дима_

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


пример файла с небольшим кол-вом точек приложил-бы - глядишь и код появится
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 18.10.2010, 16:22
#4
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,706


Код:
[Выделить все]
option Explicit
Public Const tpv = "" ' 
Public Const heighttxt = 100
Sub main()
Dim pnt As Object
Dim acSelSet As AcadSelectionSet
Dim textObj As AcadText
Dim textString As String
Dim insertionPoint
Dim height As Double
height = heighttxt
Set acSelSet = SelectOnlyOnScreen(tpv)
If acSelSet.Count = 0 Then Exit Sub
For Each pnt In acSelSet
 insertionPoint = pnt.Coordinates
 textString = insertionPoint(2)
 Set textObj = ThisDrawing.ModelSpace.AddText(textString, insertionPoint, height)
Next
End Sub
Private Function SelectOnlyOnScreen(str) As AcadSelectionSet
Dim objSelSet As AcadSelectionSet
Dim objSelCol As AcadSelectionSets
Dim intType(0) As Integer
Dim varData(0) As Variant
Set objSelCol = ThisDrawing.SelectionSets
For Each objSelSet In objSelCol
 If objSelSet.Name = "Blck" Then
  objSelSet.Delete
  Exit For
 End If
Next
Set objSelSet = ThisDrawing.SelectionSets.Add("Blck")
intType(0) = 0
varData(0) = "Point"
If str = "выбрать объекты" Then
  objSelSet.SelectOnScreen intType, varData
Else
  objSelSet.Select acSelectionSetAll, , , intType, varData
End If
Set SelectOnlyOnScreen = objSelSet
End Function
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Автор темы   Непрочитано 18.10.2010, 16:54
#5
alexdub

инженер-конструктор
 
Регистрация: 20.05.2010
Сообщений: 20
<phrase 1=


Цитата:
Сообщение от hwd Посмотреть сообщение
Offtop: А сидеть, и как дятел 5 тыс. раз судорожно кликать мышью - это быстро?
это в 3 раза быстрее


Цитата:
Сообщение от Дима_ Посмотреть сообщение
пример файла с небольшим кол-вом точек приложил-бы - глядишь и код появится
сейчас выложу)


Цитата:
Сообщение от AlexV Посмотреть сообщение
Код:
будешь в москве, я тебе пива куплю
но для начала мне нужно чтото почитать, где будет написано как создать макрос и куда этот код вставить))

я правильно понял, он ставит координаты для выделенного массива точек?
__________________
ломать - не строить : )

Последний раз редактировалось alexdub, 18.10.2010 в 16:59.
alexdub вне форума  
 
Непрочитано 18.10.2010, 17:12
#6
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,706


Цитата:
Сообщение от alexdub Посмотреть сообщение
это в 3 раза быстрее
сейчас выложу)
будешь в москве, я тебе пива куплю
но для начала мне нужно чтото почитать, где будет написано как создать макрос и куда этот код вставить))
я правильно понял, он ставит координаты для выделенного массива точек?
Понял правильно.. Для всех точек в чертеже. Если надо по выбору рамкой, то замени Public Const tpv = "" на Public Const tpv = "выбрать объекты".
"Public Const heighttxt = 100" - це высота текста. Alt + F8 > диспетчер VBA > новый > Редактор VBA > вставить модуль. В модуль вставить код, сохранить как проект VBA. Подгрузить в акад (сервис - загрузка приложений или макросы > диспетчер VBA > загрузить, ну и запустить...
Миниатюры
Нажмите на изображение для увеличения
Название: vba.jpg
Просмотров: 116
Размер:	33.4 Кб
ID:	46778  Нажмите на изображение для увеличения
Название: Безымянный.jpg
Просмотров: 123
Размер:	30.3 Кб
ID:	46779  
__________________
...Не пытайся гнуть ты ложку,
Не вяжи её узлом.
Ложка - ложка понарошку,
А по правде, - это лом!
AlexV вне форума  
 
Непрочитано 18.10.2010, 18:17
#7
Victor


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


Могет быть в блоки
Код:
[Выделить все]
(defun c:test(/)
(setvar "attreq" 1)
(setvar "attdia" 0)
(setq sset (ssget "_:L" '(( 0 . "POINT"))))
(setq i 0)
(while(setq dot (ssname sset i))
(setq dot_krd (cdr(assoc 10 (entget dot))))
(setq dot_z (rtos(last dot_krd) 2 2))   
(command "_.insert" "dt" dot_krd 50.0 50.0 0.0 dot_z)
(setq i (+ 1 i))
)
)
Вложения
Тип файла: dwg
DWG 2007
dots.dwg (250.6 Кб, 1031 просмотров)
Victor вне форума  
 
Автор темы   Непрочитано 19.10.2010, 10:16
#8
alexdub

инженер-конструктор
 
Регистрация: 20.05.2010
Сообщений: 20
<phrase 1=


Цитата:
Сообщение от AlexV Посмотреть сообщение
Понял правильно.. Для всех точек в чертеже. Если надо по выбору рамкой, то замени Public Const tpv = "" на Public Const tpv = "выбрать объекты".
"Public Const heighttxt = 100" - це высота текста. Alt + F8 > диспетчер VBA > новый > Редактор VBA > вставить модуль. В модуль вставить код, сохранить как проект VBA. Подгрузить в акад (сервис - загрузка приложений или макросы > диспетчер VBA > загрузить, ну и запустить...
все получилось! огромное спасибо!
вопрос следующий: как сделать, чтобы он выводил только целые значения?
__________________
ломать - не строить : )
alexdub вне форума  
 
Непрочитано 19.10.2010, 10:22
#9
Дима_

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


Цитата:
Сообщение от alexdub Посмотреть сообщение
все получилось! огромное спасибо!
вопрос следующий: как сделать, чтобы он выводил только целые значения?
Дружище ты б написал все сразу, да 2 примера выложил (до и после), этож уже не первый раз - потом начнется, а можно чтоб еще и блоки, да на слой ХХХ и т.д.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 19.10.2010, 10:28
#10
alexdub

инженер-конструктор
 
Регистрация: 20.05.2010
Сообщений: 20
<phrase 1=


мне только целые числа и все.
координату Y выводит целомй, а X и Z c 11-ю знаками после запятой.

Цитата:
Дружище ты б написал все сразу, да 2 примера выложил (до и после), этож уже не первый раз - потом начнется, а можно чтоб еще и блоки, да на слой ХХХ и т.д.
согласен, не прав... впредь буду аккуратней! сейчас посмотрел, действительно не все... нужно чтоб он еще в случае положительной координаты писал "+"
в общем сейчас докину пример "до" и "после".
__________________
ломать - не строить : )

Последний раз редактировалось alexdub, 19.10.2010 в 10:45. Причина: ошибся
alexdub вне форума  
 
Непрочитано 19.10.2010, 10:44
#11
Дима_

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


Если тебе лень нарисовать - то мне лень понимать - что тебе нужно только z или x,y,z? где их рисовать (на высоте точки или "в нуле"), чтобы написать программу надо прежде всего понять что нужно, то что нужно для написании программы ты не знаешь (иначеб смог сам написать) - поэтому и говорят - ВЫЛОЖИ ПРИМЕР.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 19.10.2010, 11:24
#12
alexdub

инженер-конструктор
 
Регистрация: 20.05.2010
Сообщений: 20
<phrase 1=


вот, выложил. считаем, что слой "отклонения" для вставки координат Z и стиль текста "Standart" уже есть в файле. текст должен стоять "в нуле". расположение текста как в примере, чуть выше точки, середина - чуть левее точки. если значение координаты положительное, то писать "+", если 0, то писать "+0".
с X и Y я просто экспериментировал.
еще пытался всунуть: Round(expression [,numdecimalplaces]). Но видимо не туда))

вроде бы все
Вложения
Тип файла: dwg
DWG 2007
1.dots defore.dwg (116.0 Кб, 1028 просмотров)
Тип файла: dwg
DWG 2007
2.dots after.dwg (117.2 Кб, 1016 просмотров)
__________________
ломать - не строить : )
alexdub вне форума  
 
Непрочитано 19.10.2010, 12:02
#13
Дима_

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


Сохрани файл с расширенем .lsp "затащи" его в окно автокада и набери команду TEST
Код:
[Выделить все]
(vl-load-com)
(defun c:test()
  ((lambda (ss)
     (if ss (progn
             (vla-startundomark (vlax-get-property (vlax-get-acad-object) 'ActiveDocument))
             (mapcar '(lambda (ent)
                        ((lambda (pt)
                           (entmakex (list
                                      (cons 0 "text")
                                      (cons 10 ((lambda (pt) (list (- (car pt) 200 ) (+ 50 (cadr pt)))) pt))
                                      (cons 8 "Отклонения")
                                      (cons 40 300)
                                      (cons 1 ((lambda (z) (strcat (if (> z -1) "+" "")(itoa z) )) (fix (last pt)))))))
                         (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))
p.s. - жирным высота шрифта, курсивом - название слоя.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 19.10.2010, 12:40
#14
alexdub

инженер-конструктор
 
Регистрация: 20.05.2010
Сообщений: 20
<phrase 1=


отлично работает! но округляет в меньшую сторону)) но это не страшно. это я уж как-нибудь сам качаю Хювёнена, почитаю на досуге.
Дима, AlexV, Victor СПАСИБО!
__________________
ломать - не строить : )
alexdub вне форума  
 
Непрочитано 19.10.2010, 13:49
#15
Pastor

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


Не надо Хювёнена!
Найди Полещук Н., Лоскутов П.. AutoLISP и VisualLISP в среде AutoCAD. Этого более чем достаточно.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 19.10.2010, 13:54
#16
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Сохрани файл с расширенем .lsp "затащи" его в окно автокада и набери команду TEST
Код:
[Выделить все]
(vl-load-com)
(defun c:test()
  ((lambda (ss)
     (if ss (progn
             (vla-startundomark (vlax-get-property (vlax-get-acad-object) 'ActiveDocument))
             (mapcar '(lambda (ent)
                        ((lambda (pt)
                           (entmakex (list
                                      (cons 0 "text")
                                      (cons 10 ((lambda (pt) (list (- (car pt) 200 ) (+ 50 (cadr pt)))) pt))
                                      (cons 8 "Отклонения")
                                      (cons 40 300)
                                      (cons 1 ((lambda (z) (strcat (if (> z -1) "+" "")(itoa z) )) (fix (last pt)))))))
                         (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))
p.s. - жирным высота шрифта, курсивом - название слоя.
Излишнее здесь:

(defun C:test ()

достаточно начать со строки

((lambda (ss)

для автовыполнения как анонимной функции

ИМО
Олег (jr.) вне форума  
 
Непрочитано 19.10.2010, 14:17
#17
Дима_

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


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Излишнее здесь:
(defun C:test ()
достаточно начать со строки
((lambda (ss)
для автовыполнения как анонимной функции
Чего?? А вызывать ты ее тоже анонимно будешь?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 19.10.2010, 14:29
#18
alexdub

инженер-конструктор
 
Регистрация: 20.05.2010
Сообщений: 20
<phrase 1=


Цитата:
Сообщение от Pastor Посмотреть сообщение
Найди Полещук Н., Лоскутов П.. AutoLISP и VisualLISP в среде AutoCAD. Этого более чем достаточно.
возьму на заметку
__________________
ломать - не строить : )
alexdub вне форума  
 
Непрочитано 19.10.2010, 15:14
#19
Pastor

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


Код из поста №13 в переводе с лямбда на русский. Теперь вместе с Полещуком и Лоскутовым реально разобраться.
Код:
[Выделить все]
(defun c:test( / ss)
  (setq ss (ssget (list (cons 0 "point"))))
  (if ss
    (progn
    (vla-startundomark (vlax-get-property (vlax-get-acad-object) 'ActiveDocument))
    (mapcar
      '(lambda (ent / pt z)
         (setq pt (cdr (assoc 10 (entget ent))) z (fix (last pt)))
         (entmakex
           (list
             (cons 0 "text")
             (cons 10 (list (- (car pt) 200 ) (+ 50 (cadr pt))))
             (cons 8 "Отклонения")
             (cons 40 300)
             (cons 1 (strcat (if (> z -1) "+" "")(itoa z)))
           )
         ); /entmakex.
      ); /lambda.
      (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
    ); /mapcar.
    (vla-endundomark (vlax-get-property (vlax-get-acad-object) 'ActiveDocument))
    ); /progn.
  ); /if.
  (princ)
); /defun.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 19.10.2010, 15:29
#20
Дима_

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


То Пастор - если Вы привыкли писать на vb, например, то это не значит, что на лиспе надо писать так-же - lambda четко выражает область определения аргумента - НЕ ДОЛЖНО БЫТЬ В ЛИСПЕ ПЕРЕМЕННЫХ - там аргументы с четко заданной областью видимости, сделано это для программ чуть побольше чем Ваша (в С++ это-же (с оговорками) называеться объектами), не учите "неправильному" если сами "плаваете". Выход функции должен определяться строго ТОЛЬКО входными данными. Чем быстрее Вы это поймете тем яснее для Вас станет лисп.
p.s. gодумаете на досуге что происходит со списочной структурой когда Вы вызываете setq, да еще и в цикле - это из разряда список как массив использовать.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 19.10.2010 в 15:38.
Дима_ вне форума  
 
Непрочитано 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,450


Дима_, касательно #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,450


Дима_, а теперь объясни разницу между переменной и параметром вызова. Особенно когда эта переменная локальная в одной функции и является параметром вызова второй
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
Просмотров: 45
Размер:	59.0 Кб
ID:	47542  Нажмите на изображение для увеличения
Название: вид точек после изменениея вида отображения.jpg
Просмотров: 49
Размер:	68.9 Кб
ID:	47543  Нажмите на изображение для увеличения
Название: конечный вид.jpg
Просмотров: 54
Размер:	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.
Дима_ вне форума  
 
Непрочитано 02.11.2010, 15:12
#41
bem_ua


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


Супер программа - очень признателен работает отлично!
Единственное, что сейчас не очень хорошо выглядит - так это в режиме любого из видов - теперь доступны два текста, но они в одном слое и таким образом при виде сверху один текст нормально виден, а тот, что сделан для вида спереди - отображается подчеркиванием (в виде черточек - см. приложение) а он в принципе не нужен, решил проблему отображения за счет изменения шрифта на ариал - эти подчеркивания просто исчезли. В целом супер, но если будет возможно/ желание разделить текст в разные слои буду примного благодарен, чтоб ненужный текст(слой) можно было отключить или удалить если в нем нет необходимости!

А так все очень супер и решило проблему нудной обработки файла
на сколько я понял - сначала запускаем set-test-param - задаем настройки для выполнения следующего скрипта, а после этого запускаем сам скрипт - test
выбираем нужные объекты и получаем отличный результат!!!!!!!

Еще раз огромное спасибо!
Миниатюры
Нажмите на изображение для увеличения
Название: razmer.jpg
Просмотров: 68
Размер:	69.5 Кб
ID:	47564  

Последний раз редактировалось bem_ua, 02.11.2010 в 15:49.
bem_ua вне форума  
 
Непрочитано 02.11.2010, 16:35
1 | #42
Дима_

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


Добавил в #40.
Цитата:
сначала запускаем set-test-param
- это если не устраивают по умолчанию.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 03.11.2010, 12:00
#43
bem_ua


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


Дима - ты осчастливил большое количество моих знакомых твоим скриптом он как минимум в 2е сократил время на обработку данных в автокаде и сократил самую нудную половину работы
Еще раз огромное спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!
bem_ua вне форума  
 
Непрочитано 03.11.2010, 12:23
#44
Дима_

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


Пусть выпьют за мое умственное здоровье.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум 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