poniedziałek, 17 maja 2010

FreeCAD i Python - od linii poleceń do kreatora...

Jedną z najmocniejszych stron FreeCADa jest interpreter Pythona. Widoczny jest on na dole okna, po wybraniu w menu View-Views-Python Console.

Pierwsza próba.
Po wklejeniu takiego kodu:
import Part
from FreeCAD import Base
cylinder1 = Part.makeCylinder(5,20,Base.Vector(20,0,0),Base.Vector(0,0,1),180)
Part.show(cylinder1)


Otrzymamy połowę walca - parametry w makeCylinder to: promień, wysokość, punkt startowy, kierunek (wektor jednostkowy), kąt obrotu.
Ostatnia linia odpowiada natomiast za wyświetlenie elementu.

Łączenie elementów
Kod który pozwolić wyświetlić cztery połączone (fuse) walce:
import Part
from FreeCAD import Base
cyl1 = Part.makeCylinder(5,15,Base.Vector(0,0,0),Base.Vector(1,0,0),360)
cyl2 = Part.makeCylinder(7,5,Base.Vector(15,0,0),Base.Vector(1,0,0),360)
cyl3 = Part.makeCylinder(6,7,Base.Vector(20,0,0),Base.Vector(1,0,0),360)
cyl4 = Part.makeCylinder(4,10,Base.Vector(27,0,0),Base.Vector(1,0,0),360)
fuse1 = cyl1.fuse(cyl2)
fuse1.Solids
fuse2 = fuse1.fuse(cyl3)
fuse2.Solids
fuse3 = fuse2.fuse(cyl4)
fuse3.Solids
Part.show(fuse3)

Należy zauważyć, że łączenie odbywa się po kolei a wyświetlanie wywoływane jest na samym końcu.



Szkic i wyciąganie
 Coś trudniejszego. Rysujemy dwa łuki i dwa odcinki, zaczynając od określenia położenia 6 (V1, V2, V3, V4, VC1, VC2) punktów (końce odcinków i łuków oraz "środki" łuków). Następnie łączymy odcinki i łuki (S1 = Part.Shape([C1,C2,L1,L2])) i tworzymy powierzchnię (F = Part.Face(W)). Wyciągamy powierzchnie by uzyskać bryłę (P = F.extrude(Base.Vector(0,0,10))). Trzy liczby w nawiasie decydują o kierunku i wysokości wyciągnięcia.
Kod:
import Part
from FreeCAD import Base
#punkty
V1 = Base.Vector(0,10,0)
V2 = Base.Vector(30,10,0)
V3 = Base.Vector(30,-10,0)
V4 = Base.Vector(0,-10,0)
#pierwszy łuk
VC1 = Base.Vector(-10,0,0)
C1 = Part.Arc(V1,VC1,V4)
#drugi łuk
VC2 = Base.Vector(40,0,0)
C2 = Part.Arc(V2,VC2,V3)
#linie
L1 = Part.Line(V1,V2)
L2 = Part.Line(V4,V3)
#polaczenie wszystkiego
S1 = Part.Shape([C1,C2,L1,L2])
#zamknieta linia
W = Part.Wire(S1.Edges)
#powierzchnia
F = Part.Face(W)
#wyciagniecie
P = F.extrude(Base.Vector(0,0,10))
Part.show(P)


