2D basit bir CAD programı yazmak

Başlatan Elektroemre, 17 Temmuz 2013, 00:43:39

Elektroemre

Merhaba arkadaşlar,

Hem merak ettiğimden hemde ileride bir projede bana yardımcı olacağını düşündüğümden basit bir 2D CAD programı yazmak istiyorum.
Vaktim varken şimdilik C# ile bir şeyler karaladım, framework'un fonksiyonları ve System.Drawing'deki Graphic'i kullanarak ilkel bir WorkSpace hazırladım, zoom in, zoom out  yapıp çember vs çiziyorum.


İleriye dönük ne kullanmamı tavsiye edersiniz? Karşıma hep OpenGL çıktı C# için SharpGL varmış bu iş için uygunmudur?
Açık kaynak kodlu CAD programlarını incelemeye çalıştım ama, o büyüklükteki projeleri oturup incelemek iğneyle kuyu kazmak gibi.
Bunlar dışında bu iş için neler önerirsiniz?

Gökhan BEKEN

Böyle şeyler c++ ve opengl ile yapılsa daha mantıklı olur.
Çizim yapılacak alanı karelere bölmek gerekir. İlk başta kullanıcıya ok çizdirmekle başlayabilirsiniz.
Bu ok böldüğünüz karelerin hangisinden başlayıp bitiyor onları kayıt edeceksiniz. Sonra hangi ok hangi ok ile temas kuruyor bunları kaydedeceksiniz.
vs vs
Özel mesaj okumuyorum, lütfen göndermeyin.

Tagli

Bu işlerle hiç uğraşmadım ama bu konuda açık kaynaklı olarak FreeCAD var, kodu belki fikir verebilir. Çok karmaşık olacağını tahmin ediyorum, ama o tür yazılım projelerinde sanırım kodu anlayabilmek için kalem kağıdı alıp 1-2 hafta falan çalışmak gerekiyor kod üzerinde diye tahmin ediyorum. Bence kendi programını yazmak yerine bu tür bir projeye katkı sağlamaya yönelmelisin. FreeCAD'in çok eksiği var mesela. Gönül ister ki bir gün Solidworks kıvamına gelsin.
Gökçe Tağlıoğlu

Elektroemre

@tagli hocam esas yapacağım işin CAD kısmından farklı bir çok tarafı var, normal standart bir CAD programından farklı o yüzden kendim yazmam gerekli.
#meftun hocam, benzer bir çalışma yaptınız mı daha önce?

Elektroemre

#4
Hayırlsı ile kullanıcıya çizgi çizdirecek hale geldi  :D
Objeleri bir ArrayList'te tutuyorum. Tüm çizim objeleri için abstract bir class yaptım, diğer çizgi çember gibi objeleri bundan oluşturacağım.
Tüm objeler zoomin zoomout yapılabilcek özellikte.


fatih6761

@Elektroemre open source mu olacak? :)

Gökhan BEKEN

Alıntı yapılan: Elektroemre - 21 Temmuz 2013, 22:45:55
@tagli hocam esas yapacağım işin CAD kısmından farklı bir çok tarafı var, normal standart bir CAD programından farklı o yüzden kendim yazmam gerekli.
#meftun hocam, benzer bir çalışma yaptınız mı daha önce?
Hayır yapmadım sadece fikir...
Alıntı yapılan: Elektroemre - 22 Temmuz 2013, 23:42:12
Objeleri bir ArrayList'te tutuyorum. Tüm çizim objeleri için abstract bir class yaptım, diğer çizgi çember gibi objeleri bundan oluşturacağım.
Tüm objeler zoomin zoomout yapılabilcek özellikte.

(Resim gizlendi görmek için tıklayın.)
Çizilen objelerin ne var ne yok geçtiği bütün yolları kaydetmeniz iyi bişey değil, resim işleme programı gibi olur. Sizin ihtiyacınız olan kullanıcıya vektörel çizim yaptırtmak. Bunun için nesnelerin sadece başlangıç, bitiş, çap, açı, uzunluk gibi verilerini alıp her seferinde bu değerlere göre göstermelisiniz. Böylece kullanıcı sayfayı büyütüp küçültürse resimlerin görselliği bozulmaz.
Bir çizgi çizdirecekseniz, nerden nereye kadar kaç mm uzunluğunda gibi 3 parametre yeterli olacaktır.
Özel mesaj okumuyorum, lütfen göndermeyin.

