Макропараметризация

Автор Vitalij Lysanov, 27.01.20, 03:01:23

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

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

IgorT

Цитата: p3452 от 29.01.20, 16:33:08Не надо ругать программу, которую вы, очевидно, не знаете...
Простой пример - на форуме есть пару тем по КМД, ознакомитесь, а потом погуглите словосочетание "Advance Steel"(на сегодняшний день, это то же AutoCAD).
Нет "продвинутыми" становятся после многократного общения с СТП конкретного CAD...

Мы ушли с темы поста и скатились до флуда из-за этого:
Предлагаю продолжить по теме или не продолжать вообще!
Это где я ругал AutoCAD? Это Вам голоса в Вашей голове сказали? Мои слова покажите, иначе клевета!
Далее: "Advance Steel" нацелен на строительство. Мы тут как бы по теме машиностроения трындим. Не?
Продолжим. Где "Advance Steel" призывает и обязывает пользователя к программированию в решении его, пользователя,  задач? Наоборот. Пользователю предлагаются готовые инструменты для его продуктивной работы. Может быть я чего-то не понял? Покажите где обсуждаемое приложение предлагает пользователю заняться кодингом.

На счет знания AutoCAD... А какие у Вас критерии знает/не знает Ваш собеседник сей продукт?
О себе. Работал с Автокадом с 1989 по 2012 годы. Знаю его изнутри. Владею AutoLISP/VBA. Мною сделано великое множество программ, решающих очень широкий круг прикладных задач.
Но! После освоения AI, SW и К работы с  Автокадом по теме машиностроения прекратил. Ибо бессмысленно.
Но Автокад от этого не потерял своей актуальности. Без работы он не останется.

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

Vitalij Lysanov

Кстати, в соседней теме бак параметрический:
https://forum.ascon.ru/index.php?topic=34212.msg271178;topicseen#msg271178
Так полностью и не освоил, непривычные ссылки. Все по размерам, а затем еще и сопряжения включать.

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

Никто в полном объеме программировать не будет, а записать входные данные в формате, доступном программе, это и в школьной геометрии учат.
Программистов, ищущих работу, сейчас очень много. Озадачить их только нужно.

Можно и в графике эти отрезки нарисовать, прочитать, все равно в архив нужно сдавать в цифрах, это надежней и занимает мало места.

Нарисовал текст данных и забыл, остальное можно требовать от программиста. Точки в любом случае нужно посчитать, а как задать отрезки по точкам, тут могут быть и более удобные варианты.

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

Главное - это отрезки с координатами точек сдавать в архив. И рядом, программа работы с этими данными. Включил и получили модели деталей и модель сборки. (До чертежей еще не добались)
Вообще то этот комплект - библиотека называется, данные и программа.


И снова повторюсь, ничего не нужно параметризировать. Взяли из архива, нарисовали, изготовили, можно модели удалять. И все за один килобайт.
И что рисовать, все на ЧПУ скоро пойдет. Сразу из архива на ЧПУ.
Естественный вопрос, а где Нормоконтроль? 

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

t1    - Патрубок нижний
t2   - Пояс
tol  - Толщина

Комплексное число для координат можно задать в такой форме:

complex(-300,0)

А можно задать в другой форме:

rect(длина,угол)

Эта форма задания хорошо подошла для наклонного отрезка.
Для однообразия можно и все точки так задать.

    t1=complex(-300,0)
    t2=complex(-300,100)
    pr4(t2,t1,tol)


    t3=t2-tol
    t4=t3-100
    pr4(t4,t3,tol)



    120 - длина, u - угол в радианах, можно и в градусах задать, это все пересчитает.   
    t5=t4+cmath.rect(120,(math.pi-u))
    pr4(t5,t4,tol)


    t6=t5+p1*1j
    pr4(t6,t5,tol)


    t7=t6-tol
    t8=t7+230
    pr4(t8,t7,tol)


    t9=t8+tol
    t10=t9+100*1j
    pr4(t10,t9,tol)


    t11=t10-tol
    t12=t11-p1
    pr4(t12,t11,tol)






Данные в понятном виде это еще хорошо в каком плане.
Если что не так, сразу видно.
И программа тоже на стандартном языке.

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




