LINUX.ORG.RU

SAMoCAD 0.0.8 - теперь может DXF

 , ,


0

4

Правда не полностью, пока налажен экспорт/импорт примитивов LINE, ARC, CIRCLE, DIMENSION, TEXT. DXF 2000/2002.

Проект на SourceForge

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

Автокад (пробовал 2006-2008) открывает, вроде как все нормально. Сейчас занялся трассировкой и возможностью ввода по углу и расстоянию. Хотелось бы побольше пожеланий по расширению функционала программы, я например больше по строительным чертежам, мне требются самосчитающиеся высотные отметки, обозначения и прочая тема из СПДС.

Кто не вкурсе - я самоделкин, изобретаю автокад на питоне (warning, Tkinter!), даже что-то получается маленько :) Ссылка на предыдущую тему

Зарание спасибо за адекватные комментарии.

Замечательный проект. Но почему соурсфорж, а не битбакет/гитхаб?

Siado ★★★★★ ()

Здорово, правда. Планируете это развить в полноценный сапр, оно не будет тормозить на пайтоне-то? Хотя пока работает вполне шустро, из пожеланий: хотелось бы проводить линии и прямый, как в том же компасе, а не ставить две крайних точки, ну и двигать соответственно примитивы, а не ``телепортировать" — неудобно.

Freyr69 ★★★ ()
>>> x = {'a':1, 'b': 2}
>>> y = {'b':10, 'c': 11}
>>> x.update(y)
>>> x
{'a': 1, 'b': 10, 'c': 11}
def dim_texter(values):
  #...
  values['size'] = '-350'
  values['type_arrow'] = 'Arch'
  values['arrow_s'] = '200'
  values['s'] = '200'
  values['vr_s'] = '200'
  values['vv_s'] = '200'
def dim_texter(values):
  values.update({
    'size':       '-350',
    'type_arrow': 'Arch',
    'arrow_s':    '200',
    's':          '200',
    'vr_s':       '200',
    'vv_s':       '200',
  })
anonymous ()
def func1(param, args, arg):
    if param == 'size':
        args[9] = float(arg)
    elif param == 'fill':
        args[8] = arg
    elif param == 'text':
        args[6] = arg
    elif param == 's':
        args[13] = float(arg)
    return args

def func2(param, args, arg):
    F = {
        'size': (9,  lambda x: float(x)),
        'fill': (8,  lambda x: x),
        'text': (6,  lambda x: x),
        's':    (13, lambda x: float(x)),
    }
    if param in F:
        i,f = F[param]
        args[i] = f(arg)
    return args

print func1('s', list(['']*15), '7.5')
print func2('s', list(['']*15), '7.5')
anonymous ()

изобретаю автокад на питоне

ужс. но кадщикам может помочь

timuaz ()
Ответ на: комментарий от anonymous
def func2(param, args, arg):
    identit = lambda x: x
    F = {
        'size': (9,  float),
        'fill': (8,  identit),
        'text': (6,  identit),
        's':    (13, float),
    }
    if param in F:
        i,f = F[param]
        args[i] = f(arg)
    return args
ados ★★★★★ ()

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

handbrake ★★★ ()
def ryu(self):
    x,y,x2,y2 = self.ns()
    L1 = ([x,y-y2/3.0],[x,y-y2*2.0/3.0])
    L2 = ([x,y-y2*2.0/3.0],[x+x2/3.0,y-y2])
    L3 = ([x+x2/3.0,y-y2],[x+x2*2.0/3.0,y-y2])
    L4 = ([x+x2*2.0/3.0,y-y2],[x+x2,y-y2*2.0/3.0])
    L5 = ([x+x2,y-y2*2.0/3.0],[x+x2,y-y2/3.0])
    L6 = ([x+x2/3.0,y],[x+x2*2.0/3.0,y])
    L7 = ([x+x2/3.0,y], [x,y-y2/3.0])
    L8 = ([x+x2*2.0/3.0,y],[x+x2,y-y2/3.0])
    L9 = ([x-x2/6.0,y-y2/2.0],[x,y-y2/2.0])
    L10 = ([x-x2/6.0,y],[x-x2/6.0,y-y2])
    return [L1, L2, L3, L4, L5, L6, L7, L8, L9, L10]

