• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Контроль векторов осей координат при поворотах деталей в сборке

Автор Vitalij Lysanov, 06.04.19, 23:22:51

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Vitalij Lysanov

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

Ниже на примере два вектора получаются одного значения и деталь превращается в прямую линию



Еще пример
https://drive.google.com/open?id=1puM9SxDXwv02DadG2iV78mxSZFUWOZtVl2Au4_mwHK8
Правый рисунок.
При повороте один из векторов получался нулевой и при повороте на 90 градусов изображение пропадало. И заметно отрезок на месте отрисовки детали.


Тема была про лестницу, там тоже детали пропадали без всяких ошибок.
Здесь тоже просто не рисует и все.

Для подтверждения ошибки при построении лестницы нужно прочитать вектора осей координат всех деталей. Гарантированно там будут ошибки в одной из деталей.
В 16 версии Компаса там где внешние переменные были еще данные про оси координат деталей, если найти деталь, там можно посмотреть эти вектора.

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

При построении из программы все можно отследить, а если из функционала Компаса, просто молча не нарисует.


Эти частные случаи желательно отслеживать до построения и зафиксировать ошибку.


Причин появления таких частных случаев много.
Во первых на лестнице поворот на 90 градусов. 90 градусов это критичная величина при поворотах и желательно ее избегать.
И сопряжений много и все пересчитывается с нуля каждый раз.

Массивы по окружности в 2D при повороте на точно 90 градусов может не нарисовать элемент массива. 



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








Программа для тренировки на векторах

import autopy
nom=111



import sys
import math
import Kompas6API5, LDefin3D, LDefin2D
Kompas, doc3d = start3d()
import Kompas10API5 as KAPI
import Kompas10API7 as KAPI7
import pythoncom
from win32com.client import Dispatch
import LDefin2D
import LDefin3D
import ksConstants as CONST2D7
import ksConstants3D as CONST3D7
import MiscellaneousHelpers as MH

iKompasObject = Dispatch('KOMPAS.Application.5')
iKompasObject = KAPI.KompasObject(iKompasObject)
MH.iKompasObject = iKompasObject

iApplication = Dispatch('KOMPAS.Application.7')
iApplication = KAPI7.IApplication(iApplication)
MH.iApplication = iApplication

iDocument3D = iKompasObject.ActiveDocument3D()

iDocument = iApplication.ActiveDocument
iKompasDocument3D = KAPI7.IKompasDocument3D(iDocument)


iDocument3D = iKompasObject.Document3D()



for masht in range(-20,1,1):

              iPart = Kompas6API5.ksPart(doc3d.GetPart(0))       
              x=0         
              y=0         
              z=0       
              x=(float(x)+masht)/1.0
              y=float(y)
              z=float(z)
              iplac = Kompas6API5.ksPlacement(iPart.GetPlacement())
              print
              print x,y,z             
              iplac.SetOrigin(x, y, z)

              xv=1
              yv=0
              zv=0

              print x++masht, y+1,     z
              print x,   y+1,   z

              iplac.SetAxis(x++masht, y+0,     z,    0)
              iplac.SetAxis(x,   y+0,   z,    1)
#              iplac.SetAxis(x,   y,    z+1, 2)

              iPart.SetPlacement(iplac)
              iPart.UpdatePlacement()
              iPart.Update()
              iPart.Update()







              iplac = Kompas6API5.ksPlacement(iPart.GetPlacement())
              xx=yy=zz=0
              print iplac.GetAxis(xx, yy, zz,0)

              xx=yy=zz=0
              print iplac.GetAxis(xx, yy, zz,1)

              xx=yy=zz=0
              print iplac.GetAxis(xx, yy, zz,2)

              nom=nom+1
              zast=autopy.bitmap.capture_screen()
              zast.save("D:/Osi/"+str(nom)+".png","png")


   


Здесь перемещается первая расфиксированная деталь и еще задаются вектора осей координат.
Если два вектора совпадают, деталь не рисуется
При ошибке вывод на консоли такой


0.0 0.0 0.0
0.0 1.0 0.0
0.0 1.0 0.0
(True, 0.0, 0.0, 0.0)
(True, 0.0, 1.0, 0.0)
(True, 0.0, 0.0, 0.0)   




Немного про вектора.


Вектор задается относительно координат x,y,z  т.е. должны быть x,y,z плюс еще вектор.

При выводе величина вектора нормируется.
На вход можно подавать любые числа.  1  1  1 и    10  10  10  это одно и тоже .Плюс еще конечно    x,y,z

Если сразу подать нулевой вектор, т.е. просто x,y,z  вместо детали получается линия и она перемещается где то на месте детали.
Если равенство векторов, деталь тоже превращается в линию только другого направления.


Задавать нужно два вектора, третий вычисляется для образования ортогональной системы координат. Это в теории. На практике как то непонятно работает.

 

bot_on_war3

Помогите кто-нибудь с LDefin2D.  Мне надо создать массив для ksTanCircleCircle, а какой? Что писать тут iDynArray = KAPI.ksDynamicArray(kompas_object.GetDynamicArray(LDefin2D.????))