кнопка для вывода координаты 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.
Просмотров: 9079
 
Непрочитано 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,692


Код:
[Выделить все]
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,692


Цитата:
Сообщение от 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 Кб, 1030 просмотров)
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.
Дима_ вне форума  
Ответ
Вернуться   Форум 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