СВ

 Виталий, неужели Вы это серьёзно? "Спрограммировать" модель, из неё чертежи сборки и деталей, размеры, обозначения позиций, точностей, шероховатостей, тексты и пр. "Спрограммировать" спецификацию. И всё это быстрее, чем в Компасе? И любую другую работу, редуктор, скажем, тоже быстрее?
 А программистов озадачить - это как, пять-десять минут и готово? И в сумме: конструкторская разработка, озадачивание программиста и его работа - быстрее?

Vitalij Lysanov

Для начала давайте хотя бы с баком разберемся.

Задали 12 точек, провели отрезки.
Программа, которая строит модель уже есть, и приведена выше.

Должен быть типовой документ на аналогичные конструкции.

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

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

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

Задали размеры точек, получили результат в кодах станка, еще и по листам раскроили.
Снова вопрос, что Нормоконтролю проверять. Только типовой документ.


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

Идем дальше.
Тут появляется еще более страшное слово чем слово код, это слово -- база данных.
А раз база, это уже и BIM. (Узнал для себя новое слово, и на это слово вроде идет хорошее финансирование.)

В базе отрезки превращаются в четыре колонки цифр, и еще немного колонок для однозначной идентификации. Это 12 строк (записей) в базе.


Чем-то хорошим нужно завершить.

Был вопрос, что быстрее. Выпускать документацию или озадачивать программиста?
Хорошая программа пишется один раз, а затем только вызывается для работы
https://drive.google.com/open?id=0B63y14wkcLqgNlVMZ0w4R0o0RVE




СВ

Ну так Вы рассматриваете самый примитивный вариант, причём чисто умозрительно, без реальной проверки. Точно такие умозрительные рассуждения  постоянно присутствуют у многих изобретателей, типа: добавим "пару железок" к мотору, экономичность повысится за счёт того и того, но при этом знают, что от "пары железок" в другом месте станет похуже, и весь вопрос как раз В РАСЧЁТЕ - прибавка в одном больше или меньше, чем "убавка" в другом? Допускаю даже, что для примитивной работы будет выигрыш. Точно так  и карандашом пару линий начертить быстрее, чем на компьютере. Но чем сложнее работа, тем очевиднее, что компьютер начинает выигрывать. А рассматривать нужно не частный случай, но ЛЮБУЮ работу. Универсальный КАД. Вы, получается, предлагаете свой КАД?

Vitalij Lysanov

Это все Компас.

Точнее вариант стыковки Kompas and BIM. BIM желательно произносить чаще,  и будет счастье...

Раньше это называлось "Раскрытие заказов", только добавили информацию о примитивах каждого изделия.


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

В подтверждение есть код, который выполнит те же построения в любое время и на любых входных данных.
 

Что проверять - Компас,

как Компас модели строит,

как длину окружности рассчитать для развертки,

или развертку конуса без конуса?






 

СВ

 Понимаю!
Это, примерно, как разговаривать со слесарем-ремонтником о машине: ты говоришь как на ней ездить, а его интересует только как разобрать/собрать.
Вы программист, значит - как бы чего написать программное...

Николай

IgorT, Вот вы работали в AutoLISP/VBA. Есть ли какое-то сравнение с теми способами создания прикладных программ, которые предлагают использовать с Компасом?

IgorT

Цитата: Николай от 30.01.20, 12:06:51IgorT, Вот вы работали в AutoLISP/VBA. Есть ли какое-то сравнение с теми способами создания прикладных программ, которые предлагают использовать с Компасом?
Это две большие разницы. ИМХО главная сложность программирования под Компас заключается в использовании АПИ. SDK Компаса надо знать, это сложно, требует много времени, сил и таланта. Это не каждый может.
Работа с AutoLISP это не работа, а развлечение. Достаточно прочитать Руководство по нему. Там всё есть, ясно и понятно. На VBA я только диалоги делал, с АПИ Автокада не работал.

IgorT

Цитата: СВ от 30.01.20, 11:55:56Понимаю!
Это, примерно, как разговаривать со слесарем-ремонтником о машине: ты говоришь как на ней ездить, а его интересует только как разобрать/собрать.
Вы программист, значит - как бы чего написать программное...
Мне не очень понятно, как работая по системе Виталия найти некоторые точки? На пример надо попасть отрезком в точку пресечения двух окружностей? Графически это легко, а математикой придётся каждый раз вычисления вычислять? ЗдОрово!