Wszystko razem + wycinanie
Wycinając (różnica diff = fuse3.cut(P)) wyciągnięty kształt w naszym wałku otrzymujemy ładny wałek z rowkiem na wpust. By skrypt był bardziej uniwersalny, dodano odpowiednie zależności geometryczne.
Kod:
import Part
from FreeCAD import Base
#srednice
d1=20
d2=30
d3=40
d4=35
#dlugości
l1=40
l2=30
l3=35
l4=42
#wymiary rowka
g=5
sz=7
dl=25
#punkty dla rowka
x1=(l1+l2+l3+(l1+l2))/2-(dl/2)
x2=(l1+l2+l3+(l1+l2))/2+(dl/2)
y1=sz/2
y2=-sz/2
z=d3/2
xp=x1-sz/2
xk=x2+sz/2
#walki
cyl1 = Part.makeCylinder(d1/2,l1,Base.Vector(0,0,0),Base.Vector(1,0,0),360)
cyl2 = Part.makeCylinder(d2/2,l2,Base.Vector(l1,0,0),Base.Vector(1,0,0),360)
cyl3 = Part.makeCylinder(d3/2,l3,Base.Vector(l1+l2,0,0),Base.Vector(1,0,0),360)
cyl4 = Part.makeCylinder(d4/2,l4,Base.Vector(l1+l2+l3,0,0),Base.Vector(1,0,0),360)
fuse1 = cyl1.fuse(cyl2)
fuse1.Solids
fuse2 = fuse1.fuse(cyl3)
fuse2.Solids
fuse3 = fuse2.fuse(cyl4)
fuse3.Solids
#punkty
V1 = Base.Vector(x1,y1,z)
V2 = Base.Vector(x2,y1,z)
V3 = Base.Vector(x2,y2,z)
V4 = Base.Vector(x1,y2,z)
#pierwszy luk
VC1 = Base.Vector(xp,0,z)
C1 = Part.Arc(V1,VC1,V4)
#drugi luk
VC2 = Base.Vector(xk,0,z)
C2 = Part.Arc(V2,VC2,V3)
#linie
L1 = Part.Line(V1,V2)
L2 = Part.Line(V4,V3)
#polaczenie wszystkiego
S1 = Part.Shape([C1,C2,L1,L2])
#zamknieta linia
W = Part.Wire(S1.Edges)
#powierzchnia
F = Part.Face(W)
#wyciagniecie
P = F.extrude(Base.Vector(0,0,-g))
#roznica
diff = fuse3.cut(P)
diff.Solids
Part.show(diff)





Kreator
Ręczne wpisywanie kodu nie jest wygodne. Lepsze jest okienko z miejscami, gdzie możemy wpisać odpowiednie wartości. Trzeba tylko stworzyć autorski kreator.
Tu z pomocą przychodzi Qt Designer. Tworzymy tu okienko odpowiadające naszemu zmysłowi estetycznemu. Warto elementom nadać własne nazwy, np. przycisk nazwałem "przycisk":) Efekt zapisujemy jako plik *.ui, który konwertujemy:
pyuic4 walekokienko.ui > walekokienko.py

