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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Тригонометрические функции и векторная алгебра

Тригонометрические функции и векторная алгебра

Ответ
Поиск в этой теме
Непрочитано 20.11.2009, 18:38
Тригонометрические функции и векторная алгебра
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Решил переделать тему и собрать тут все, необходимое для вычислений в пространстве модели Автокада.

Вычисление расстояния от точки до точки:
(distance <точка1> <точка2>)
Аргуметы в виде списков (X Y Z)
В книге Н. Н. Полещука "AutoLISP и Visual Lisp в среде AutoCAD" в этой функции опечатка.
Цитата:
... Если точки трехмерные, то функция рассчитывает угол между осью Х и проекцией вектора, идущего из первой точки во вторую точку, на текущую плоскость построений. ...
Весь этот текст следует просто зачеркнуть. Остальное правильно.

Получение координат точки, лежащей на середине расстояния по прямой, между двумя точками:

Получение координат точки лежащей от точки P1 на расстоянии L в направлении точки P2:

Получение единичного вектора по двум точкам:

Функция EULER-XY
Вычисление углов Эйлера, определяющих разворот ПСК относительно МСК.
по двум векторам направления осей X и Y ПСК.

Функция EULER-Z
Вычисление углов Эйлера, определяющих разворот ПСК относительно МСК.
по направлением оси Z ПСК.

Функция ORT
Вычисляет орт двумерного или трехмерного вектора из точки 0,0,0 в указанную точку

Функция VXV
Вычисляет векторное произведения векторов.
Возврат: список из трех координат результирующего вектора.

Функция VAV.
Определяет взаимное направление 2х векторов. (к сожалению, вектора задаются как направление
из точки 0,0,0 в указанную точку)
Возврат: число - угол между векторами в радианах [0 ; Pi].


Функция GET-UCS-MATRIX
Вычисляет матрицу прямого или обратного преобразования для использования в ActiveX методе TransformBy.
Аргументы.
Функция получает в качестве 1-го аргумента точку начала мысленной ПСК (ПСК не обязана реально существовать).
В качестве второго и третьего аргументов - векторы осей X и Y ПСК.


Получение векторов Z, -Z, X, -X, Y и -Y ПСК объекта по его нормали и углу поворота

Функция по получению точки вставки и трех векторов объекта

Скалярное произведение векторов, однако!

Вычисление точки, лежащей на прямой, пересекающей плоскость.

Функция вычисления угла между векторами (в градусах и от 0 до 180).

Последний раз редактировалось Supermax, 07.12.2009 в 18:22.
Просмотров: 42487
 
Непрочитано 22.11.2009, 21:43
#21
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


ок. на входе имеем Local.oz - нормаль, rotate - угол поворота. расчитываем Local.ox, Local.oy и матрицу перевода мировых координат в систему координат блока. матрицы приняты 4х мерными.

используя arbitrary axis algorithm считаем неповернутые Local.ox, Local.oy, тут YWCS и ZWCS соответственно равны 0,1,0 и 0,0,1
Код:
[Выделить все]
     if (abs (Local.oz.x) < 1/64) and (abs (Local.oz.y) < 1/64) then
                                                                    Local.ox:=CrossVertex(YWCS,Local.oz)
                                                                else
                                                                    Local.ox:=CrossVertex(ZWCS,Local.oz);
     Local.oy:=CrossVertex(Local.oz,Local.ox);
затем учитываем точку вставки блока (формируем матрицу поворота и умножаем ее на матрицу перемещения):
Код:
[Выделить все]
     rotmatr:=onematrix;
     PGDBVertex(@rotmatr[0])^:=Local.ox;
     PGDBVertex(@rotmatr[1])^:=Local.oy;
     PGDBVertex(@rotmatr[2])^:=Local.oz;

     dispmatr:=onematrix;
     PGDBVertex(@dispmatr[3])^:=Local.p_insert;
     objmatrix:=MatrixMultiply(dispmatr,rotmatr);
objmatrix - матрица перехода от wcs к ocs, но она пока не учитывает rotate. формируем матрицу поворота и домножаем на нее

Код:
[Выделить все]
  m1:= OneMatrix;
  m1[0,0]:=cos(rotate*pi/180);
  m1[1,1]:=cos(rotate*pi/180);
  m1[1,0]:=-sin(rotate*pi/180);
  m1[0,1]:=sin(rotate*pi/180);
  objMatrix:=MatrixMultiply(m1,objMatrix);
выдергиваем оси системы координат объекта из матрицы
Код:
[Выделить все]
     Local.ox:=PGDBVertex(@rotmatr[0])^;
     Local.oy:=PGDBVertex(@rotmatr[1])^;
     Local.oz:=PGDBVertex(@rotmatr[2])^;
