Komunikacja projektanta z oprogramowaniem do projektowania (GoogleSketchup)

Lipiec 9th, 2011

Przez ostatni rok wzmocniłem swój warsztat używanych narzędzi do projektowania. Trochę więcej o jednym z nich będzie dzisiaj, tj. o „Sketchup” firmy Google.

Poza flagowym oprogramowaniem  „Designer” firmy Komandor S.A., w której pracuję i w której rozwijamy ten soft, istnieje szereg innych programów do projektowania. Najbardziej rozbudowanymi z nich są chyba obecnie AutoCad firmy Autodesk oraz wspomniany „Sketchup” firmy Google. Pierwszy z nich poszerzył swój wachlarz zastosowań właściwie już na każdą dziedzinę projektowania dedykując oddzielne wersje dla elektryków, konstruktorów maszyn, architektów itd, a drugi nastawił się na prostotę i komunikację z użytkownikiem i używany jest m.in. do „tworzenia świata” w GoogleMaps.   Co ciekawe obie firmy nastawione są bardzo przyjaźnie do zewnętrznego środowiska developerów;) Do obu produktów każdy dopisać może swoją wtyczkę, którą bez problemu testować i używać może wspomagając swoją pracę, tudzież rozwijając samo oprogramowanie. I tak, AutoCad przyjmuje wtyczki napisane w .NET (lub wewnętrznych językach ObjectARX i AutoLisp), a GoogleSketchup odpowiednio w Ruby (a ostatnio też C++). Wsparcie, tutoriale, API i pomoce jak najbardziej dostarczane są oficjalnie na specjalnie stworzonych stronach dla developerów:
Developer Center AutoDesk
Google Sketchup Developers

Dla przykładu przedstawię poniżej bardzo prosty skrypt napisany w Ruby dla Sketchupa, który nawiąże komunikację z zewnętrznym, równie prostym serwerem, napisanym w C#.

Najpierw samokomentujący się kod dla klienta:

plugins_menu = UI.menu("Plugins") #pobieramy uchwyt do wtyczek w menu "Plugins" - stąd będziemy uruchamiać naszą wtyczkę

plugins_menu.add_item("Connect to server") { server_connection } #dodajemy naszą wtyczkę, która uruchomi metodę server_connection zdefiniowaną poniżej

require 'D:/Programy/Ruby186/lib/ruby/1.8/i386-mingw32/socket' # wskazujemy na standardową bibliotekę - będziemy potrzebować modułu socket.so

#metoda łączaca się z zewnętrznym serwerem, wysyłająca komunikat i wyświetlająca odpowiedź:

def server_connection

port = 2011  #ustalamy port połączenia

streamSock = Socket::new(Socket::AF_INET, Socket::SOCK_STREAM, 0) #tworzymy socket

myaddr = [Socket::AF_INET, port, 127, 0, 0, 1, 0, 0].pack("snCCCCNN") #tworzymy adres, będziemy łączyć się do localhosta, więc jest tu zaszyte 127.0.0.1

streamSock.connect( myaddr ) #łączymy się

streamSock.puts "Hello from GoogleSketchup!" #wysyłamy komunikat do serwera

responseMessage = streamSock.recv(100) #odbieramy odpowiedź z serwera

UI.messagebox(responseMessage) #wyświetlamy w okienku Sketchupa informację zwrotną:)

streamSock.close   #zamykamy socket

end

Jedna UWAGA: Najnowszą wersją Ruby jest 1.9.2, ale (najnowszy) Sketchup 8 używa 1.8.6 i w związku z tym konieczne jest używanie modułu ‘socket’ właśnie z biblioteki skompilowanej w 1.8.6 (wyższa nie działa)

Poniżej kod dla serwera:

class Server