def func(self):
    x,y,x2,y2 = self.ns()
    lst = [
        ([+0   ,-1/3.],[+0   ,-2/3.]),
        ([+0   ,-2/3.],[+1/3.,-1   ]),
        ([+1/3.,-1   ],[+2/3.,-1   ]),
        ([+2/3.,-1   ],[+1   ,-2/3.]),
        ([+1   ,-2/3.],[+1   ,-1/3.]),
        ([+1/3.,+0   ],[+2/3.,+0   ]),
        ([+1/3.,+0   ],[+0   ,-1/3.]),
        ([+2/3.,+0   ],[+1   ,-1/3.]),
        ([-1/6.,-1/2.],[+0   ,-1/2.]),
        ([-1/6.,+0   ],[-1/6.,-1   ]),
    ]
    def f(a):
        return [x+x2*a[0], y+y2*a[1]]
    return [(f(a),f(b)) for (a,b) in lst]

class Self(object):
    def ns(self): return 3,6,9,12

self = Self()

for i,j in zip(ryu(self), func(self)):
    print '%-25s %s %-25s' % \
            (i,['==','!='][i!=j],j)
anonymous ()

Присоединюсь к вопросу про сорсфорж, есть какие-то веские причины его использовать?

Ведь гитхаб/битбакет банально удобнее.

b0c0813f ()

Так, по порядку:

почему соурсфорж, а не битбакет/гитхаб?

Руки не дошли, еще доберемся.

не будет тормозить на пайтоне-то?

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

может лучше присоединиться к разрабам других кадов ?

Тут все исторически сложилось. Вначале поприколу состряпал векторную рисовалку, потом выяснилось, что на ней можно чертить почти так же быстро как в автокаде. Ну развивать стал, о присоединении к другим разработчикам не подумал даже. Да и умею я только на питоне (и то так себе).

Даже не ожидал что кто-то заглянет в код, поэтому всем большое спасибо!!!

Я так-то не программист, поэтому код ужасен. Ну и общая структура программы тоже не лучше - она складавалась стихийно...

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

А так да, планирую развивать дальше, в полноценную САПР (правда только 2D)

VVS1864 ()

Чет не один dxf открыть не получилось

zamtmn ()

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

anonymous ()
Ответ на: комментарий от zamtmn

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

Autocad 2006-2008 - Все нормально

DraftSight - Так же

Librecad - Косяки с размерами и шрифтами (русские буквы не понимает, неодекватно рендерит шрифты с сжатием символов, размеры по своему лепит)

Qcad - аналогично либре, только сжатый шрифт нормален

zCad - нормально, то что открывается - значительно лучше либры, только размеры не отображает.

Это я пробовал plan_1.dxf который на SF. Правда не пытал другие версии автокада, может быть там почему-то не откроет.

стоит вынести ресурсы в отдельную директорию

Да, стоит, и из главного модуля надо побольше всего вынести в импортируемые - работать с таким здоровым становится не удобно.

VVS1864 ()
Ответ на: комментарий от ados

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

ados ★★★★★ ()
Ответ на: комментарий от VVS1864

zCad - нормально, то что открывается - значительно лучше либры, только размеры не отображает.
Это я пробовал plan_1.dxf который на SF. Правда не пытал другие версии автокада, может быть там почему-то не откроет.