Otrzymany plik należy poddać odpowiednim modyfikacjom (dodane części kodu):

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'walekokienko.ui'
#
# Created: Mon May 17 17:13:56 2010
#      by: PyQt4 UI code generator 4.7.2
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui
import FreeCAD, Part
from FreeCAD import Base

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(373, 436)
        self.przycisk = QtGui.QPushButton(Dialog)
        self.przycisk.setGeometry(QtCore.QRect(230, 370, 131, 61))
        self.przycisk.setObjectName("przycisk")
        self.sredn1 = QtGui.QLineEdit(Dialog)
        self.sredn1.setGeometry(QtCore.QRect(80, 90, 113, 25))
        self.sredn1.setObjectName("sredn1")
        self.sredn2 = QtGui.QLineEdit(Dialog)
        self.sredn2.setGeometry(QtCore.QRect(80, 120, 113, 25))
        self.sredn2.setObjectName("sredn2")
        self.sredn3 = QtGui.QLineEdit(Dialog)
        self.sredn3.setGeometry(QtCore.QRect(80, 150, 113, 25))
        self.sredn3.setObjectName("sredn3")
        self.sredn4 = QtGui.QLineEdit(Dialog)
        self.sredn4.setGeometry(QtCore.QRect(80, 180, 113, 25))
        self.sredn4.setObjectName("sredn4")
        self.label = QtGui.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(80, 60, 57, 15))
        self.label.setObjectName("label")
        self.label_2 = QtGui.QLabel(Dialog)
        self.label_2.setGeometry(QtCore.QRect(46, 90, 21, 20))
        self.label_2.setObjectName("label_2")
        self.label_3 = QtGui.QLabel(Dialog)
        self.label_3.setGeometry(QtCore.QRect(46, 120, 21, 20))
        self.label_3.setObjectName("label_3")
        self.label_4 = QtGui.QLabel(Dialog)
        self.label_4.setGeometry(QtCore.QRect(46, 150, 21, 20))
        self.label_4.setObjectName("label_4")
        self.label_5 = QtGui.QLabel(Dialog)
        self.label_5.setGeometry(QtCore.QRect(47, 180, 20, 20))
        self.label_5.setObjectName("label_5")
        self.label_6 = QtGui.QLabel(Dialog)
        self.label_6.setGeometry(QtCore.QRect(220, 60, 57, 15))
        self.label_6.setObjectName("label_6")
        self.dlugosc1 = QtGui.QLineEdit(Dialog)
        self.dlugosc1.setGeometry(QtCore.QRect(200, 90, 113, 25))
        self.dlugosc1.setObjectName("dlugosc1")
        self.dlugosc2 = QtGui.QLineEdit(Dialog)
        self.dlugosc2.setGeometry(QtCore.QRect(200, 120, 113, 25))
        self.dlugosc2.setObjectName("dlugosc2")
        self.dlugosc3 = QtGui.QLineEdit(Dialog)
        self.dlugosc3.setGeometry(QtCore.QRect(200, 150, 113, 25))
        self.dlugosc3.setObjectName("dlugosc3")
        self.dlugosc4 = QtGui.QLineEdit(Dialog)
        self.dlugosc4.setGeometry(QtCore.QRect(200, 180, 113, 25))
        self.dlugosc4.setObjectName("dlugosc4")
        self.label_7 = QtGui.QLabel(Dialog)
        self.label_7.setGeometry(QtCore.QRect(80, 220, 57, 15))
        self.label_7.setObjectName("label_7")
        self.dlrow = QtGui.QLineEdit(Dialog)
        self.dlrow.setGeometry(QtCore.QRect(80, 240, 113, 25))
        self.dlrow.setObjectName("dlrow")
        self.szerrow = QtGui.QLineEdit(Dialog)
        self.szerrow.setGeometry(QtCore.QRect(80, 270, 113, 25))
        self.szerrow.setObjectName("szerrow")
        self.glerow = QtGui.QLineEdit(Dialog)
        self.glerow.setGeometry(QtCore.QRect(80, 300, 113, 25))
        self.glerow.setObjectName("glerow")
        self.label_8 = QtGui.QLabel(Dialog)
        self.label_8.setGeometry(QtCore.QRect(6, 240, 61, 20))
        self.label_8.setObjectName("label_8")
        self.label_9 = QtGui.QLabel(Dialog)
        self.label_9.setGeometry(QtCore.QRect(0, 270, 71, 16))
        self.label_9.setObjectName("label_9")
        self.label_10 = QtGui.QLabel(Dialog)
        self.label_10.setGeometry(QtCore.QRect(0, 300, 71, 16))
        self.label_10.setObjectName("label_10")

        self.retranslateUi(Dialog)
    QtCore.QObject.connect(self.przycisk,QtCore.SIGNAL("pressed()"),self.stworzWalek)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Generator wałków", None, QtGui.QApplication.UnicodeUTF8))
        self.przycisk.setText(QtGui.QApplication.translate("Dialog", "Utwórz", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("Dialog", "Średnica", None, QtGui.QApplication.UnicodeUTF8))
        self.label_2.setText(QtGui.QApplication.translate("Dialog", "1", None, QtGui.QApplication.UnicodeUTF8))
        self.label_3.setText(QtGui.QApplication.translate("Dialog", "2", None, QtGui.QApplication.UnicodeUTF8))
        self.label_4.setText(QtGui.QApplication.translate("Dialog", "3", None, QtGui.QApplication.UnicodeUTF8))
        self.label_5.setText(QtGui.QApplication.translate("Dialog", "4", None, QtGui.QApplication.UnicodeUTF8))
        self.label_6.setText(QtGui.QApplication.translate("Dialog", "Długość", None, QtGui.QApplication.UnicodeUTF8))
        self.label_7.setText(QtGui.QApplication.translate("Dialog", "Rowek", None, QtGui.QApplication.UnicodeUTF8))
        self.label_8.setText(QtGui.QApplication.translate("Dialog", "Długość", None, QtGui.QApplication.UnicodeUTF8))
        self.label_9.setText(QtGui.QApplication.translate("Dialog", "Szerokość", None, QtGui.QApplication.UnicodeUTF8))
        self.label_10.setText(QtGui.QApplication.translate("Dialog", "Głębokość", None, QtGui.QApplication.UnicodeUTF8))

    def stworzWalek(self):
       try:
           # aprawsdzenie wpisanych licz
           d1 = float(self.sredn1.text())
           d2 = float(self.sredn2.text())
           d3 = float(self.sredn3.text())
           d4 = float(self.sredn4.text())
           l1 = float(self.dlugosc1.text())
           l2 = float(self.dlugosc2.text())
           l3 = float(self.dlugosc3.text())
           l4 = float(self.dlugosc4.text())
           sz = float(self.szerrow.text())
           g = float(self.glerow.text())
           dl = float(self.dlrow.text())
       except ValueError:
           print "Wpisz właściwe wartości!"
       else:
       #punkty dla rowka
       x1=(l1+l2+l3+(l1+l2))/2-(dl/2)
       x2=(l1+l2+l3+(l1+l2))/2+(dl/2)
       y1=sz/2
       y2=-sz/2
       z=d3/2
       xp=x1-sz/2
       xk=x2+sz/2
       #walki
       cyl1 = Part.makeCylinder(d1/2,l1,Base.Vector(0,0,0),Base.Vector(1,0,0),360)
       cyl2 = Part.makeCylinder(d2/2,l2,Base.Vector(l1,0,0),Base.Vector(1,0,0),360)
       cyl3 = Part.makeCylinder(d3/2,l3,Base.Vector(l1+l2,0,0),Base.Vector(1,0,0),360)
       cyl4 = Part.makeCylinder(d4/2,l4,Base.Vector(l1+l2+l3,0,0),Base.Vector(1,0,0),360)
       fuse1 = cyl1.fuse(cyl2)
       fuse1.Solids
       fuse2 = fuse1.fuse(cyl3)
       fuse2.Solids
       fuse3 = fuse2.fuse(cyl4)
       fuse3.Solids
       #punkty
       V1 = Base.Vector(x1,y1,z)
       V2 = Base.Vector(x2,y1,z)
       V3 = Base.Vector(x2,y2,z)
       V4 = Base.Vector(x1,y2,z)
       #pierwszy luk
       VC1 = Base.Vector(xp,0,z)
       C1 = Part.Arc(V1,VC1,V4)
       #drugi luk
       VC2 = Base.Vector(xk,0,z)
       C2 = Part.Arc(V2,VC2,V3)
       #linie
       L1 = Part.Line(V1,V2)
       L2 = Part.Line(V4,V3)
       #polaczenie wszystkiego
       S1 = Part.Shape([C1,C2,L1,L2])
       #zamknieta linia
       W = Part.Wire(S1.Edges)
       #powierzchnia
       F = Part.Face(W)
       #wyciagniecie
       P = F.extrude(Base.Vector(0,0,-g))
       #roznica
       diff = fuse3.cut(P)
       diff.Solids
       Part.show(diff)

class walek():
    d = QtGui.QWidget()
    d.ui = Ui_Dialog()
    d.ui.setupUi(d)
    d.show()

           



Prawidłowo sformatowane źródła (Python jest wrażliwy na wcięcia): py, ui.
Efekt:

Wcześniejsze posty o FC: wkupiesila.blogspot.com/2009/12/rozgryzamy-freecad-krok-po-kroku.html, wkupiesila.blogspot.com/2009/12/freecad-poznajemy-klawisz-f5.html


Dokładniejsze informacje - WIKI FreeCAD:

Co nowego w świecie otwartych CADów 3D?

Obecnie istnieją trzy wolne (otwarte) programy CAD oparte o kernel OpenCASCADE.


FreeCAD (modularny, skrypty w pythonie, GPL/LGPL)- wspominałem już o nim niejednokrotnie. Niedawno została wydana wersja 0.10 dla Windows, Linuksa (deb dla Lucid, nieoficjalny rpm dla openSUSE) i Mac OS X. Nie przynosi ona rewolucyjnych zmian - dodano możliwość wyboru dowolnej płaszczyzny czy "klikany" generator sprężyny (właściwie prymitywu - spirali).

Obecnie nacisk kładziony jest na rozwój:
  • szkicownika - potrzebny jest wygodny i zaawansowany szkicownik rozwiązujący zależności geometryczne (równoległości itp.),
  • arkuszy rysunków 2D - nawet obecnie same modele 3D nie są wystarczające, każdy szanujący się program CAD musi mieć możliwość rzutowania i tworzenia dokumentacji 2D,
  • symulacji robotów przemysłowych - chodzi o możliwość przewidzenia ruchów 6-osiowych robotów - takich ja na halach produkcyjnych,
  • raytracingu - przede wszystkim eksport scen do POV-Raya.
Powstają także bardziej oryginalne pomysły - np. współpraca ze skanerem 3D DAVID.




Heekscad (licencja BSD) - zwarty program dla systemów Windows/Linux. Tworzy go tylko jeden człowiek: Daniel Heeks. Sam program wyróżnia się wsparciem do obrabiarek CNC. Blog twórcy zapełniony jest wynikami prac z frezem palcowym:)