{

private TcpListener tcpListener;

private Thread listenThread;

private int port = 2011;

static void Main(string[] args)

{

Server serv = new Server();

}

public Server()

{

this.tcpListener = new TcpListener(IPAddress.Any, this.port);

this.listenThread = new Thread(new ThreadStart(ListenForClients));

this.listenThread.Start();

}

private void ListenForClients()

{

this.tcpListener.Start();

while (true)

{

//blocks until a client has connected to the server

TcpClient client = this.tcpListener.AcceptTcpClient();

//create a thread to handle communication

//with connected client

Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));

clientThread.Start(client);

}

}

private void HandleClientComm(object client)

{

TcpClient tcpClient = (TcpClient)client;

NetworkStream clientStream = tcpClient.GetStream();

byte[] dataReceived = new byte[4096];

int bytesRead;

while (true)

{

bytesRead = 0;

try

{

//blocks until a client sends a message

bytesRead = clientStream.Read(dataReceived, 0, 4096);

}

catch

{

//a socket error has occured

break;

}

if (bytesRead == 0)

{

//the client has disconnected from the server

break;

}

//message has successfully been received

ASCIIEncoding encoder = new ASCIIEncoding();

string messageRecived = encoder.GetString(dataReceived, 0, bytesRead);

string messageReply = "You said: " + messageRecived + "\nWe say: Welcome designer in our external server;)";

byte[] dataToSent = encoder.GetBytes(messageReply);

clientStream.Write(dataToSent, 0, dataToSent.Length);

}

tcpClient.Close();

}

}

Jedyne co trzeba zrobić to skompilować kod C#, uruchomić serwer, a potem zapisać skrypt klienta (z rozszerzeniem *.rb) do katalogu ‘Plugins’ tam, gdzie jest zainstalowany Sketchup (to wystarczający warunek, aby Sketchup przyjął nasz skrypt!),  uruchomić Sketchup i kliknąć Plugins->Connect to server, aby dostać po oczach okienkiem:

Taka komunikacja, choć wymagająca jeszcze rozbudowania, może się przydać do pewnej obróbki danych tworzonych podczas projektowania, podczas której zewnętrzny serwer „pilnuje” lub informuje projektanta o poczynionych krokach na bieżąco;) Całość operacji moglibyśmy zaszyć dzięki temu w zewnętrznym serwerze, a skrypt w Sketchup potrzebny byłby nam w zasadzie jedynie do wysłania danych z programu do projektowania. Notabene analogicznie moglibyśmy zrobić z AutoCadem, ujednolicając sposób obróbki danych gdzieś na zewnątrz, ale o tym może wkrótce…

Warsztaty z AutoCad

Maj 21st, 2011

Dzisiejszy wpis jest wzmiankowy;) W menu po prawej powstała strona (AutoCad) z krótkim opisem prowadzonych przeze mnie zajęć w tym semestrze ze studentami 3. roku fizyki (i nie tylko) Uniwersytetu Jagiellońskiego w Krakowie;) Pozdrowienia dla uczestników.

Postanowienia noworoczne 2011

Styczeń 9th, 2011

Kolejny rok na karku jak zwykle daje do myślenia;) Nadszedł właśnie kolejny, którego nie mogę pozwolić sobie zmarnować. Zbyt wiele wysiłku, energii i powolnych kroków do przodu poczyniłem w poprzednim okresie, aby teraz nie wycisnąć z tego maksa:) Tym samym postaram się wypisać na początku kilka z moich noworocznych, pourlopowych postanowień, które związane są z pewnymi ostatnimi decyzjami:

1. Doktorat
Przede mną trudne zadanie – pierwsza sesja na studiach doktoranckich. Dla przypomnienia – w październiku zeszłego roku rozpocząłem studia informatyczne na Polskiej Akademii Nauk przy współpracy z Uniwersytetem Jagiellońskim w Krakowie w Zakładzie Projektowania i Grafiki Komputerowej. Obecnie zajęć nie jest wiele, ale bynajmniej wykład, na który uczęszczam nie jest wcale taki łatwy. Konkretnie, zdawać będę egzamin u prof. Flasińskiego z Zaawansowanej Teorii Języków i Automatów. Głównie chodzi tu o zagadnienia taksonomii Janssensa-Rosenberga gramatyk grafowych oraz o ich zastosowania.
Poza egzaminami, wyklarowania wymagają też moje badania naukowe. Mam pewien pomysł, który może być zastosowany zarówno w grach komputerowych jak i w CADach, o którym jeszcze zapewne kiedyś wspomnę. Wymaga to wszystko jednak pracy.