zamtmn вне форума  
 
Автор темы   Непрочитано 22.11.2009, 21:49
#22
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Вообще-то проще 6 раз перейти из одного пользовательского пространства в другое и списать значения 210 пары переведенные в ПСК.
Чего голову морочить?
Правда если модель перегружена объектами могут тормоза начаться, но можно попытаться.
Можно из линий ежика сделать, объединить их в блок, развернуть и взорвать, получив координаты концов линий.
Что-то чую я, трудно будет математикой это сделать.
Supermax вне форума  
 
Непрочитано 22.11.2009, 22:03
#23
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


математикой это сделать просто, а вот на лиспе возможно трудно если матриц нет
хотя по любому должны быть уже готовые методы без создания объектов
zamtmn вне форума  
 
Автор темы   Непрочитано 22.11.2009, 23:18
#24
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Вот, сделано через Ж, но работает.
Код:
[Выделить все]
(vl-load-com)
(defun vektor-translate (vect ugol / actdoc modeltxt blockkoll blc-obj-txt blc-obj-3
o-point spis-var blk-ins spis-line spis-vekt a) 
(setq actdoc (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq modeltxt (vla-get-ModelSpace actdoc))
(setq blockkoll (vla-get-Blocks actdoc))

(setq blc-obj-1 (vla-Add blockkoll (vlax-3D-point '(0.0 0.0 0.0)) "temp-block-txt"))
(setq blc-obj-2 (vla-Add blockkoll (vlax-3D-point '(0.0 0.0 0.0)) "temp-block-2"))
(vla-InsertBlock blc-obj-1 (vlax-3D-point '(0.0 0.0 0.0)) "temp-block-2" 1 1 1 0.0)
(vlax-for x (vla-Item blockkoll "temp-block-txt") (setq blc-obj-3 x))


(setq o-point (vlax-3D-point '(0.0 0.0 0.0)))
(setq spis-var (mapcar 'vlax-3D-point '((0.0 0.0 1.0) (0.0 0.0 -1.0) 
                                        (1.0 0.0 0.0) (-1.0 0.0 0.0) 
                                        (0.0 1.0 0.0) (0.0 -1.0 0.0))))

(mapcar '(lambda (a) (vla-AddLine blc-obj-2 o-point a)) spis-var)

(vla-put-Rotation blc-obj-3 ugol)
(vla-put-Normal blc-obj-3 (vlax-3D-point vect))
;сначала надо поворачивать, а уж потом менять нормаль
(setq spis-line (vlax-safearray->list (vlax-variant-value (vla-Explode blc-obj-3))))
(setq spis-vekt (mapcar '(lambda (a) (vlax-safearray->list (vlax-variant-value (vla-get-EndPoint a)))) spis-line))
(mapcar 'vla-Delete spis-line)
(vla-Delete blc-obj-3)
(vla-Delete blc-obj-1)
(vla-Delete blc-obj-2)
(setq a spis-vekt)
)
Даем единичный вектор (нормаль) и угол
Получаем (z (то есть то, что дали) -Z X -X Y -Y)
Пример
(vektor-translate '(-0.34202 0.0 0.939693) 1.91986)
Получаем:
((-0.34202 0.0 0.939693) (0.34202 0.0 -0.939693) (0.883023 0.342018 0.321394) (-0.883023 -0.342018 -0.321394) (-0.321392 0.939693 -0.116977) (0.321392 -0.939693 0.116977))

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

Последний раз редактировалось Supermax, 23.11.2009 в 03:31.
Supermax вне форума  
 
Непрочитано 23.11.2009, 09:15
#25
Елпанов Евгений

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


Supermax, Привет!

Я честно пытался понять, что же необходимо получить. Прочел тему полтора раза, но не понял. Нахождение векторов, их преобразование и вращение, можно делать гораздо проще. Как уже говорилось, либо по формулам аффинных преобразований, либо через векторы и функцию trans. Поясните для меня, что именно необходимо получить...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 23.11.2009, 10:00
#26
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Я дочитал еще те 0.5 раза, которые не смог Евгений и так же не понял
По поводу trans, OCS и 3D у меня в закладках потрясающая и исчерпывающая тема gile. Там требуется регистрация, но советую почитать.
About trans and OCS in 3D
Пример оттуда. Получет вектор, который пишется в 210 поле
Код:
[Выделить все]
(setq ucszdir (trans '(0 0 1) 1 0 T))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 23.11.2009, 10:19
#27
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Поясняю (ну как смогу, конечно).
Что такое 210 пара? Можно много красивых слов находить, но по детски очень трудно сформулировать. 210 пара - ось Z объекта в сторону положительных значений.
Берем любой примитив, лучше МTEXT, поворачиваем его туда-сюда и наигравшись смотрим куда смотрит его ось Z, тобишь, читаем значение нормали (210 пары). Что такое единичная сфера и единичный вектор смотрим в википидии.
Но положение тела в пространстве определяется не только точкой вставки и ориентацией Z оси объекта, а еще и углом поворота вокруг этой оси. Хотя можно задавать просто две точки, как в MTEXT-е (210 и 11 пары).

Мне надо отложить по оси Y объекта необходимую длинну. Для этого мне надо определить, куда смотрит ось Y объекта. Имея единичный вектор, который соответствует оси ординат объекта я могу строить вокруг него нужные мне геометрические фигуры, как бы он не был повернут в пространстве.

Да я тупо сделал функцию. Нарисовал "ежик" с 6-ю лучами и задавая ему поворот и направление нормали получаю все 6 векторов.
Есть один вектор и угол поворота вокруг него, надо найти все остальные вектора.
Да гляньте вы на список, что возвращается. если Z = первой координате, то -Z - второй и все остальные тоже отличаются только знаками.
Миниатюры
Нажмите на изображение для увеличения
Название: ежик.JPG
Просмотров: 111
Размер:	14.4 Кб
ID:	29414  

Последний раз редактировалось Supermax, 23.11.2009 в 10:46.
Supermax вне форума  
 
Непрочитано 23.11.2009, 10:55
#28
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


кстати отрицательные значения не нужны, они автоматом получатся при откладывании отрицательной длины в нужном направлении
имеем единичный вектор dir нужного направления, нужно отложить 5 едениц в обе стороны
dir*5 в положительном
dir*(-5) в отрицательном
zamtmn вне форума  
 
Непрочитано 23.11.2009, 11:23
#29
Елпанов Евгений

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Что такое 210 пара?
Это вектор, причем ничего не мешает использовать "длинный" вектор, т.е. его длина не обязательно должна равняться единице! Это верно для всех примитивов акада...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 23.11.2009, 11:45
#30
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Цитата:
причем ничего не мешает использовать "длинный" вектор, т.е. его длина не обязательно должна равняться единице! Это верно для всех примитивов акада...
Ты хочешь сказать, что в 210 пару или свойство Normal можно записывать значения не единичной сферы?
Для ручного указания направления сойдет что угодно, а для изменения ориентации объекта? Допустим, мне надо повернуть объект вокруг его оси X на 90 градусов по часовой стрелке.

Лишние направления не лишни. Даже первый список, который вегда равен тому, который задаешь аргументом не грех сравнивать с исходным.
Вот кто мне скажет почему надо сначала поворачивать, а потом менять нормаль?
В свойстве "Rotation" ведь указан поворот вокруг оси, которая задана нормалью. Если нормаль крутишь-вертишь он не меняется, а стоит его поменять - нормаль летит к чертям.
Вот переставьте в моей функции вот эти две строчки местами.
Код:
[Выделить все]
(vla-put-Rotation blc-obj-3 ugol)
(vla-put-Normal blc-obj-3 (vlax-3D-point vect))
Supermax вне форума  
 
Непрочитано 23.11.2009, 12:03
#31
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Вот кто мне скажет почему надо сначала поворачивать, а потом менять нормаль?

3д повороты зависят от порядка в котором они произведены, поменяешь их местами - получишь другой результат, зависят от системы координат в которой они производятся. вектор ты крутишь в мировой системе координат, а угол задаешь уже в локальной ск объекта
Имхо правильней задавать не угол а направление 0x, угол - для наглядности в 2D, в 3D его наглядность теряется

Последний раз редактировалось zamtmn, 23.11.2009 в 12:16.
zamtmn вне форума  
 
Непрочитано 23.11.2009, 12:18
#32
Елпанов Евгений

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


Цитата:
Сообщение от Supermax Посмотреть сообщение
Ты хочешь сказать, что в 210 пару или свойство Normal можно записывать значения не единичной сферы?
Да, я именно это и говорю!
Попробуй для любого объекта задать длинный вектор или как вариант - удлинить его..
Как пример - удлиняем вектор в 11 раз:
Код:
[Выделить все]
(if (setq e (car (entsel)))
 (entmod (subst (cons 210 (mapcar '* (cdr (assoc 210 (entget e))) '(11. 11. 11.)))
                 (assoc 210 (entget e))
                 (entget e)
         ) ;_  substr
 ) ;_  entmod
)
Кстати, при следующем запросе, автокад сам даст единичный вектор.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 23.11.2009, 12:44
#33
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


zamtmn, не, "ты Борис не прав". Угол, что значится в свойстве Rotation ни к каким пространствам отношения не имеет. Он (по идее) всегда обозначает поворот вокруг нормали. То есть вокруг оси Z объекта.
В какую ты систему не пересчитывай нормаль, а угол всегда один и тот же. Но процесс установки угла и нормали, если это делать путем замены точечных пар, у блока, к примеру, сбивает настройку точки вставки. Причем в 10 паре указано одно, а vla-get-InsertionPoint показывает совсем другое. И врет при этом 10 пара. Если сделать vla-put... то блок становится на свое место, а 10 пара, угол поворота и нормаль остаются прежними.
Глюки, короче.
Тут тоже видимо глюк. Этот Rotation, ведет себя так, буд-то объект вращают вокруг оси Z пространства, где расположен объект.
Я правда только на блоках и MTEXT-ах практиковался.

Елпанов Евгений, ценная инфа, могет пригодиться. Правда в свете глюковатости самого када, как бы глюков не прибавилось.
Supermax вне форума  
 
Непрочитано 23.11.2009, 12:55
#34
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


в системе координат блока угол это поворот вокруг 0,0,1, а в мировой системе системе поворот вокруг нормали блока. при переходе между системами значение угла не меняется, меняется вокруг чего он задает вращение.

Не знаю как в лиспе а в dxf файле значение точки вставки хранится в системе координат объекта, такчто ее тоже нужно пересчитывать в мировую систему, приведеные мной выше куски кода работают при чтении dxf файла, возможно в лиспе точка вставки автоматом переведена в МСК
zamtmn вне форума  
 
Непрочитано 23.11.2009, 13:04
#35
Елпанов Евгений

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


Supermax, Есть одна тонкость, но ее необходимо учитывать и при передаче единичного вектора. Если ты присваиваешь одинаковый вектор нормали нескольким объектам и для каждого объекта вычисляешь этот вектор заново, может оказаться, что объекты лежат в разных плоскостях и соответственно не могут пересекаться, объединяться и.т.д... А всему виной точность. Т.е. в одном месте будет 0.0 а в другом 1е-16. и уже разные вектора.

Я, обычно, использую небольшое округление векторов. Это позволяет меньше зависеть от точности акада...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 23.11.2009, 13:19
#36
Дима_

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


То Supermax - 10 пара не врет ее надо пересчитывать trans'ом.
p.s. Посмотри внимательно в dxf reference line ... 10 WCS circle 10 - OCS
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 23.11.2009, 13:33
#37
Кулик Алексей aka kpblc
Moderator

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


point -> WCS
insert -> OCS

Я у себя на сайте по этому вопросу развлекался...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.11.2009, 14:41
#38
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


to Supermax
если тебе надо сделать boundingBox для повернутого mtexta то оно вот, спасибо VVA. - это функция из экспресс тулз, что подается ей на вход остается только гадать, но вот так работает:
Код:
[Выделить все]
(acet-geom-textbox (entget (vlax-vla-object->ename x)) 1e-3)
если тебе нужны функции векторного произведения, то опубликую здесь коды Gile с Theswamp.org:
Код:
[Выделить все]
;;; VEC1 Returns the single unit vector from p1 to p2
(defun vec1 (p1 p2)
  (if (not (equal p1 p2 1e-009))
    (mapcar
      '(lambda (x) (/ x (distance p1 p2)))
      (mapcar '- p2 p1)
    )
  )
)


;;; NORM_3PTS Returns the normal vector of the plane defined by 3 points
;;; Respects the "right hand rule" with p0 as origin
(defun norm_3pts (p0 p1 p2 / norm)
  (cond
    ((inters p0 p1 p0 p2)
     (foreach p	'(p1 p2)
       (set p (mapcar '- (eval p) p0))
     )
     (setq norm	(list (- (* (cadr p1) (caddr p2)) (* (caddr p1) (cadr p2)))
		      (- (* (caddr p1) (car p2)) (* (car p1) (caddr p2)))
		      (- (* (car p1) (cadr p2)) (* (cadr p1) (car p2)))
		)
	   norm	(mapcar	'(lambda (x) (* x (/ 1 (distance '(0 0 0) norm))))
			norm
		)
     )
    )
  )
)


;;; UCSZDIR Returns the Normal Unit Vector of the current UCS
(defun ucszdir  ()
  (trans '(0 0 1) 1 0 T)
)


;;; ASIN Returns the arcsinus of a number in radians
(defun ASIN (num)
  (if (<= -1 num 1)
    (atan num (sqrt (- 1 (expt num 2))))
  )
)

;;;ACOS Returns the arccosinus of a number in radians
(defun ACOS (num)
  (if (<= -1 num 1)
    (atan (sqrt (- 1 (expt num 2))) num)
  )
)

;;; ANGLE_3PTS Returns the angle (in radians) defined by its summit and two points
;;; Returned angle is always positive and less than or equal to pi radians.

;; Using vector calculus
(defun angle_3pts (sum p1 p2 / v1 v2)
  (if (and
	(setq v1 (vec1 sum p1))
	(setq v2 (vec1 sum p2))
      )
    (cond
      ((equal v1 v2 1e-009) 0.0)
      ((equal v1 (mapcar '- v2) 1e-009) pi)
      (T (* 2 (asin (/ (distance v1 v2) 2))))
    )
  )
)

;; Using the "Theoreme de Carnot"
(defun angle_3pts (sum p1 p2 / d1 d2 d3)
  (setq	d1 (distance sum p1)
	d2 (distance sum p2)
	d3 (distance p1 p2)
  )
  (if (and (not (zerop d1)) (not (zerop d2))
    (ACOS (/ (+ (* d1 d1) (* d2 d2) (- (* d3 d3)))
	     (* 2 d1 d2)
	  )	
    )
  )
)
  )


;;; ELEV Returns the elevation of point pt from the plane defined by p1 p2 p3

(defun elev (pt p1 p2 p3)
  (* (cos (angle_3pts p1 (mapcar '+ p1 (norm_3pts p1 p2 p3)) pt))
     (distance p1 pt)
  )
)


;;; PROJ_PT Returns the coordinates of the projection of point pt
;;; on the plane defined by the points p1 p2 p3.

(defun proj_pt (pt p1 p2 p3)
  (mapcar '-
	  pt
	  (mapcar '(lambda (x) (* x (elev pt p1 p2 p3)))
		  (norm_3pts p1 p2 p3)
	  )
  )
)
Sleekka вне форума  
 
Непрочитано 24.11.2009, 11:50
#39
Pastor

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


Может кому пригодится.
http://www.caduser.ru/forum/index.ph...D=44&TID=41129
http://www.caduser.ru/forum/index.ph...D=44&TID=27943
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Автор темы   Непрочитано 24.11.2009, 18:11
#40
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


zamtmn,
Цитата:
...в системе координат блока угол это поворот вокруг 0,0,1, а в мировой системе системе поворот вокруг нормали блока. при переходе между системами значение угла не меняется...
А я очем?, Я о том же. Только маленькая поправка
Изменение этого параметра никоим образом не должно изменять значение нормали объекта. Куда ось Z объекта была направлена, туда и должна остаться быть направленной. А она рушиться. И точка вставки блока порою улетает. Во!

Sleekka,

Функция acet-geom-textbox написана без учета глючности Автокада. Если объект не повернут - она работает, а если повернут в двух плоскостях - рамка улетает черт знает куда (при объекте MTEXT).
Код:
[Выделить все]
(vl-load-com)
(setq modelsp (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
(setq ramka (acet-geom-textbox (entget (car (entsel))) 0))
(setq ramka (append ramka (list (car ramka))))
(setq ramka (mapcar '(lambda (a) (trans a 1 0)) ramka))
(vla-Add3DPoly modelsp (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble '(0 . 14)) (apply 'append ramka)))
Второй аргумент функции - offset контура текста в виде множителя к шрифта, которым набран текст. Если height текста = 2,5 мм, то при значении 1 второго аргумента функции, рамка будет больше на 2,5мм по контуру.

Немного размерность массива подправил.

Причем! Если объект TEXT - все тип топ. А если MTEXT - и в 2006, и в 2007, и в 2010 - рамка улетает вниз.
Уж от типа объекта все никак не должно зависить.

Еще малость изменил, чтобы рамку рисовало из любой ПСК. Надо наверное и в функцию оформить.

Sleekka, будь добр, переведи на русский язык функции и укажи значения аргументов. Я в первом посте ссылку дам. Сам я все понял, но "надо Федя, надо".

Pastor, спасибо за вклад.

Последний раз редактировалось Supermax, 24.11.2009 в 19:42.
Supermax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Тригонометрические функции и векторная алгебра

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рифмоплетство. Kryaker Разное 554 14.11.2023 11:59
Определение высот рельефа по близлежащим точкам dextron3 Программирование 21 10.11.2011 13:14
Интерполяция между двумя точками postbudka Программирование 27 21.05.2009 10:00
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46
Координаты точки, лежащей на полилинии Al_Taron Программирование 1 27.11.2006 09:45