NaroCAD (licencja GPL, .NET/Mono) - aktualnie można pobrać tylko wersję dla Windows (w przyszłości także Linux/Mono). NaroCAD jako jedyny z omawianych programów posiada specyfikację, która powinna zapewnić przewidywalny rozwój. PDF można ściągnąć stąd.
Rozwój można śledzić na blogu projektu. 


Czemu się nie połączą?
Tworzenie trzech różnych programów na jednym jądrze OpenCASCADE wydaje się dziwne. Problem w tym, że każdy z nich ma inny kierunek rozwoju. Trudno połączyć minimalistycznego Heekscada z modularnym FreeCADem. Z NaroCADem jest jeszcze gorzej, choćby z uwagi na .NET i wątpliwą przenośność.
Oby tylko żaden z nich nie podzielił losu Wildcat-CAD (klonu CATII)...



Z ostatniej chwili...
CADDD - prace nad programem rozpoczęły się w marcu. Relację można śledzić na stronie CADDD.
Słowa autora:
My mission is to build an open source, cross platform, easy to use, 3D CAD system.  This system needs to have the basic stripped down functionality of Inventor or Solidworks.  Inventor and Solidworks easily are the top two solid modeling software packages.  (To be clear, I don't want to clone these packages.  I want to make a unique package that can accomplish the same tasks just as easily as they can.) I am naming my project and eventually the software CADDD.  The three D's are to signify 3D.

Zrzuty ekranu pochodzą ze stron/blogów projektów.

sobota, 15 maja 2010

Problemy z FGLRX po aktualizacji do Ubuntu 10.04

Czasami nawet tak rutynowa czynność jak aktualizacja dystrybucji potrafi spłatać figla. U mnie po prostu przestały działać sterowniki AMD/ATI. Odpuścić nie miałem zamiaru - w końcu za parę $ zamówiłem kilka gierek na Humble Indie + kolekcję Penumbry za $5 - zamknięte sterowniki musiały być!


Diagnoza
Log wyglądał ciekawie:

(II) Module fglrxdrm: vendor="FireGL - ATI Technologies Inc."
    compiled for 1.7.1, module version = 8.72.11
(II) ATI Proprietary Linux Driver Version Identifier:8.72.11
(II) ATI Proprietary Linux Driver Release Identifier: 8.723.1 
                              
(II) ATI Proprietary Linux Driver Build Date: Apr  8 2010 21:40:29(II) fglrx(0): [uki] DRM interface version 1.0
(II) fglrx(0): [uki] created "fglrx" driver at busid "PCI:1:5:0"
(II) fglrx(0): [uki] added 8192 byte SAREA at 0xc000
(II) fglrx(0): [uki] mapped SAREA 0xc000 to 0xb758d000
(II) fglrx(0): [uki] framebuffer handle = 0xd000
(II) fglrx(0): [uki] added 1 reserved context for kernel
(II) fglrx(0): swlDriScreenInit done
(II) fglrx(0): Kernel Module Version Information:
(II) fglrx(0):     Name: fglrx
(II) fglrx(0):     Version: 8.72.5
(II) fglrx(0):     Date: Apr  6 2010
(II) fglrx(0):     Desc: ATI FireGL DRM kernel module
(WW) fglrx(0): Kernel Module version does *not* match driver.
(EE) fglrx(0): incompatible kernel module detected - HW accelerated OpenGL will not work
(II) fglrx(0): [uki] removed 1 reserved context for kernel
(II) fglrx(0): [uki] unmapping 8192 bytes of SAREA 0xc000 at 0xb758d000
(WW) fglrx(0): ***********************************************
(WW) fglrx(0): * DRI initialization failed!                  *
(WW) fglrx(0): * (maybe driver kernel module missing or bad) *
(WW) fglrx(0): * 2D acceleraton available (MMIO)             *
(WW) fglrx(0): * no 3D acceleration available                *
(WW) fglrx(0): ********************************************* *
(II) fglrx(0): FBADPhys: 0xc4900000 FBMappedSize: 0x10000000
(II) fglrx(0): Reserved 0x04900000 bytes of sideport memory for power saving
(EE) fglrx(0): Failed to map FB memory
(II) fglrx(0): === [atiddxScreenInit] === end

Dziwnym trafem numerki się nie zgadzały - podczas instalacji paczki nie został nadpisany moduł jądra.


Rozwiązanie

Wykopałem (i usunąłem) moduł 8.72.5:
sudo rmmod fglrx
sudo rm -f /lib/modules/2.6.32-22-generic/updates/dkms/fglrx.ko

Wymusiłem instalację paczki z FGLRX (która zwykle po aktualizacji znajduje się w katalogu cache apta):
cd /var/cache/apt/archives/
sudo dpkg -i --force-overwrite fglrx_2%3a8.723.1-0ubuntu4_i386.deb

Sprawdziłem nowy moduł:
sudo modprobe fglrx

Po wpisaniu:
dmesg | grep fglrx
Powinno widnieć coś w stylu:
[    6.873369] [fglrx] module loaded - fglrx 8.72.11 [Apr  8 2010] with 1 minors
Na koniec oczywiście:
sudo aticonfig --initial

i restart:)

