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

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

Z - координата в AutoCAD

Ответ
Поиск в этой теме
Непрочитано 16.12.2004, 16:05 #1
Z - координата в AutoCAD
Gipro
 
Сообщений: n/a

можно ли сделать отслеживание Z координаты в AutoCade ????
Просмотров: 11226
 
Непрочитано 16.12.2004, 16:27
#2
Кулик Алексей aka kpblc
Moderator

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


В процессе работы смотри на левый нижний угол - там пишутся координаты курсора в текущей usc.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.12.2004, 17:05
#3
MIP

инженер
 
Регистрация: 13.12.2004
Минск
Сообщений: 496


Смотря для чего нужно отслеживание Z координаты, если для того чтобы взять ее с объекта, то можно воспользоваться координатным фильтром Shift+правый клик и взять фильтр по Z затем указать точку на объекте с которой нужно взять координату Z используя объектную привязку (можно использовать привязку "ближайшая"), а затем указать координаты XY (любым способом) в которые будет производиться встака (отрисовка) объкта (примитива). В принципе, фильтрами в совокупности с объектной привязкой можно творить много интересных вещей не прибегая к вводу координат из командной строки!
Если нужно что-то другое, то поясните пожалуйста более подробно.
__________________
Сейчас такая знаний бездна
доступна всякому уму,
что стало спорить бесполезно
и глупо думать самому.
MIP вне форума  
 
Непрочитано 17.12.2004, 10:59
#4
Gipro


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


MIP Спасибо конечно, но это не совсем то... смысл следующий:
прога на VBA прорисовывает 3D фигуру, перед этим она запрашивает координаты точки вставки. Можно ли осуществить ввод координат непосредственно с мыши... мне сейчас приходится делать следующее:
ввожу координаты XY даллее программа строит два луча из этой точки по + и - Z, и просит ввестии 3 координату.... это не очень удобный способ, тк для взаимного расположения объектов трудно (не переключая вид, он постоянно 3D) с ориентировать их относительно друг друга в плоскости XY...
 
 
Непрочитано 17.12.2004, 11:11
#5
Кулик Алексей aka kpblc
Moderator

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


Кажется, такого нельзя сделать: сначала надо тогда устанавливать usc в точку будущей вставки. Проще, кажется, сделать по другому: вставлять солид в любую точку, а потом выполнить align (по 3 точкам) или move (в зависимости от текущей задачи).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.12.2004, 12:14
#6
MIP

инженер
 
Регистрация: 13.12.2004
Минск
Сообщений: 496


Цитата:
Можно ли осуществить ввод координат непосредственно с мыши... мне сейчас приходится делать следующее:
ввожу координаты XY даллее программа строит два луча из этой точки по + и - Z, и просит ввестии 3 координату.... это не очень удобный способ, тк для взаимного расположения объектов трудно (не переключая вид, он постоянно 3D) с ориентировать их относительно друг друга в плоскости XY...
Обясните пожалуйста какие координаты неизвестны при данном построении и можно ли их взять с какого либо примитива(объекта) в чертеже. Как я вижу из приведенного описания, Вы задаете координаты XY и Вам необходимо курсором указать координату Z, я прав?
__________________
Сейчас такая знаний бездна
доступна всякому уму,
что стало спорить бесполезно
и глупо думать самому.
MIP вне форума  
 
Непрочитано 17.12.2004, 12:32
#7
MIP

инженер
 
Регистрация: 13.12.2004
Минск
Сообщений: 496


Товорищи програмисты Есть еще одна задачка по поводу координаты Z в Автокаде!
Дано: линейный примитив в 3D
Надо: По заданной координате Z вычислить ее положение по XY на линейном примитиве с возможностью построения других примитивов от этой точки (грубо говоря привязки к этой точке)
Координатные фильтры тут не прокатят!
Для продвинутых усложняю задачу
Дано: линейные примитивы (линия, дуга, окружность, 3D полилиния) в 3D
Надо: Тоже самое.
Предупреждаю сразу на таких примитивах как дуга, окружность и 3D полилиния таких точек может быть 2 (дуга, окружность) и более (3D полилиния), так что нужна возможность выбора нужной точки.
Желательно чтобы при этом не создавалось дополнительных примитивов, дабы не загромождать чертеж.
Дерзайте!
__________________
Сейчас такая знаний бездна
доступна всякому уму,
что стало спорить бесполезно
и глупо думать самому.
MIP вне форума  
 