Vitalij Lysanov

Пересечение двух окружностей, может есть какие особенности, есть готовое, пересечение окружности и прямой:
def пересечение(okr, prjm):
    m=[]
    iDynamicArray = module_5.ksDynamicArray( iKompasObject.GetDynamicArray( 2 ) )  # Создать интерфейс динамического массива математических точек
    iMathPointParam = module_5.ksMathPointParam(iKompasObject.GetParamStruct(const_7.ko_MathPointParam))
    iMathematic2D = module_5.ksMathematic2D( iKompasObject.GetMathematic2D() )

    iMathematic2D.ksIntersectCurvCurv( okr, prjm, iDynamicArray )

    for i in range(0, iDynamicArray.ksGetArrayCount()):       # Выдать параметры точек в присланном массиве
        iDynamicArray.ksGetArrayItem( i, iMathPointParam )      # Параметры текущей точки
        #точка( iMathPointParam.x+ iMathPointParam.y*1j, 2)        # Нарисовать точку в документе
        m.append(iMathPointParam.x+ iMathPointParam.y*1j)
        iDynamicArray.ksDeleteArray ()                # Удаление массива

    return m


Окружностям нужно дать имена передать в функцию.
Вернет координаты точки пересечения.

Я тоже это все не сам придумал, а срисовал.


if example in (2,0):        # пересечь кривые
    iDynamicArray = Kompas6API5.ksDynamicArray( Kompas.GetDynamicArray( LDefin2D.POINT_ARR ) )  # Создать интерфейс динамического массива математических точек
    iMathPointParam = Kompas6API5.ksMathPointParam(Kompas.GetParamStruct(LDefin2D.ko_MathPointParam))
    doc2d.ksBezier ( 0, 0 )                       # Создание кривой Безье
    doc2d.ksPoint ( 20, 0, 0 )                  # Точки входящие в кривую Безье
    doc2d.ksPoint ( 10, 20, 0 )
    doc2d.ksPoint ( 20, 40, 0 )
    doc2d.ksPoint ( 30, 20, 0 )
    doc2d.ksPoint ( 20, 0, 0 )
    pp1 = doc2d.ksEndObj()      # Функция EndObj возвращает указатель на созданный объект кривой Безье

    doc2d.ksBezier ( 0, 0 )                     # Создание кривой Безье
    doc2d.ksPoint ( 0, 20, 0 )                  # Точки входящие в кривую Безье
    doc2d.ksPoint ( 20, 10, 0 )
    doc2d.ksPoint ( 40, 20, 0 )
    doc2d.ksPoint ( 20, 30, 0 )
    doc2d.ksPoint ( 0, 20, 0 )
    pp2 = doc2d.ksEndObj()

    # Пересечение 2-х кривых, могут быть геометрические объекты: отрезки,
    # окружности, дуги, эллипсы, кривые, контуры, эквидистанты, макробъекты
    iMathematic2D.ksIntersectCurvCurv( pp1, pp2, iDynamicArray )

    # Отрисовка точек пересечения
    for i in range(0, iDynamicArray.ksGetArrayCount()):
        iDynamicArray.ksGetArrayItem( i, iMathPointParam )
        doc2d.ksPoint( iMathPointParam.x, iMathPointParam.y, 5 )
        Kompas.ksMessage( "x = " + str(iMathPointParam.x) + " y = " + str(iMathPointParam.y) )
    iDynamicArray.ksDeleteArray ()                # Удаление массива

Это из библиотеки Pik10
https://drive.google.com/open?id=1dzD6-FzOvDpUrtvfbV2ANnXY7KImlLzH

Тут еще немного информации:
https://drive.google.com/open?id=1puM9SxDXwv02DadG2iV78mxSZFUWOZtVl2Au4_mwHK8
 
___

Относительно того чтобы только бы программировать.
Просто ничего лучшего?
А задача одна - изготовление и выпуск документации

   

СВ

 С ходу видно, что это очень быстро. Быстрее чем моргнуть...

Vitalij Lysanov







