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

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

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

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

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

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

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

Помогите с координатами при создании эскиза

Автор KBAC, 03.01.15, 16:04:33

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

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

KBAC

Пытаюсь реализовать следующий алгоритм:
1. Пользователь выбирает поверхность на 3Д объекте
2. Запускаем скрипт
3. Скрипт определяет, что "что-то" выбрано и что это "что-то" есть поверхность
4. Скрипт создаёт эскиз по заданной поверхности
5. Скрипт создаёт выдавливание созданного эскиза

Проблема возникла на пункте 4, а именно:
- я получаю значения типа такого iSurface.GetParamUMin() для определения границ поверхности
- иногда полученные данным методом координаты совпадают с реальными, но чаще всего нет. То ось в другую сторону отсчёт ведёт, то есть смещение по обоим осям...

Подскажите пожалуйста, можно ли как-то получить смещение координат, или как-то конвертировать или рисовать в "правильной" системе координат....

Пример 1 (нормальная работа на одной из граней)

Я получаю в скрипте следующие координаты:
V= 85   minV=-36.97   maxV=48.02
U=46   minU=-29.10   maxU=16.89

Если руками начертить диагональную линию через поверхность получаю те же самые координаты (всё нормально):


В итоге получается такая вот штука:


Пример 2 (какая-то лажа с координатами)

Я получаю в скрипте следующие координаты:
V= 80   minV=0   maxV=80
U=85   minU=0   maxU=85

А при попытке руками начертить диагональную линию через поверхность получаю следующее:


Конечно же нормально оно не отрисуется:


Ниже привожу сам скрипт на python:

# -*- coding: cp1251 -*-

import Kompas10API5 as KAPI
import pythoncom
from win32com.client import Dispatch
import LDefin3D

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

def Main():
   
    SlcMan = iDocument3D.GetSelectionMng()
    if SlcMan.GetCount() == 0:
        iKompasObject.ksError('Nothing selected')
        return
    if SlcMan.GetCount() > 1:
        iKompasObject.ksError('More than one element selected')
        return
   
    Element = SlcMan.GetObjectByIndex(0)
    if Element.type != 6:
        iKompasObject.ksError('Selected element is not surface')
        return
    iPart = Element.GetParent()
    iSketch = iPart.NewEntity(LDefin3D.o3d_sketch)
    iDefinition = iSketch.GetDefinition()
    iPlane = Element
    iDefinition.SetPlane(iPlane)
    iKompasDocument3D.CreateObjectsInCurrentLocalCS = True
    iSketch.Create()
    iSurface = iDefinition.GetSurface()
    minU = iSurface.GetParamUMin()
    minV = iSurface.GetParamVMin()
    maxU = iSurface.GetParamUMax()
    maxV = iSurface.GetParamVMax()
    U = maxU - minU
    V = maxV - minV
    dlina = 10
    # iKompasObject.ksMessage( 'V: ' + str(maxV-minV) +' '+str(minV)+' '+str(maxV)+ '\r\n'+
    #                         'U: ' +str(maxU-minU) +' '+str(minU)+' '+str(maxU) )
    iDocument2D = iDefinition.BeginEdit()
    obj = iDocument2D.ksLineSeg(minU, (V+dlina)/2+minV, maxU, (V+dlina)/2+minV, 1)
    obj = iDocument2D.ksLineSeg(minU, (V-dlina)/2+minV, maxU, (V-dlina)/2+minV, 1)
    obj = iDocument2D.ksLineSeg(minU, (V+dlina)/2+minV, minU, (V-dlina)/2+minV, 1)
    obj = iDocument2D.ksLineSeg(maxU, (V+dlina)/2+minV, maxU, (V-dlina)/2+minV, 1)
    iDefinition.EndEdit()
    # iKompasObject.ksMessage('Added "'+iSketch.name+'" to "'+iPart.name+'"')
    obj = iPart.NewEntity(LDefin3D.o3d_bossExtrusion)
    iDefinition2 = obj.GetDefinition()
    iDefinition2.SetSketch(iSketch)

    iExtrusionParam = iDefinition2.ExtrusionParam()
    iExtrusionParam.depthNormal = 30.0
    iExtrusionParam.direction = LDefin3D.dtNormal
    obj.Create()
   
    iDocument3D.RebuildDocument()
    # iKompasObject.ksMessage('OK !')
   