Непрочитано 17.12.2004, 13:26
#8
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


>MIP
Я вот ничего не понял...
Нужно найти точку (X Y Z) принадлежащую примитиву (кривой) и имеющую заданную координату Z?
Apelsinov вне форума  
 
Непрочитано 17.12.2004, 13:27
#9
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Цитата:
Сообщение от MIP
...Дано: линейный примитив в 3D
Надо: По заданной координате Z вычислить ее положение по XY на линейном примитиве...
Т.е. найти точку пересечения линейного 3М-примитива с плоскостью, параллельной плоскости 0XY и отстоящей от нее на величину Z?

Я правильно понял?
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 17.12.2004, 13:36
#10
Коробейников Алексей

инженер-конструктор
 
Регистрация: 03.11.2004
Москва
Сообщений: 23


>>Gipro
Шли посылку с прогой, посмотрим, может чего и получится сделать.
gevoglot@yandex.ru
Коробейников Алексей вне форума  
 
Непрочитано 17.12.2004, 14:43
#11
MIP

инженер
 
Регистрация: 13.12.2004
Минск
Сообщений: 496


Цитата:
вот ничего не понял...
Нужно найти точку (X Y Z) принадлежащую примитиву (кривой) и имеющую заданную координату Z?
Цитата:
т.е. найти точку пересечения линейного 3М-примитива с плоскостью, параллельной плоскости 0XY и отстоящей от нее на величину Z?
Вы оба по своему правы нужно найти точку принадлежащую примитиву с заданной координатой Z (если она есть конечно) и использовать ее в качестве привязки для построения других примитивов (в фоновом режиме)
Опишу процесc как это должно выглядеть при работе. Я начинаю (заканчиваю, продолжаю нужное подчеркнуть) построение примитива и мне нужна привязка к другому примитиву в точке с заданной координатой Z, я вызываю функцию задаю координату Z (ввод числа с клавиатуры или использование координатного фильтра с привязкой) и указываю примитив на котором нужно определить точку, функция определяет координаты XY точки и отрисовавет сегмент примитива с конечной точкой на объекте с заданной координатой Z и вычисленными координатами XY. Примерно так!
__________________
Сейчас такая знаний бездна
доступна всякому уму,
что стало спорить бесполезно
и глупо думать самому.
MIP вне форума  
 
Непрочитано 17.12.2004, 14:58
#12
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


>MIP
Вот такую штуку набросал, Возвращает точку принадлежащую прямой заданной line. Функция на основе уравнения прямой. Точка может и не лежать на самой line, прямая бесконечна. Если сделать проверку на принадлежность точки line и запустить такую функцию для каждого сегмента 3dpolyline, то можно найти искомую точку для 3dpolyline. Но для окружностей такое не пойдет, нужно писать на основе уравнения окружности.
Код:
[Выделить все]
(defun line-Z-point (Z / line_points v-line Z1 Z2 Y1 Y2 X1 X2 A X Y)
  (if (setq v-line (entsel))
    (progn
      (setq v-line (vlax-ename->vla-object (car v-line)))
      (if (eq (vla-get-ObjectName v-line) "AcDbLine")
	(setq line_points
			  (mapcar '(lambda (i)
				     (vlax-safearray->list
				       (vlax-variant-value i)
				     )
				   )
				  (list	(vla-get-StartPoint v-line)
					(vla-get-EndPoint v-line)
				  )
			  )

	      Z1	  (nth 2 (car line_points))
	      Z2	  (nth 2 (cadr line_points))
	      Y1	  (nth 1 (car line_points))
	      Y2	  (nth 1 (cadr line_points))
	      X1	  (nth 0 (car line_points))
	      X2	  (nth 0 (cadr line_points))

	      A		  (/ (- Z Z1) (- Z2 Z1))
	      Y		  (+ Y1 (* A (- Y2 Y1)))
	      X		  (+ X1 (* A (- X2 X1)))
	)
      )
      (list X Y Z)
    )
  )
)
Apelsinov вне форума  
 
Непрочитано 17.12.2004, 15:43
#13
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