Макропараметризация

Есть небольшой эскиз детали:

Будем пробовать, чтобы все перестраивалось с переменных.

Для начала получим координаты точек отрезков. 
Для этого есть функция, поэтому: 
 d1=np.array(поиск_отрезков())

Например, d1[0]=
array([  1        ,   1   ,  84.18229088+201.62678833j,  84.18229088+175.62678833j,   1     ])

d1[0,2]=(84.182290884518622+201.62678832656047j)
d1[0,3]=(84.182290884518622+175.62678832656047j)
это координаты точек отрезка.

Единица справа, это тип отрезка, будем по типу, равному "3", выбирать ось из массива.
Сразу и выберем:
d1[d1[:,4]==3]
array([[   1  ,  47,  98.18229088+188.62678833j,  155.18229088+188.62678833j,  3      ]])
Это координаты осевой линии, 47 просто порядковый номер в массиве.

Для начала нужно получить все точки отрезков, и без повторов.
Тут дальше циклом, нужны вообще матричные операторы:
    for i in range(len(d1)):
        for j in range(len(d4)):
            if i!=j:
                if(d1[i,3].real==d1[j,3].real):
           #         точка(d1[i,3],0)
           #         точка(d1[j,3],2)
                    n=n+1
                    m.append(d1[i,3])
                    m.append(d1[j,3])
 
Тут нужно перебрать все сочетания.
А зачем их по парам перебирать, никто не знает?
Ладно, перебрали и хорошо.
Для проверки можно подсветить точки, которые выбрали, это нужно включить:
         точка(d1[j,3],2)   
В функцию передается координата и тип точки.

Дальше выбираем только уникальные координаты, и это уже будут все точки чертежа.
       mu=np.unique(m)

Для тренировки, выберем точки, которые выше оси: 
    os=d2[d2[:,6]==3]это получим вывод оси в таком же формате, как и формат отрезков

    print (os[0,5])Это выведется "y" оси


    mu05=mu[mu.imag>os[0,5]]
    for tm in mu05:
        точка(tm,0)
Это нарисуется верхняя половина точек.



Теперь нужно записать координаты отрезков в формате последовательностей точек.
Координаты отрезков есть, координаты точек есть, сравниваем и присваиваем номера из массива уникальных точек.
    li=[]
    for n in range(len(d1)):
            for nsp in range(len(mu)):
               if d1[n,2]==mu[nsp]:
                  li.append(nsp)

         for nsp in range(len(mu)):
            if d1[n,3]==mu[nsp]:
                li.append(nsp)

                li.append("\n")

Для каждого отрезка получим два порядковых номера.
А сами координаты в массиве.

Это мы уже получили полный чертеж в формате базы данных.
Есть координаты точек, и для каждого отрезка известно, какие точки нужно взять.
     for n in range(0,int (len(li)),3):
        print(n,li[n],li[n+1])
        отрезок(   mu[li[n]]+150*1j,     mu[li[n+1]]+150*1j)
Выше, это осматриваем массив отрезков "LI".
По значение "LI" находим координату из массива уникальных и строим отрезки на 150 выше чертежа детали.


На основном чертеже видно половину точек, выше построенная копия, а еще выше чертеж с коррекцией по параметрам. 
Еще слабо видны имена точек, сейчас рассмотрим подробней:

Точки t8, t9, t10, t11 будем сдвигать вправо на 2.
    mu[8]=mu[8]+2
    mu[9]=mu[9]+2
    mu[10]=mu[10]+2
    mu[11]=mu[11]+2
Тут вообще то нужно провести линии уровня, и тогда пришлось бы изменять только одну цифру.

    for n in range(0,int (len(li)),3):
        print(n,li[n],li[n+1])
        отрезок(   mu[li[n]]+200*1j,     mu[li[n+1]]+200*1j)
Это уже нарисовали деталь с измененным размером.


И немного размеров на чертеже:
    Размер  (mu[23],mu[25])
    Размер_m(mu[3],mu[7],7)
    Размер_m(mu[43],mu[45],-9)
    Размер(mu[1],mu[45])

Размеры "28", "78,45" выведены одной функцией, подъем размера зависит от величины размера.
Для размеров "5,5", "7", пришлось задавать смешение.