czwartek, 13 maja 2010

MEDUSA4 Personal - CAD 2D/3D, darmowy do użytku domowego

Instalacja
Postępujemy wg instrukcji ze strony
www.cad-schroer.com:
  • Wypełniamy formularz, musimy podać MAC (może być odczytany automatycznie) - licencja będzie przywiązana do konkretnego komputera.
  • Dostajemy e-mail, odpowiadamy na niego bez dopisywania treści - w kolejnym mailu dostaniemy plik z licencją.
  • Instalujemy csh: sudo apt-get install csh
  • Ściągamy instalator dla Linuksa. Nadajemy mu prawo do wykonywania:
    chmod +x medusa4_v4_0_0_linux_personal.sh
    i uruchamiamy:
    sudo ./medusa4_v4_0_0_linux_personal.sh
  •  W czasie instalacji podajemy lokalizację pliku z licencją i przeglądarki internetowej (np. /usr/bin/firefox).
  • Skrót do programu zandujemy (w kilku miejscach!) menu GNOME.
Działanie

MEDUSA4 zajmuje, po uruchomieniu, ok. 70 MiB. Praca z nią jest dość specyficzna. Działamy niejako od tyłu (na partyzanta): najpierw tworzymy rzuty 2D, potem model 3D. Przydatne tutoriale poniżej:





Co z użyciem komercyjnym? Przy niewielkiej ilości rysunków ma nam pomóc portal  calltracking.cad-schroer.com, tam za opłatą (3€ za PDF,  5€ za DXF) możemy przekonwertować naszą pracę w arkusz bez znaków wodnych.

Lista wspieranych dystrybucji: 
  • CentOS 5
  • Fedora 11, 12
  • RedHat EL 5
  • SuSE   11 (OSS)
  • Ubuntu 9.04, 9.10

niedziela, 9 maja 2010

Bricscad V10 (klon AutoCADa) na Linuksa - paczki deb, rpm i tarballe

Bricscad to bardzo podobny do AutoCADa, komercyjny program CAD. Był już kiedyś wydany w wersji 6. 
Teraz Bricscad powraca. Na stronie czytamy:
Świat Linux'a wciąż szuka silnego, oferującego standardy DWG rozwiązania CAD. Ponieważ firma Bricsys rozumie potrzeby stale rosnącej wspólnoty Linux informuje, iż wersja Bricscad V10 dla Linux jest na ostatnim etapie tworzenia.
 Tymczasem można ściągnąć rozwojową, testową wersję 10.4.2. Można ją używać do 31 maja 2010. Po tym adresem znajdziecie wersje *.deb, *.rpm i *.tgz. Problemów z uruchomieniem pod Ubuntu 9.10 i ze stabilnością na razie nie zauważyłem. Jedynie rendering 3D potrafi  gryźć się z Compizem. Program po starcie pochłania ok. 90 MiB RAMu.

Główne cechy Bricscada:
  • dobre wsparcie formatu DWG,
  • praca zarówno w 2D jak i 3D,
  • cena (jakieś 2200 zł za wersję Pro) niższa niż w przypadku AutoCADa.

poniedziałek, 3 maja 2010

Z88 - program MES dla GNU/Linuksa, Maca i Wingrozy

Nie zdążyłem jeszcze Z88 przetestować (pewnie zrobię to w weekend), ale chciałbym zwrócić na niego uwagę. Z kilku powodów:
  • program jest na GPL,
  • znajduje się także w repozytoriach* Ubuntu 10.04,
  • może importować pliki z Pro/ENGINEERa,
  • ma dobry, liczący 185 stron podręcznik.  
Strona domowa programu to z88.uni-bayreuth.de/english.html
Dodaję go też do mojej listy programów CAD/CAE dla Linuksa.


*co ciekawe pojawił się tam też FreeCAD