С вами поведешься, чего только не наберешься...
В 3d не работал, поэтому возникают вопросы. Итак, если попытаться реализовать эту задачу, как пересечение линейного примитива (curve) с плоскостью, то на первый взгляд все довольно просто:
1. Указав линейный примитив, получаем его vla-указатель.
2. "Строим" временный объект - вспомогательную плоскость и получаем ее vla-указатель. Кстати, какой примитив AutoCAD'а следует использовать в качестве "плоскости"? Я использовал 3DFace.
3. Применяем к этим двум vla-объектам метод IntersectWith и получаем точку или точки их пересечения.
4. Удаляем вспомогательную плоскость.
Однако при попытке реализовать данный алгоритм столкнулся со следующей ситуацией:
Код:
[Выделить все]
(setq int (vla-intersectWith 3dF 3dp acExtendNone))
#<variant 8197 ...>
_$ (setq saf (vlax-variant-value int))
#<safearray...>
_$ (vlax-safearray->list saf)
; ошибка: ActiveX Server возвратил ошибку: Неверный индекс
Т.е. safearray функцией возвращается, но какой-то кривой, "заглянуть" в него внутрь не удается.
Если то же самое проделать с 2М-примитивами (например circle и line), то все нормально и
Код:
[Выделить все]
_$ (vlax-safearray->list saf)
(-176.499 311.76 0.0)
В help'е по этому поводу сказано, что метод IntersectWith применим ко всем графическим объектам, за исключением Pviewport и PolygonMesh. Т.е. мы ничего не нарушаем.

Какие будут мнения?
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 17.12.2004, 16:34
#14
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от kos
Т.е. safearray функцией возвращается, но какой-то кривой, "заглянуть" в него внутрь не удается.

Какие будут мнения?
Отсутствие пересечений (нужно проверять перед попыткой доступа к массиву):
Код:
[Выделить все]
(vlax-safearray-get-u-bound saf 1)
вернёт '2', если есть пересечение, или '-1', если нет
Alaspher вне форума  
 
Непрочитано 17.12.2004, 16:54
#15
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


>kos
Цитата:
"Строим" временный объект - вспомогательную плоскость <...> Я использовал 3DFace
В акаде ведь нельзя построить настоящую (бесконечную) плоскость. Поэтому нужно построить сегмент плоскости гарантированно проходящий через точку пересечения кривой с этой плоскостью. Но именно эту точку мы и ищем!!!
можно, правда, наверное, построить плоскость на которую целиком проецируется выбранная кривая...
Как же Вы строите 3DFace?
Apelsinov вне форума  
 
Непрочитано 17.12.2004, 23:31
#16
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Цитата:
Сообщение от Alaspher
Отсутствие пересечений (нужно проверять перед попыткой доступа к массиву):
Код:
[Выделить все]
(vlax-safearray-get-u-bound saf 1)
вернёт '2', если есть пересечение, или '-1', если нет
Да, спасибо за информацию. С этим уже разобрался. Только я использовал функцию
Код:
[Выделить все]
(vl-catch-all-apply 'vla-intersectWith (list vla:curve vla:plane acExtendNone))
Цитата:
Сообщение от Apelsinov
В акаде ведь нельзя построить настоящую (бесконечную) плоскость. Поэтому нужно построить сегмент плоскости гарантированно проходящий через точку пересечения кривой с этой плоскостью. Но именно эту точку мы и ищем!!!
можно, правда, наверное, построить плоскость на которую целиком проецируется выбранная кривая...
Как же Вы строите 3DFace?
Еще раз повторюсь: в 3М не работал, поэтому не знаю, есть такой примитив "настоящая плоскость" или нету. Проверял свои задумки на примитивах, построенных вручную и гарантированно пересекающихся (по построению). Однако оказалось, что пересечением считается только случай, когда линейный примитив пересекается с границей этой самой "ненастоящей", ограниченной плоскости.
Построить плоскость, на которую кривая проецируется целиком не представляет проблемы - по координатам габаритных точек кривой. Проблема одним предложением выше...

Продолжаем разговор... (с) Карлсон, который живет на крыше.
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 18.12.2004, 11:26 Z - координата в AutoCAD
#17
VIP


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


Координата Z мышю легко

Берём примитив прямую (луч)
Оставляем одну привязку "ближайшая"
Наводим маркер на примитив по захвату читаем координаты в левом нижнем углу бегаем по примитиву и выбираем нужную точку.
Если предполагаем вставить объект то задачей должна быть точка,если будет построение выбираем соответствующую команду.

-> MIP

Примитив круг или квадрат превращаем через выдавливание в тело с толщиной 0.01 и далее как написано выще

Знаний конечно бездна ктобы подсказал см.секущая в 3М от функции.
VIP вне форума  
 
Непрочитано 18.12.2004, 15:51
#18
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Ну вот еще одна попытка на скорую руку без проверок. Функция ставит на кривой точки в местах с заданной Z-координатой. Есть в этом большие недостатки:

1) Время работы зависит от длинны кривой и от точности.
2) Точность не математическая а пересчетная "куда снаряд упал".
3) Точек удовлетворяющих условию с определенной точностью может быть несколько и надо отфильтровать наиболее подходящую (здесь не реализованно).