https://drive.google.com/open?id=1_d8m2KSbbpoz_svyNsaQ8FPVi6YVQUlK



 







           

Vitalij Lysanov


В программе поставили линии уровня, теперь нужно изменить только одно значение.
Для примера, справа немного подвинули:   





https://drive.google.com/open?id=1wIak6s21yHRlyWts3KU5uvacBQAHX8kE




           

Vitalij Lysanov

13.02.20, 21:02:01 #34 Последнее редактирование: 14.02.20, 01:16:08 от Vitalij Lysanov
Продолжение построений:

https://drive.google.com/open?id=1iuTnYRsx39tlmKZr-HVrVvfldg0UmjkT

Это файл DXF, исходные данные и результаты работы программы.

В программе построения выполняет функция.
    po(d21,440,12)

Входные параметры:
d21 - входные данные
440 - смещение построений по вертикали
12  - это считаются размеры детали и добавляется 12 для получения высоты горизонтальной размерной линии.

В данных три типа линий (1,7,9), по типам линий проводим разделение на составляющие.

Перед передачей в функцию массив данных фильтруется по типам линий и получаем три различных составляющих.



    po(d2,560,12)

    d21=d2[d2[:,6]==1]
    po(d21,440,12)


    d22=d2[d2[:,6]==7]
    po(d22,320,10)


    d23=d2[d2[:,6]==9]
    po(d23,200,8)





Разделение на составляющие можно будет производить по новым типам линий и по цвету заливки контуров.




Код, отвечающий за построения:


def po_masivy(xx,smesh_y=0):
                                            #    t1=complex( xx[0],         osy+smesh_y+200)
                                            #    t2=complex( xx[-1],        osy+smesh_y+200)


                                            #    t1=complex( xx[0],         smesh_y+sm_vida)
                                            #    t2=complex( xx[-1],        smesh_y+sm_vida)
    t1=complex( xx[0],         smesh_y)
    t2=complex( xx[-1],        smesh_y)



    отрезок3(t1,t2,0)

                                                #def po1(  d2,    sm_vida,    zazor_r):
                                            #    print(d2[0],sm_vida,    zazor_r)
                                            #    pass













def po(  d2,    sm_vida,    zazor_r):


    xx=[]
    yy=[]

    print (sm_vida)
    xx=(np.hstack((d2[:,2], d2[:,4])))
    xx=0.1*np.int_(xx*10)
    xx=np.unique(xx)
    print (xx)

    yy=(np.hstack((d2[:,3], d2[:,5])))
    yy=0.1*np.int_(yy*10)
    yy=np.unique(yy)










#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

#11111111111111111111111111111111111111111111111111111111111
    if sm_vida==200:
        pass
   #     xx[0]=xx[0]-3
      #  xx[14]=xx[14]+0.6
      #  xx[13]=xx[13]+4.6
    #    xx[4]=xx[4]+1.4



#        yy[0]=yy[0]-2
      #  yy[5]=yy[5]+2

    if sm_vida==320:
        pass
#        xx[0]=xx[0]-3
      #  xx[14]=xx[14]+0.6
      #  xx[13]=xx[13]+4.6
      #  xx[4]=xx[4]+1.4
      #  xx[9]=xx[9]+5
      #  xx[10]=xx[10]-5



#        yy[0]=yy[0]-2
       # yy[5]=yy[5]+2


    if sm_vida==440:
        pass
#        xx[0]=xx[0]-3
#        xx[14]=xx[14]+0.6
#        xx[13]=xx[13]+4.6
#        xx[4]=xx[4]+1.4
#        xx[9]=xx[9]+7
#        xx[10]=xx[10]-7



#        yy[0]=yy[0]-2
#        yy[5]=yy[5]+2


    if sm_vida==560:
       pass
#        xx[0]=xx[0]-3
#        xx[14]=xx[14]+0.6
#        xx[13]=xx[13]+4.6
#        xx[4]=xx[4]+1.4
#        xx[9]=xx[9]+7
#        xx[10]=xx[10]-7



#        yy[0]=yy[0]-2
#        yy[5]=yy[5]+2





#11111111111111111111111111111111111111111111111111111111111









#zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz























    li=[]

    for n in range(len(d2)):

        for nsp in range(len(xx)):
            if d2[n,2]==xx[nsp]:
                li.append(nsp)

        for nsp in range(len(yy)):
            if d2[n,3]==yy[nsp]:
                li.append(nsp)


        for nsp in range(len(xx)):
            if d2[n,4]==xx[nsp]:
                li.append(nsp)

        for nsp in range(len(yy)):
            if d2[n,5]==yy[nsp]:
                li.append(nsp)





        li.append("\n")

#    print(li)





                                          #  dy=osy-min(yy)
    yy_min=min(yy)
    yy_max=max(yy)

                                        #    dy1=osy-min(yy)
                                            #    print ("dy,dy1=",dy,dy1)

    nnn=0
    for xxr in xx:


                                                        #  t1=complex(  xxr,   osy+sm_vida)
                                                        #        t2=complex(  xxr,   osy-dy-20+200)
        t1=complex(  xxr,   yy_min-zazor_r+sm_vida)
                                                        # отрезок3(t1,t2,0)
                                                        #       точка(t2+1*1j+zazor_r*1j,0)
        точка(t1+1*1j,           0)
        текст_sh(
                 t1-2*1j,
                 str(xxr-xx[0]),
                 H=1.2)

                                                            #     t1=complex(xxr,osy+200)
                                                        #        t2=complex(xxr,osy+dy+20+200)
        t2=complex(  xxr,   yy_max+zazor_r+sm_vida)
        отрезок3(t1,       t2+zazor_r*1j,        0)
        точка   (t2-1*1j+zazor_r*1j,       0)
        точка   (t2-1*1j,                  0)


                                                        #  точка(  t2-1*1j-5*1j,  0)

        текст_sh(
                  t2+2*1j+zazor_r*1j,
                  str(-xxr+xx[-1]),
                  H=1.2)


        if nnn<len(xx)-1:
            delt=xx[nnn+1]-xx[nnn]
            sm=0
            if delt>3.0:
                sm=delt*0.35
            текст_ш_гор(
                        t2+sm+0.1   ,
                        tekst=str(delt),
                        H=1.2)

        nnn=nnn+1



    po_masivy(  xx,     smesh_y=  yy_max +2*zazor_r-1   +sm_vida)
    po_masivy(  xx,     smesh_y=  yy_min -zazor_r+1     +sm_vida)
    po_masivy(  xx,     smesh_y=  yy_max +zazor_r-1     +sm_vida)



    for n in range(0,int (len(li)),5):
        t1=complex(  xx[li[n+0]],  yy[li[n+1]]+sm_vida)
        t2=complex(  xx[li[n+2]],  yy[li[n+3]]+sm_vida)
        отрезок( t1,t2)






















if __name__ == "__main__":

    import numpy as np
    текущий_фрагмент()


    sm_vida=200

    zazor_r=9

    d1=np.array(поиск_отрезков())
    d2=np.array(поиск_отрезков_np())
    d3=np.array(поиск_отрезков_())
    d4=np.array(поиск_отрезков_мас())





                                         #   d2=0.1*np.int_(d2*10)
    d2=0.1*np.floor(d2*10)

                        #  os=d2[d2[:,6]==3]
                        #  osy=os[0][5]


    d2=d2[d2[:,6]!=3]

    d2=d2[  d2[:,3] < 300 ]
    d2=d2[  d2[:,5] < 300 ]



    po(d2,560,12)

    d21=d2[d2[:,6]==1]
    po(d21,440,12)


    d22=d2[d2[:,6]==7]
    po(d22,320,10)


    d23=d2[d2[:,6]==9]
    po(d23,200,8)








Полный код:
https://drive.google.com/open?id=1GiG9rVA-3WmW1Dr_iNBwGjGWaMORhqVf

На dxf другие исходные типы линий, нужны основные, утолщенные и штриховая.



____

Желательно периодически дублировать, зачем это нужно?

 - Это для эскиза с параметрами.

 - Каждая линия уровня имеет цифровое значение, можно назначить новое значение, а можно просто прибавить к имеющемуся значению.

- Отрезок задается ссылкой на эти линии уровня.