Elektroemre

@fatih6761 hocam şimdilik Close Source  :D

@meftun hocam, şuan şekiller bahsettiğiniz gibi vektörel olrak tutuluyor hafızada. O sebeple zaten Zoomin Zoomout yapmakta basit oluyor.

@gerbay hocam, CNC benzeri mekanik sistem için bir arayüz diyelim.
İleriye dönük görsel compiler fikrimede altyapı olur diye umut ediyorum, o yüzden PLC benzeri görsel programlama arayüzleri ile ilgili tavsiyeleriniz varsa severek dinlemeye hazırım.

Elektroemre

Evet arkadaşlar yaklaşık 350 saatlik çalışma-emeğin ardından CAD programım istediğim kıvama geldi.

ZoomIn/ZoomOut (Mouse tekerleği ile kullanılıyor)
Mosun tekerlek tuşu ile sayfa istenildiği gibi sürüklenebiliyor.
Üst kısımdaki cetvelde ve sağ aşağıdaki labellerde mousun o anki konumu anlık olarak görülebiliyor. (Cetvel kısmına cm mm ya da pixel cinsinden görüntülemede eklenecek)
Redo/Undo/Copy/Paste/Select All/ Delete (Standart klavye kısa yollarıyla kullanılabiliyor)

Çizgi, diktörgen, elips ve text çizilip, düzenleme yapılabiliyor.
Vektör dosyası import edilip, resize ve konumlandırma işlemleri yapılabiliyor.

Sol taraftaki listede çizilen objelerin sayısı ve listesi görüntülenebiliyor, seçili objenin parametrelerini değiştirmek için Properties pencereside mevcut (Eksikleri var şimdilik)

Detayları merak eden arkadaşlar için;

Tüm Program C# ile yazıldı. Grafikler için GDI+ kullandım.
Çizim objeleri için Line, Rectangle, Ellipse, GraphicPath gibi standart GDI+ nesneleri ile oluşturuluyor.
Çoğu şey için GDI+ yeterli iken birden fazla kompleks vektör dosyası import edildiğinde programda bir miktar kasma oluyor,
ancak ticari progrmlarda da aynı test dosyalarını kullandığımda aynı derede kastılar. Yani GDI+ sınırları.

OpenGL ve DirectX'i de denedim,
OpenGL için OpenTK (http://www.opentk.com/)'yı kullandım.
OpenGL anladığım kadarıyla herşey vertex'lerden oluşuyor,
Çizim modunu verip, sonra tek tek (ya da dizi halinde) vertrxleri veriyoruz. En son render ediyoruz.
Çember, kare vs gibi temel geometrik şekiller için hazır kütüphanesi yok.
Anladığım kadarıyla openGL ile bunları çizebilmek için kendi matematik ve geometri kütüphanemizi yazmamız lazım.

Şimdili GDI+ performansı ilk versiyon için yeterli, olmazsa OpenGL için C ya da C++'da geometri kütüphanesi hazırlayacağım.
Geometrik şekilleri jet hızıyla çizmek için "Bresenham's Algorithm" ile bir kaç implemantasyon yaptım onlarda gayet güzel çalıştı ama kafam karıştı.
http://members.chello.at/easyfilter/bresenham.html

Neyse sonuç olarak ilk versiyon GDI+ ile olacak.

Çok şükür temel CAD programını yazdım, bundan sonrası artık eklemeler, görsel düzenleme ve bug ayıklama.
Yardımcı olan arkadaşlara teşekkür ediyorum.

Son olarak CAD programımızdan bir görüntü  :)





Franisto

Merhaba bende sizin projenize benzer bir şeyler yapmaya çalışıyorum. Henüz olayın çok başındayım...

bir şey sormak istiyorum. Vektör dosyası import etmek için ne kullandınız. hangi formatları import edebiliyorsunuz?