Однако работает со всеми линейными примитивами.
Код:
[Выделить все]
(defun c:zcatch ()
  (vl-load-com)
  (setq oldOsm(getvar "osmode"))
  (setvar "osmode" 0)
  (setq curve(vlax-ename->vla-object(car(entsel "\nSelect curve: ")))
	zOrd(getreal "\nEnter wanted Z-ordinate: ")
	stPar(vlax-curve-getStartParam curve)
	enPar(vlax-curve-getEndParam curve)
	dist 0.0
	reslist '()
	); end setq
  (while(not(equal stPar enPar 0.01))
    (setq stPar(vlax-curve-getParamAtDist curve dist))
    (setq curPt(vlax-curve-getPointAtParam curve stPar))
    (if(equal(nth 2 curPt)zOrd 0.01)
      (setq resList(append resList(list curPt)))
      ); end if
    (setq dist(+ dist 0.01))
    ); end while
  (foreach i resList
    (command "_.point" i)
    ); end foreach
  (setvar "osmode" oldOsm)
  (princ)
  ); end of zcatch
{Smirnoff} вне форума  
 
Непрочитано 20.12.2004, 05:54
#19
VIP


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


1) Время работы зависит от длинны кривой и от точности.
2) Точность не математическая а пересчетная "куда снаряд упал".
3) Точек удовлетворяющих условию с определенной точностью может быть несколько и надо отфильтровать наиболее подходящую (здесь не реализованно).

1) За время не согласен всётаки не вселенную делаем, да и быстрее чем програмку писать.

2)Точность вопрос реторический так можно ввести и в ручную, а расчёт в EXCEL через горячо любимую математику(прямая на плоскости и в пространстве)

3)В моём решении точек с известной Z может быть не больше двух ибо находятся они на гранях, а дальше опятьже матиматика

А в целом с критикой согласен.

И Если заговорили за построения в 3М то не плохобы иметь примочку которая указывала координаты точек прямо на экране, а то не удобно писать на бумаге.
VIP вне форума  
 
Непрочитано 20.12.2004, 09:50
#20
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Fantomas, немного критики.

1. Функция работает достаточно долго.
2. При тестировании я получил в качестве результата 5 точек, хотя решение одно (пересечение прямой и плоскости - одна точка).

Теперь немного конструктива:
Для прямолинейных сегментов нет необходимости проходить его по шагам. Достаточно
1. определить, пересекает ли данный сегмент плоскость (сравнением координат Z начальной и конечной точки сегмента с указанным значением Z).
2. если пересекает, то пересчитать координаты X и Y. Примерно так:
Код:
[Выделить все]
(setq point (list (+ (car startPoint)
		     (*	(/ z (- (caddr endPoint) (caddr startPoint)))
			(- (car endPoint) (car startPoint))
		     ) ;_  *
		  ) ;_  +
		  (+ (cadr startPoint)
		     (*	(/ z (- (caddr endPoint) (caddr startPoint)))
			(- (cadr endPoint) (cadr startPoint))
		     ) ;_  *
		  ) ;_  +
		  z
	    ) ;_  list
) ;_  setq

Здесь: startPoint, endPoint - начальная и конечная точки сегмента полилинии; Z - заданная координата Z.
Извиняйте, сейчас просто нет времени придать этому более-менее законченную форму.
И еще остается вопрос с дуговыми сегментами...
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Z - координата в AutoCAD

Реклама i
Опции темы Поиск в этой теме
Поиск в этой теме:

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