Сборки по ЛСК

Автор Vitalij Lysanov, 06.07.21, 23:27:59

« предыдущая - следующая »

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

Vitalij Lysanov




Сборки по ЛСК

Когда работает рассматриваемая система, нисколько не приходится заботиться о сборке, все само соединяется. Важен только перечень деталей в цепочке и порядок деталей. В детали должна быть одна входная ЛСК и одна выходная ЛСК.

Программа может быть одна, всегда можно договориться и выделить одну входную и одну выходную ЛСК.  Это может быть специальный символ. Нет символа, считай программа не работает. Есть спецсимвол, соединится с предыдущей деталью и выставит ЛСК для следующей детали.


Например, шайбы с точки зрения информации все одинаковые, есть входная ЛСК и выходная ЛСК. Допустим ставим шайбу в два раза толще, просто записываем новую шайбу в последовательность построения - и все. 

Сейчас все фиксировано, сопряжение берется по ЛСК которые прочитаны по индексу в дереве построения. ЛСК могут иметь имена и возможны любые выборки, это текст. 


Начало новой цепочки можно отметить пробелом в тексте, это найдет ЛСК и будет последовательно соединять все что записано по списку.

Перечень установленных деталей можно преобразовать в спецификацию, подсчитать одинаковые детали -- это не проблема.

 
 



Вектора, трубы, фланцы


Есть система, стоит кинематикой трубу по ломанной из двух отрезков и окружности. Может это уже делает САПР, подробности неизвестны. 
На краях стоят ЛСК, причем одну ЛСК можем поворачивать на нужный угол, это может быть угол между отверстиями на фланцах, и как раз для примера будем заниматься фланцами.
Для построения трубы по ломанной линии достаточно трех точек, первая это нули. Ордината второй тоже ноль. И еще задаем угол поворота ЛСК.



  

Рис        Загружено 10 одинаковых труб.

Загружено 10 раз оператором:
    iii.append(pos(t1,     t2,      t3,       90))
где:
t1,     t2,      t3 - точки

 
t1=np.array([0,0])
t2=np.array([201,0])
t3=np.array([211,68])
90  - угол поворота ЛСК


Сейчас добавим произвольную трубу:
t1=np.array([0,0])
t2=np.array([400,0])
t3=np.array([468,186])
iii.append(pos(t1,     t2,      t3,       90))
 




Рис    Добавили произвольную деталь

Теперь добавим эту же деталь, повернутую на 180 градусов, оператором:
 iii.append(pos(t1,     t2,      t3,       90+180))



Рис     Вставили деталь, повернутую на 180 градусов

Тут просится текст.
А теперь соберем все вместе, нормальную и повернутую. Это пропустил, ниже есть вместе, только трубы другие.  




Рис       Деталь.     Видно две ЛСК

Кинематика требует начало траектории в плоскости окружности.
Чтобы вырезать фланец, на краях есть отдельные участки с длиной, равной толщине фланца.
Теперь вырезаем по траектории, без дальнего участка, получим фланец.




Рис      Трубы с одним фланцем

Соответственно теперь добавляем кинематику на начальном участке, с длиной, равной толщине фланца.

 

Рис       Трубы с двумя фланцами




Рис      Вставили 10, потом длинную деталь, потом снова 10, потом длинную деталь. 

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




Рис      Вставили две почти одинаковые сборки, в одной поворот на 180 градусов.



Рис      Три набора из труб. Крайние участки повернуты на 120 и 240 градусов.


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

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


# -*- coding: utf-8 -*-
#|sbbbbbbb

import pythoncom
from win32com.client import Dispatch, gencache

import LDefin2D
import MiscellaneousHelpers as MH

#  Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants

#  Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))
MH.iKompasObject  = kompas_object

#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))
MH.iApplication  = application


Documents = application.Documents
#  Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iDocument3D = kompas_object.ActiveDocument3D()

import pythoncom
from win32com.client import Dispatch, gencache

    #Получить интерфейсы API 7 КОМПАС
def get_kompas_api7():
            module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
            api = module.IKompasAPIObject(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch))
            const = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0)
            return module, api, const.constants


module_7, api_7, const_7 = get_kompas_api7()
app = api_7.Application
doc = module_7.IKompasDocument3D(app.ActiveDocument) #Активная сборка
topPart = doc.TopPart
parts = topPart.Parts

ko=parts.Count



for nom in range(ko):

        iPart1 = iDocument3D.GetPart(nom)


        iplac1 = iPart1.GetPlacement()

        x=y=z=0
        ok,x,y,z = iplac1.GetOrigin(x, y, z)
        print (nom+1,"\t\t",x,"\t\t",y,"\t\t",z)


        xk=x
        yk=y
        zk=z





        ok,x,y,z=iplac1.GetAxis(x, y, z,0)
        print
        print (ok,x-xk,y-yk,z-zk)


        ok,x,y,z=iplac1.GetAxis(x, y, z,1)
        print (ok,x-xk,y-yk,z-zk)

        ok,x,y,z=iplac1.GetAxis(x, y, z,2)
        print (ok,x-xk,y-yk,z-zk)
        print("_______")
        print("")
        print("")



print("__________________")


for nn in range(1,ko+1,1):
    iPart1 = iDocument3D.GetPart(-1)


    iplac1 = iPart1.GetPlacement()
    dd=iPart1.GetFeature()
    iFeatureCollection = dd.SubFeatureCollection(False, False)
    iFeature = iFeatureCollection.GetByIndex(nn)

    ils1=iFeature.GetObject()
    print (nn,ils1.name)</source>

Это просто показывает координаты, можно смотреть есть ли очень большие цифры, когда все исчезнет с экрана Компаса.
Оси тоже показывает. 
Что бывает, если оси нулевые? 
Тоже есть текст:
https://docs.google.com/document/d/1rjQyS7nj60jKDtY2St0q5bcv4wSwMO-csMQJkD8Skbw/edit?usp=sharing

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


Если дойдет до векторов, есть подробней про вектора:

 https://docs.google.com/document/d/1puM9SxDXwv02DadG2iV78mxSZFUWOZtVl2Au4_mwHK8/edit?usp=sharing

Дальше можно трассу разбить на участки по три точки.
И все еще проверять нужно на реальных данных. 
Например, ломаная для траектории должна быть с углом больше 90 градусов, иначе уже выяснил, в программе, нужно знак менять. Бывают трубы и с острым углом в образующей.
Если два участка трубы расположены на одной прямой, угол равен нулю, или 180 градусов, тоже не считает, это преобразование координат не работает, помогает в пятом знаке цифру поставить. 

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



Для иллюстрации возможностей Сопряжения Совпадения ЛСК и векторов, это текст годится.
Еще, как выяснили, текст годится для иллюстрации сборки по ЛСК