- Данные координат и данные отрезков это можно запомнить в базе данных и все это занимает мало места. И в любой момент все это можно восстановить. Это все может легко храниться в архиве.

- Несколько объектов разного цвета это связанные эскизы. Линия уровня у них может быть одна и соответственно две детали перестроятся от одного изменения линии уровня.
   
- Формулами можно связать значения линий уровня. И конечно глобальные переменные по всему проекту, это само собой.

- Картинка уже напоминает чертеж и эскиз может играть роль чертежа.


Vitalij Lysanov

   
   
   
   
                      Немного про базы и BIM


   
   
BIM предлагает рассмотреть изделие в течении всего жизненного цикла и найти оптимальное сочетание характеристик изделия.   
   
Из общих характеристик вспоминается только стандартный размер татами в Японии. По этому размеру получался стандартный ряд бруса для дома и т.д.   
Если на полу паркет, плитка или линолеум, то тоже может быть оптимальный размер комнаты. Чтобы ничего не резать.    
Но это в общем, а для частностей нужно полное управление изделием, чтобы изменять и смотреть на результат.   
   
Базы данных как раз и решают задачу полного управления изделием, при минимальном объеме данных.   
   
В примере при каждом запуске формируется запись в базу.   
В полях базы записываются время записи и также поля, чтобы определить, что это за запись.   
В таком виде можно запросить любую информацию и на любое время создания.   
В конечном итоге это записаны примитивы, которые постоянны в каждой САПР.   
Читаешь данные, перекодируешь в свой формат и рисуешь.   
   
   
В примере был чертеж, по которому формировались записи. Если есть только база, в любой момент можно получить чертеж и модель в любом исполнении.   
   
Должен быть стандарт на базу данных, чтобы каждый мог понять, что там внутри.   
   
В примере из чертежа берутся все значения по оси X и по оси Y. Это записано в полях "Координата по X" и "Координата по Y"   
Сами отрезки идут ссылками на порядок записи в значениях координат.   
   
В данном случае состав не изменяется и идет коррекция трех размеров, которые тоже отражены в базе, как исполнение.   
Номера те же, а координаты другие, получим новые детали.   
   
Эта база для программы, сюда смотреть можно только в крайнем случае   
   
https://drive.google.com/open?id=1vVPBb2Om-Uf6j5k8StYCtQcmnAT5ZeHE   
   
   
Можно записывать только уникальные сочетания параметров координат и самих отрезков. Для отчета можно просто указать ссылку на дату оригинальной записи.   
   
В базах ничего не должно удаляться автоматически, например, как в бухгалтерии, ошиблись с приходом, пишем такой же расход и ставим новый приход.   
   
   
Формат с координатами вершин и перечнем вершин может и поверхности задать из треугольников.   
Например, вывод прямоугольной конструкции:   
   
ply
format ascii 1.0
comment VCGLIB generated
element vertex 8
property float x
property float y
property float z
element face 12
property list uchar int vertex_indices
end_header
-59.3417 -24.8708 10
-59.3417 -24.8708 0
-59.3417 -52.8708 0
-24.3417 -52.8708 10
-24.3417 -24.8708 0
-59.3417 -52.8708 10
-24.3417 -24.8708 10
-24.3417 -52.8708 0
3 0 1 2
3 2 5 0
3 5 2 7
3 7 3 5
3 3 7 4
3 4 6 3
3 6 4 1
3 1 0 6
3 6 0 5
3 5 3 6
3 7 2 1
3 1 4 7
   
Если задать высоту выдавливания по базе можно получить и поверхности прямоугольной конструкции.    
Тут уже знакомые цифры, заменили только координаты, а формирование треугольников осталось без изменений:   
ply
format ascii 1.0
comment VCGLIB generated
element vertex 8
property float x
property float y
property float z
element face 12
property list uchar int vertex_indices
end_header
-180    -204.1  10
-180    -204.1  0
-170    -232    0
-155.1  -232    0
-155.1  -232    10
-155.1  -204.1  0
-170    -232    10
-155.1  -204.1  10
3 0 1 2
3 2 6 0
3 6 2 3
3 3 4 6
3 4 3 5
3 5 7 4
3 7 5 1
3 1 0 7
3 7 0 6
3 6 4 7
3 5 2 1
3 5 3 2