if __name__ == "__main__":
    Main()

Координаты U и V - это не X и Y в эскизе, это координаты на поверхности в параметрическом виде.
Можете получить для Вашей прямоугольной поверхности координаты в пространстве используя метод iSurface.GetPoint.

KBAC

03.01.15, 20:04:58 #2 Последнее редактирование: 03.01.15, 20:26:13 от KBAC
Не совсем понял как этим пользоваться...

Возьмём пример 2 из первого поста.

Я получаю в скрипте следующие координаты:
V= 80   minV=0   maxV=80
U=85   minU=0   maxU=85

А при попытке руками начертить диагональную линию через поверхность получаю следующее:



Далее по Вашему совету я запрашиваю реальные 3Д координаты для точки U=0 V=0

    iSurface = iDefinition.GetSurface()
    SurfaceParam = iSurface.GetSurfaceParam()
    iPlacement = SurfaceParam.GetPlacement()
    real_point = iSurface.GetPoint(0,0,0,0,0)
    iKompasObject.ksMessage( real_point[1] )
    iKompasObject.ksMessage( real_point[2] )
    iKompasObject.ksMessage( real_point[3] )


Получаю на выходе:
X=16.89  Y=-50  Z=36.97

Только я вот не пойму что с этими цифрами дальше делать...
1. Точка с координатами U=0 V=0 это какая ? Это какой-то из углов моего прямоугольника ?
2. В мини-скриншотах представлены координаты всех четырёх углов и я не смог сопоставить одно с другим...
Одна из точек вроде по цифрам подходит, но у меня приползло -50 (с минусом), а точка имеет плюсовые координаты...

03.01.15, 20:27:26 #3 Последнее редактирование: 03.01.15, 20:43:20 от Sabahs
Получите все четыре угла 
iSurface.GetPoint(minU,minV,X1,Y1,Z1)
iSurface.GetPoint(minU,maxV,X2,Y2,Z2)
iSurface.GetPoint(maxU,minV,X3,Y3,Z3)
iSurface.GetPoint(maxU,maxV,X4,Y4,Z4)
Судя по рисунку U=0 V=0 это правый верхний угол с координатами в эскизе X=36.97  Y=50.
Ось X эскиза совпадает по направлению с глобальной осью Z, Y с глобальной осью Y, но не совпадает по направлению поэтому знак с минусом.

KBAC

С этим ясно, неясен дальнейший алгоритм действий...
У меня стоит задача чертить на эскизе (2Д документе), используя двухмерную систему координат.
Мне известны "габариты" поверхности и координаты того, что я хочу начертить в системе U+V.

Предположим, что я получил реальные координаты в 3Д для всех вершин, а как дальше-то действовать ?
Подскажите пожалуйста примерный алгоритм

Можно попробовать в эскизе создать матрицу преобразования координат ksMtr, но в любом случае придётся анализировать взаимное расположение.

KBAC

Мне удалось добиться требуемого эффекта для одной конкретной поверхности.

    iDocument2D.ksMtr(36.97,-(-50),180,1,1)
    obj = iDocument2D.ksLineSeg(minU, (V+dlina)/2+minV, maxU, (V+dlina)/2+minV, 1)
    obj = iDocument2D.ksLineSeg(minU, (V-dlina)/2+minV, maxU, (V-dlina)/2+minV, 1)
    obj = iDocument2D.ksLineSeg(minU, (V+dlina)/2+minV, minU, (V-dlina)/2+minV, 1)
    obj = iDocument2D.ksLineSeg(maxU, (V+dlina)/2+minV, maxU, (V-dlina)/2+minV, 1)
    iDocument2D.ksDeleteMtr()


Осталось понять какие именно данные надо подставлять в ksMtr.
Прошу помощи в написании алгоритма по вычислению смещения системы координат и угла поворота.