В моей версии zcad`а размеры в твоем plan_1.dxf отображаются. Я давно не обновлял версию на sf в связи с масштабными переделками и насаждением багов))

zamtmn ()
Ответ на: комментарий от zamtmn

А, понятно. Тут есть 2 момента: 1) Чертеж желательно взорвать (до приметивов которые понимает SAMoCAD, другие он должен проигнорировать). 2) местоположение камеры при импорте не изменяется, т.е. чертеж может оказаться где-то далеко, лечится это зумом. Конечно исправлю как время будет.

Еще вариант - запустить draft.py и посмотреть что напишет в консоли. Если ошибки - присылай, разбираться буду, если нечего - все нормально, см. 1 и 2 выше.

VVS1864 ()
Ответ на: комментарий от VVS1864
zamtmn@desktop:~/hdd/SAMoCAD_v0.0 .8.1_alpha$ python ./SAMoCAD.pyw 
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__
    return self.func(*args)
  File "/home/zamtmn/hdd/SAMoCAD_v0.0 .8.1_alpha/draft.py", line 3953, in importDXF
    self.fileOpen()
  File "/home/zamtmn/hdd/SAMoCAD_v0.0 .8.1_alpha/draft.py", line 3990, in fileOpen
    DXF = from_dxf.DXFopener(text)
  File "/home/zamtmn/hdd/SAMoCAD_v0.0 .8.1_alpha/from_dxf.py", line 384, in __init__
    values['start'], values['extent'] = angler(values['start'], values['extent'])
  File "/home/zamtmn/hdd/SAMoCAD_v0.0 .8.1_alpha/from_dxf.py", line 123, in angler
    eextent -= estart
UnboundLocalError: local variable 'eextent' referenced before assignment
zamtmn ()
Ответ на: комментарий от Siado

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

anonymous ()
Ответ на: комментарий от VVS1864
zamtmn@desktop:~/hdd/SAMoCAD_v0.0 .8.1_alpha$ python ./SAMoCAD.pyw 
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__
    return self.func(*args)
  File "/home/zamtmn/hdd/SAMoCAD_v0.0 .8.1_alpha/draft.py", line 3953, in importDXF
    self.fileOpen()
  File "/home/zamtmn/hdd/SAMoCAD_v0.0 .8.1_alpha/draft.py", line 3990, in fileOpen
    DXF = from_dxf.DXFopener(text)
  File "/home/zamtmn/hdd/SAMoCAD_v0.0 .8.1_alpha/from_dxf.py", line 302, in __init__
    config = (config % values)
KeyError: 'width'
zamtmn@desktop:~/hdd/SAMoCAD_v0.0 .8.1_alpha$ python ./SAMoCAD.pyw 
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__
    return self.func(*args)
  File "/home/zamtmn/hdd/SAMoCAD_v0.0 .8.1_alpha/draft.py", line 3953, in importDXF
    self.fileOpen()
  File "/home/zamtmn/hdd/SAMoCAD_v0.0 .8.1_alpha/draft.py", line 3991, in fileOpen
    list_command = DXF.command_list
AttributeError: DXFopener instance has no attribute 'command_list'
zamtmn ()
Ответ на: комментарий от ados

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

Нет.

anonymous ()

Проблему вроде как устранил, попутно нашел несколько багов в создании объектов и улучшил экспорт размеров. Уверен на 100% - косяков еще много, искать надо. Особенно при открытии DXF могут быть. Советую запускать программу через draft.py и ловить ошибки в консоли, чем больше найдется, тем лучше.

VVS1864 ()
Ответ на: комментарий от anonymous

fix.py

Спасибо, проверил - интересно, работает, но не совсем корректно, забывает открывать скобку в каждом методе, методы с одинакивыми названиями в обоих классах съедает, пробел не учитывает почему-то. Были свои наработки, в основном решил задачку ими. Теперь надо думать над залитием сторонних шрифтов.

ошибки с дугами нестало, остальные остались

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

ИМХО нормальное чтение из DXFa равносложно нормальной записи в него.

Проблем с открытием файлов из samocada в других кадах ни у кого нет?

VVS1864 ()
Ответ на: комментарий от VVS1864

Проблемка с текстом который в dxf`е может лежать так:

Error in opened file!
u"self.c_text(x = -1453.84053877, y = -867.208458, text = u'\\U+00CA\\U+00EE\\U+00F2\\U+00E5\\U+00EB\\U+00FC\\U+00ED\\U+00E0\\U+00FF \\U+00F1\\U+00EE \\U+00F1\\U+00EA\\U+00EB\\U+00E0\\U+00E4\\U+00EE\\U+00EC \\U+00F2\\U+00EE\\U+00EF\\U+00EB\\U+00E8\\U+00E2\\U+00E0', fill = 'white', angle = 0, size = -3.0, anchor = 'sw', sloy = 1, s_s = 1.95, w_text = 1.95, font = 'Simular TXT')"
Поразбивал все, заменил тексты на английские, вроде открылся файл в самокаде. Производительность не на высоте, нужно сразу задуматься о оптимизациях - всяких деревьях, лодах и т.п., потом их будет сложнее добавить. Сейчас у тебя тексты съедают всю производительность даже на небольших чертежах.

ИМХО нормальное чтение из DXFa равносложно нормальной записи в него.

Нет, запись таки сложнее, при чтении можно много что проигнорировать, при записи уже нет. У меня головняки начались после поддержки блоков и типов линий. Любой косяк при записи и автокад валится с неинформативными сообщениями или чертеж открывается но полноценно неработает, например непашет копирование примитивов в клипборд

zamtmn ()

Соурсфорж... Саурсфарж... Чуруианж... Смуранож... Абубуб...

Deleted ()
Ответ на: комментарий от Deleted

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

zamtmn ()
#!/usr/bin/python