2. Praca zawodowa
Tutaj głównie chodzi o to, aby rozwijać się w zespole przynajmniej w takim samym tempie, w jakim to było dotychczas. Obecnie pracuję w firmie Komandor S.A. na stanowisku Projektanta-Programisty .NET w zespole tworzącym CAD do modelowania mebli i nie ukrywam, że cholernie podoba mi się ta praca:) Bez owijania w bawełnę, myślę, że póki co jestem spełnionym zawodowo człowiekiem, który dostaje jak najbardziej adekwatne do swoich oczekiwań zadania, wymagające ciągłego wysiłku intelektualnego. Tutaj (być może tylko poza zarobkami) naprawdę nie chciałbym, żeby zbyt wiele się zmieniło!

3. Zespół Game.Play() i rozwijanie gry komputerowej
Na fali sukcesu z poprzedniego roku (5. miejsce w Polsce w konkursie Maćka Aniserowicza pt. „Daj się poznać”) przy tworzeniu gry komputerowej w technologii XNA… skompletowałem zespół, który dalej będzie ją rozwijał. Gra idzie do przodu, a całe przedsięwzięcie, tj. grę komputerową pod roboczą nazwą „Mobots: Morphable Robots” można śledzić obecnie na stronie:


http://www.KamilHawdziejuk.pl/mobots/

W tym miejscu pragnę też podziękować obecnemu zespołowi za to, że im również chce się robić i rozwijać coś „po godzinach”. Ciągle zapraszam też innych programistów i grafików, chcących spróbować swoich sił w programowaniu 3D. Mam nadzieję, że, przynajmniej na komórkę Phone 7, gra w pewnej podstawowej wersji wydana zostanie już na gwiazdkę tego roku!

4. Język niemiecki
To pewna nowość, na którą mam nadzieje znaleźć czasami czas. Otóż, jak to mawiają, znajomość dodatkowego języka nigdy nie zaszkodzi. Ponieważ uczyłem się go przez 8 lat w szkole, a potem zupełnie, ale to kompletnie przestałem mieć z nim styczność przez dobre 7 lat, to czuję się tutaj zupełnie początkującym lingwistą i sporo jeszcze przede mną. Niemniej plan jest – szlifować znajomość swojego języka niemieckiego…przynajmniej do poziomu komunikatywnego.

5. Portal KtoZeMna.pl
O tak, to dzieło roku 2009, które stworzyłem razem z moim kolegą. Obecnie portal ma się świetnie, działa szybko, całkiem stabilnie i nawet ładnie wygląda, ale… brakuje mu reklamy. Tak naprawdę, to brakuje mu pieniędzy na reklamę. Ten rok przeznaczam więc również na pozyskanie inwestora dla portalu. Inwestora, który za pokaźny pakiet udziałów zechce kompletnie sfinansować promocję portalu ogłoszeniowo-społecznościowego www.KtoZeMna.pl.


http://www.KtoZeMna.pl

Tym samym, jeśli jesteś chętny podjęcia współpracy, znasz takie osoby, tudzież widzisz w nim tyle potencjału, ile faktycznie w nim drzemie – czekamy na kontakt (biuro@ktozemna.pl).

W skrócie, to tyle z moich planów na ten rok. Jest ich aż za nadto, dlatego nie będę ich więcej już żyłował…tylko starał się będę od czasu do czasu pisać o ich postępach. Może stałym czytelnikom się to spodoba, a nowi jakoś się do tego przyzwyczają:) Pozdrawiam!