def f1(): # from_dxf.dim_texter
    values={'q':1,'w':2,'e':3}
    val={'w':20,'e':'30','r':40}
    del_list = []
    for v in val:
        if v in values:
            del_list.append(v)
    for d in del_list:
        del val[d]
    values.update(val)
    return values

def f2():
    values={'q':1,'w':2,'e':3}
    val={'w':20,'e':'30','r':40}
    for v,k in val.iteritems():
        if v not in values:
            values[v] = k
    return values

def f3():
    values={'q':1,'w':2,'e':3}
    val={'w':20,'e':'30','r':40}
    val.update(values)
    val,values=values,val
    return values

print f1()
print f2()
print f3()

import timeit
print timeit.timeit('f1()', setup='from __main__ import *')
print timeit.timeit('f2()', setup='from __main__ import *')
print timeit.timeit('f3()', setup='from __main__ import *')
anonymous ()
Ответ на: комментарий от anonymous
#!/usr/bin/python

import os
import re
import glob

def fixPath(v, i):
    return '%s= PhotoImage('\
        'file = os.path.join(appPath, \'res\', \'%s\'))' % (v,i)

def fix(fname):
    need,code,imgs = False,'',[]
    for line in open(fname,'r'):
        line = line.rstrip()
        if 'PhotoImage' in line:
            m = re.match(r'([^=]*)[^\']*\'([^\']*)\'(.*)', line)
            var,img = m.group(1,2)
            imgs.append(img)
            line = fixPath(var, img)
            need = True
        code = code + line + '\n'
    return need,code,imgs

ignoreList = [ os.path.basename(__file__) ]
for i in glob.glob('*.py*'):
    if i in ignoreList:
        continue
    need,data,imgs = fix(i)
    if need:
        if not os.path.exists('res'):
            os.mkdir('res')
        for img in imgs:
            if os.path.exists(img):
                os.rename(img, os.path.join('res', img))

        os.rename(i, '%s.old' % i)
        open(i, 'w').write(data)
anonymous ()
#!/usr/bin/python

import from_dxf
import cProfile,pstats,StringIO

data = open('example.dxf','r').read()
pr = cProfile.Profile()
pr.enable()
from_dxf.DXFopener(data)
pr.disable()
s = StringIO.StringIO()
sortby = 'cumulative'
ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
ps.print_stats()
print s.getvalue()
anonymous ()
Ответ на: комментарий от zamtmn

Странно что ошибку написал - только что скопировал команду из сообщения в текстовый файл, открылся самокадом не ругаясь. А вот кодировка - если я правильно понимаю, DXF2000-2002 использует cp1251 для русских символов, более поздние - utf-8, тут что-то не совсем понятно.

Текст это штука прожорливая. Поначалу сильно боялся тормозов, шрифт был самый минимальный - 1 символ = 3-5 линий. Большие чертежи с обилием текста пока являются сложной задачей. Падения производительности происходят при вызовах графической библиотеке, пробовал свой код отдельно от нее - все проворачивается мгновенно. В принципе оптимизация возможна.

До блоков пока не добрался, но на примере размеров понятно, что это что-то нехорошее. Типы линий заливаются сразу все которые пока есть, тут особо трудностей не возникало, пока по крайней мере.

VVS1864 ()
Ответ на: комментарий от VVS1864

использует cp1251

Там может лежжать юникод в виде U+код и всякие символы в виде %%D, %%C емнип - градусы, диаметр, подчеркивания, надчеркивания и т.п.

Поначалу сильно боялся тормозов, шрифт был самый минимальный - 1 символ = 3-5 линий

надо лодить мелкий текст, тормозов небудет

Типы линий заливаются сразу все которые пока есть, тут особо трудностей не возникало, пока по крайней мере.

типы линий будут чесные или только те что позволяет графическая система?

zamtmn ()
Последнее исправление: zamtmn (всего исправлений: 1)
Ответ на: комментарий от zamtmn

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

VVS1864 ()
Ответ на: комментарий от anonymous

if .pyc in folder:

Traceback (most recent call last):
  File "/home/vvs1864/SAMoCAD_v0.0 .8_alpha/111.py", line 28, in <module>
    need,data,imgs = fix(i)
  File "/home/vvs1864/SAMoCAD_v0.0 .8_alpha/111.py", line 17, in fix
    var,img = m.group(1,2)
AttributeError: 'NoneType' object has no attribute 'group'

glob.glob('*.py*'):
glob.glob('*.py'):

:-)

VVS1864 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.