Sunteți pe pagina 1din 35

1

LABORATOR Nr.1
Automatizarea desenării 3D a unui model de navă şi calculul volumului
acesteia folosind o aplicaţie în AutoLISP
1. Modelul geometric
Modelul geometric al navei, considerat numai până la linia de plutire este cel reprezentat în figura 1.
Fiecare dintre coastele navei, în cazul unei nave cu fund drept, poate fi materializată printr-o curbă de genul
celei din figura 2, ignorând porţiunea de curbă orizontală. O curbă oarecare de la coordonata xk este caracterizată
de o serie de puncte definite de câte o pereche de coordonate yi, zi, toate punctele având acelaşi xk.
0 x1
1 y1,1 z1,1
2 y1,2 z1,2

m1 y1,m1 z1,m1

0 xk
1 yk,1 zk,1
2 yk,2 zk,2

mk yk,mk zk,mk

0 xm
1 ym,1 zm,1
2 ym,2 zm,2

mn y1,mn z1,mn

2. Modelul matematic de calcul al volumului imers al navei


Metoda de calcul tradiţională este foarte simplă. Ea constă în folosirea metodei trapezelor, metodă de
integrare numerică de o simplitate extremă, cel mai uşor de implementat în orice mediu de programare. Desigur,
metoda are un anume grad de aproximaţie, acurateţea ei fiind cu atât mai bună cu cât discretizarea este mai fină.

Fig.1. Fig.2.

Fig.3.
2

Conform figurii 2, integrala funcţiei y(z) pe domeniul 0-d poate fi scrisă sub forma aproximativă:

d n −1 yi + yi +1
∫ y ( z )dx = ∑ (zi+1 − zi ) (1)
0 i =1 2

Această valoare reprezintă mărimea ariei dintre curba funcţiei y şi axa oz adică jumătate din aria imersă a
cuplei k. Se observă că prin acest procedeu această arie este divizată în arii elementare ∆Ai cuprinse între axa oz
şi arcul de curbă dintre semilăţimile yi şi yi+1. Metoda de calcul înlocuieşte aceste arii prin ariile trapezelor
formate prin înlocuirea arcului de curbă cu coarda curbei. Eroarea metodei este dată de mica arie cuprinsă între
arcul de curbă şi coardă.
Cu cât diviziunea intervalului 0-d este mai fină, cu atât eroarea este mai mică.
Pentru a calcula volumul de apă dislocuit de navă se procedează în următorii paşi:
- Se consideră volumul de sub apă al navei tăiat în "felii" verticale denumite "cuple" (figura 1), la anumite
intervale pe lungimea navei, lungime măsurată pe axa x orientată de la prova către pupa. Fiecare dintre aceste
cuple are un contur curb definit prin "semilăţimi" măsurate pe o axă y orientată de la planul longitudinal vertical
central (numit plan diametral) către bord. Abscisa curbei cuplei este măsurată după o axă z orientată pe verticală
de la fundul navei către punte;
- Se calculează ariile cuplelor prin integrarea funcţiei contur a fiecărei cuple în parte. Astfel, rezultă o serie de
suprafeţe Ai, i=1,...,n ale cuplelor. Aceste valori Ai pot fi considerate ca descriind o "funcţie a ariilor imerse"
(scufundate), A(x), cu x variind de la 0 la L (figura 3);
- Se calculează volumul de sub apă al navei prin integrarea pe lungimea x a ariilor imerse după o
metodologie similară.

3. Crearea bazei de date a aplicaţiei


Baza de date a aplicaţiei constă dintr-un fişier text creat cu Notepad şi care conţine următoarele date, după
modelul discutat la capitolul 1:

0 0 6 3.75 4 4 4.85 2 2 1.21 0.5


1 0 0 7 4.25 5 5 5 3 3 1.52 1
2 0 0.5 0 12 6 5 4 4 2.01 2
3 0 1 1 1.5 0 7 5 5 5 3.37 3
4 0 2 2 2.5 0.5 0 24 6 4.19 4
5 0 3 3 3 1 1 3 0 7 4.54 5
6 0 4 4 3.75 2 2 3.75 0.5 0 36
7 0 5 5 4.5 3 3 4.25 1 1 0.35 0
0 4 6 4.85 4 4 4.85 2 2 1.017 0.5
1 0.25 0 7 5 5 5 5 3 3 1.261 1
2 0.75 0.5 0 16 6 5 4 4 1.529 2
3 1 1 1 3 0 7 5 5 5 2.2 3
4 1.25 2 2 3.75 0.5 0 28 6 3.244 4
5 1.5 3 3 4.25 1 1 2 0 7 3.622 5
6 2 4 4 4.85 2 2 3.25 0.5 0 40
7 3.5 5 5 5 3 3 4 1 1 0 0
0 8 6 5 4 4 4.64 2 2 0 0.5
1 1 0 7 5 5 5 4.92 3 3 0 1
2 1.69 0.5 0 20 6 5 4 4 0 2
3 2 1 1 3 0 7 5 5 5 0 3
4 2.4 2 2 3.75 0.5 0 32 6 0 4
5 3 3 3 4.25 1 1 0.71 0 7 0 5

Obs: datele de mai sus sunt scrise în fişier pe o singură coloană. Aici ele sunt scrise pe patru coloane pentru
economie de spaţiu.
Fişierul astfel completat se va salva cu denumirea Corp_L1.frm

4. Implementarea aplicaţiei în limbaj AutoLISP


Se parcurg următorii paşi:
- Se lansează în lucru programul AutoCAD;
- Se lansează comanda Tools>AutoLISP>Visual LISP Editor;
- În editorul de Visual LISP se aplică comanda File>New File;
- Se scrie următorul program în limbaj AutoLISP:
3
; Funcţie de comandă nouă pentru desenarea cuplelor navei şi calculul ariilor imerse şi a volumului.
(defun C:hydstat (/)
; Se încearcă identificarea unui fişier de date.
(if (setq filename (getfilename))
; Dacă fişierul a fost identificat:
(progn
; se deschide fişierul şi se memorează descriptorul de fişier df.
(setq df (open filename "r"))
; se salvează stările anterioare ale variabilelor de sistem care se vor modifica ulterior.
(setq oldcol (getvar "CECOLOR") oldblip (getvar "BLIPMODE")
oldcmdec (getvar "CMDECHO") oldsnap (getvar "OSMODE")
)
; se modifică variabilele de sistem de o manieră convenabilă.
(setvar "BLIPMODE" 0) (setvar "CMDECHO" 0) (setvar "OSMODE" 0) (setvar "CECOLOR" "RED")
; se şterg toate entităţile grafice existente.
(command "ERASE" "ALL" "")
; se extrage primul rând din fişierul de date. Variabila firstrow semnificând tratarea primului rând
; din fişier este pusă pe True.
(setq rowlist (extrlist df) firstrow T)
; Cât timp rândurile extrase din fişierul de date nu sunt vide:
(while rowlist
; se extrage prima valoare de pe rând şi se testează egalitatea ei cu 0.
(if (= (nth 0 rowlist) 0)
; Dacă este zero, atunci se extrage coordonata x a cuplei.
(progn
(setq xcrt (nth 1 rowlist))
; se testează dacă este cazul tratării primului rând din fişier.
(if firstrow
; Dacă da, se iniţializează trasarea primei polilinii 3D şi se trece variabila firstrow pe nil.
(progn (command "3DPOLY") (setq firstrow nil))
; Dacă nu, se încheie comanda de trasare a poliliniei anterioare şi se iniţiază una nouă.
(command "" "3DPOLY")
)
)
; Dacă prima valoare a rândului nu este zero, se extrag coordonatele y şi z curente şi se
; continuă comanda de desenare a poliliniei prin plasarea unui nou punct.
(progn
(setq ycrt (nth 1 rowlist) zcrt (nth 2 rowlist))
(command (list xcrt ycrt zcrt))
)
)
; Se extrage un nou rând din fişier.
(setq rowlist (extrlist df))
)
; Se încheie secvenţa de desenare a cuplelor.
(command "")
; Se închide fişierul de date.
(close df)
; Variabilele de sistem modificate se restaurează la valorile avute anterior.
(setvar "BLIPMODE" oldblip) (setvar "CMDECHO" oldcmdec)
(setvar "OSMODE" oldsnap) (setvar "CECOLOR" oldcol)
)
)
; Se calculează ariile imerse ale cuplelor şi volumul navei.
(compute filename)
; Ieşire” tăcută”.
(terpri)
)

; Funcţie pentru extragerea unui rând din fişierul de date


(defun extrlist (df /)
; se citeşte un rând de text din fişierul de date şi se testează dacă acesta nu este vid
(if (setq row (read-line df))
; Dacă rândul de text extras nu este vid, i se lipesc paranteze şi textul list, este citit în sens LISP
; adică este transformat în expresie neevaluată şi apoi este evaluată expresia. Rezultatul obţinut
; este returnarea rândului sub formă de listă de valori numerice.
(eval (read (strcat "(list " row ")")))
; Dacă rândul extras este vid (s-a atins sfârşitul de fişier) rezultatul returnat este nil.
)
)
4
; Funcţie pentru obţinerea numelui de fişier de date (identificare de fişier)
(defun getfilename()
(getfiled "Selectare fisier de date" "" "frm" 0)
)

; Funcţie de calcul. Ca dată de intrare este dat numele fişierului de date.


(defun compute (filename / df rowlist crtx lastx frmlst crtarea lastarea k volume)
; Se deschide pentru citire fişierul de date şi se memorează descriptorul de fişier df..
(setq df (open filename "r"))
; se extrage din fişierul de date de descriptor df primul rând listă din care se extrage coordonata x
; curentă şi se iniţializează contorul coastei k la zero.
(setq rowlist (extrlist df) crtx (nth 1 rowlist) k 0)
; din fişierul de date se extrage lista cuplei.
(setq frmlst (getframe crtx df))
; pe baza listei cuplei se calculează aria imersă a acesteia.
(setq crtarea (computearea frmlst))
; se scrie rezultatul calculului ariei imerse a cuplei k.
(write-line (strcat "A(" (itoa k) ")=" (rtos crtarea)))
; se memorează ultima arie calculată şi xoordonata x corespunzătoare.
(setq lastx crtx lastarea crtarea)
; se iniţializează la zero volumul navei şi se incrementează contorul de cuplă k.
(setq volume 0 k (1+ k))
; cât timp coordonata x următoare a ultimei liste de cuplă este număr (nu este nil) se integrează
(while (numberp (setq crtx (car (reverse frmlst))))
; se extrage următoarea listă de cuplă şi se calculează aria cuplei curente.
(setq frmlst (getframe crtx df) crtarea (computearea frmlst))
; se scrie rezultatul calculului ariei imerse a cuplei k.
(write-line (strcat "A(" (itoa k) ")=" (rtos crtarea)))
; se continuă integrarea volumului navei şi se memorează ultimul x, ultima arie, şi se incrementează contorul k.
(setq volume (+ volume (* 0.5 (+ crtarea lastarea) (- crtx lastx)))
lastx crtx lastarea crtarea k (1+ k)
)
)
; se închide fişierul de date.
(close df)
; se scrie volumul rezultat.
(write-line (strcat "V=" (rtos volume)))
)

; Funcţie de extragere a listei de cuplă. Datele de intrare sunt coordonata x curentă şi descriptorul
; de fişier de date.
(defun getframe (crtx df / stop framelist rowlist crty crtz)
; se iniţializează variabila logică stop pentru oprirea extragerii şi se iniţializează lista de cuplă cu
; coordonata x curentă.
(setq stop nil framelist (list crtx))
; cât timp nu s-a detectat oprirea extragerii:
(while (not stop)
; se extrage un nou rând listă din fişier şi se testează dacă acesta nu este vid.
(if (setq rowlist (extrlist df))
; dacă rândul listă nu este vid se testează dacă prima valoare de pe rînd este zero
(if (= (nth 0 rowlist) 0)
; dacă da, este vorba de începutul cuplei următoare. Se adaugă la lista de rând valoarea x
; a cuplei următoare. În consecinţă s-a detectat oprirea extragerii şi deci se pune stop pe True.
(setq framelist (append framelist (list (nth 1 rowlist))) stop T)
; dacă nu, rândul curent conţine o pereche de valori y şi z care se extrag, iar lista formată cu
; ele se alipeşte la lista de cuplă.
(setq crty (nth 1 rowlist) crtz (nth 2 rowlist)
framelist (append framelist (list (list crty crtz)))
)
)
; dacă rândul nou extras din fişier este vid, înseamnă că s-a atins sfârşitul fişierului. Deci, la
; lista de cuplă se adaugă textul "NIL" în locul coordonatei x a cuplei următoare (inexistentă)
; şi se comută variabila stop pe True (încheierea extragerii listei de cuplă).
(setq framelist (append framelist (list "NIL")) stop T)
)
)
; se forţează evaluarea listei de cuplă pentru obţinerea returnării ei la ieşirea din funcţie.
framelist
)
5
; Funcţie pentru calculul ariei imerse a cuplei.
; Datele de intrare se găsesc în lista framelist.
(defun computearea (framelist / pointslist n j framearea crty crtz lasty lastz)
; se separă din framelist numai lista punctelor cuplei pointslist
(setq pointslist (cdr (reverse (cdr (reverse framelist)))))
; se determină numărul de puncte al cuplei n, se iniţializează la 0 aria cuplei şi se reţin valorile
; y şi z anterioare – lasty şi lastz
(setq n (length pointslist) j 1 framearea 0
lasty (car (nth (1- j) pointslist)) lastz (cadr (nth (1- j) pointslist))
)
; cât timp contorul j este mai mic decât numărul de puncte se extrag valorile curente pentru y şi z
; şi se face calculul integral prin metoda trapezelor al ariei imerse a cuplei
(while (< j n)
(setq j (1+ j) crty (car (nth (1- j) pointslist)) crtz (cadr (nth (1- j) pointslist))
framearea (+ framearea (* (+ crty lasty) (- crtz lastz))) lasty crty lastz crtz
)
)
; se forţează evaluarea valorii ariei cuplei pentru a se produce efectul de returnare a valorii
; la ieşirea din funcţie
framearea
)
Obs.: Rândurile prefixate de caracterul ; sunt comentarii. Ele nu se vor scrie în programul AutoLISP.
Programul scris se salvează sub denumirea Hydrostat.LSP.

5. Explicaţii referitoare la datele manipulate de program


5.1. Lista de rând – rowlist
Un rând extras din fişierul de date este returnat de funcţia extrlist sub forma unei liste. Aceasta poate avea una
dintre formele: (0 x) sau (j y z). De exemplu, pentru a doua cuplă, se extrag listele:
(0 4), (1 0.25 0), (2 0.75 0.5), …, (7 3.5 5).
În primul caz avem de a face cu primul rând al unei secvenţe de definire a unei cuple, iar în al doilea caz cu
definiţia unui punct de pe curba cuplei. Coordonata x a punctului de pe cuplă este dată de al doilea element al listei
primului rând al cuplei (nth 1 rowlist), iar coordonatele y şi z sunt date de elementele al doilea şi al treilea (nth 1
rowlist) sau (nth 2 rowlist) ale unui rând neprim al cuplei.

5.2. Lista de cuplă – frmlst


Funcţia getframe concatenează informaţia referitoare la cupla curentă într-o listă care, pentru cupla curentă k,
este de forma:
(xk (yk,1 zk,1) (yk,2 zk,2) … (yk,mk zk,mk) xk+1)
În cazul ultimei cuple, deoarece nu mai există un xk+1, în locul lui este inserat şirul de text “NIL”.

6. Utilizarea aplicaţiei
Pentru utilizarea aplicaţiei AutoLISP se procedează astfel:
- După terminarea scrierii programului AutoLISP şi salvarea lui, de sub AutoCAD se lansează comanda
Tools>AutoLISP>Load… şi se încarcă programul Hydrostat.LSP;
- În linia de comandă din AutoCAD se scrie comanda Hydstat;

Fig. 4.

- Din cutia de dialog din figura 4 se selectează fişierul dorit (în cazul nostru Corp_L1.frm) din directorul dorit şi
se apasă butonul Open;
- Dacă programul a fost scris corect şi dacă fişierul de date este corect se va obţine imaginea din figura 5;
- Aplicând comanda Vpoint 1,1,1 , se obţine imaginea din figura 6.
- Pentru a vizualiza rezultatele numerice se apasă tasta F2 care deschide fereastra de dialog text a AutoCAD-ului
în care se va putea vedea următoarea secvenţă de text:
6

Fig. 5.

Fig. 6.

Command: hydstat
A(0)=0.0000
A(1)=15.3750
A(2)=27.7400
A(3)=38.9500
A(4)=46.3250
A(5)=46.3250
A(6)=46.3250
A(7)=44.3700
A(8)=27.5250
A(9)=20.6515
A(10)=0.0000
V=1254.3460
nil

7. Rezolvare alternativă sub EXCEL


Următoarea aplicaţie foloseşte Visual Basic sub Excel ca limbaj de programare.
Se vor parcurge următoarele etape de lucru:
- Se deschide un document EXCEL în care se desenează tabelul din figura 7. În celulele marcate cu culoarea gri
se vor introduce formule, restul celulelor fiind folosite pentru scrierea datelor şi a inscripţiilor;
7

Fig.7.

- După introducerea datelor în domeniile de celule C4:N10 şi D12:N12 se generează diagrama din figura 8, numită
"transversal al planului de forme al navei". Procedura de lucru pentru crearea acestei diagrame este următoarea:
= Se selectează domeniul de celule C4:D10;
= Se apasă butonul Chart Wizard de pe bara de instrumente Standard;
= Din cutia de dialog Chart Wizard Step 1 of 4 se selectează tipul Scatter, subtipul Scatter with data
points connected by lines without markers;
= Din cutia de dialog Chart Wizard Step 2 of 4 se selectează pagina Data Range în care se bifează Series in
Columns. Apoi se comută în pagina Series. Dacă am lăsa datele aşa cum le acceptă automat Excel, cuplele navei ar apare
culcate pe orizontală. De aceea, trebuie inversate seriile de valori x şi y între ele. Pentru aceasta, se selectează referinţele de
celule din câmpul X Values şi se mută cursorul, selectând domeniul de celule D4:D10. Apoi se selectează referinţele de
celule din câmpul Y Values şi se reselectează celulele din domeniul C4:C10. Pentru ca numele de identificare a diagramei
astfel construite să nu fie cel acordat automat (adică Series1) se introduce cursorul în câmpul Name şi se scrie C0;
= Se pot introduce acum serii noi de date folosind butonul Add şi procedând la introducerea datelor în
câmpurile X Values, Y Values şi Name la fel ca mai sus;
= Se apasă butonul Next pentru a se trece la pasul 3 al cutiei de dialog Chart Wizard. Aici, dacă se doreşte se
pot introduce inscripţii de identificare a diagramei. În figura 4 aceste facilităţi nu au fost folosite aşa încât se
poate trece la pasul 4 unde se alege opţiunea As new Sheet.
- Se aplică comanda Tools>Macro>Visual Basic Editor pentru a se deschide editorul Visual Basic;
- În editorul Visual Basic se crează o foaie de module în care se scriu funcţiile de mai jos:
- O funcţie pentru calculul ariei imerse a unei cuple. Această funcţie preia valorile de diviziune ale axei z prin
introducerea domeniului de celule care conţine aceste valori şi, analog, valorile semilăţimilor. Deoarece aceste valori
sunt situate pe coloane, se foloseşte proprietatea Count a subobiectului Rows a obiectului Range pentru a se
determina numărul de rânduri ale domeniului.
Se compară egalitatea lungimii domeniilor abscise - valori ale funcţiei contur al cuplei. Dacă aceste lungimi nu
sunt egale (ca o consecinţă a unei selectări greşite, funcţia returnează ca rezultat şirul de caractere "Eroare".

Fig. 8.

Dacă lungimile sunt egale se efectuează calculul integralei într-un ciclu For. Deoarece aria astfel calculată este
numai jumătate din aria efectivă (considerând şi partea din bordul simetric) valoarea obţinută este multiplicată cu 2 şi
este returnată de funcţie ca rezultat.
8
Function Arie_cupla(Dom_z As Range, Dom_y As Range)
lungz = Dom_z.Rows.Count
lungy = Dom_y.Rows.Count
If lungz = lungy Then
Arie_cupla = 0
For i = 1 To lungz - 1
z1 = Dom_z(i, 1)
z2 = Dom_z(i + 1, 1)
y1 = Dom_y(i, 1)
y2 = Dom_y(i + 1, 1)
Arie_cupla = Arie_cupla + 0.5 * (y2 + y1) * (z2 - z1)
Next i
Arie_cupla = 2 * Arie_cupla
Else
Arie_cupla = "Eroare"
End If
End Function

- O funcţie pentru calculul volumului de apă dislocuit. Această funcţie este concepută similar, cu următoarele
deosebiri:
= Datele sunt preluate din domenii de celule organizate pe rânduri, motiv pentru care este folosită proprietatea
Count a subobiectului Columns a obiectului Range;
= Nu se mai face multiplicare cu 2 deoarece volumul imers rezultă direct din calcul.
Function Volum_imers(Dom_x As Range, Dom_Arii As Range)
lungx = Dom_x.Columns.Count
lungar = Dom_Arii.Columns.Count
If lungx = lungar Then
Volum_intre_cuple = 0
For i = 1 To lungar - 1
x1 = Dom_x(1, i)
x2 = Dom_x(1, i + 1)
ar1 = Dom_Arii(1, i)
ar2 = Dom_Arii(1, i + 1)
Volum_ imers = Volum_ imers + 0.5 * (ar2 + ar1) * (x2 - x1)
Next i
Else
Volum_imers = "Eroare"
End If
End Function

Pentru a se putea folosi aceste funcţii se procedează astfel:


- Mai întâi se selectează domeniul de celule C4:C10;
- Se aplică comanda Insert>Name>Define;
- În cutia de dialog Define Name se va observa: existenţa în câmpul Refers to a referinţei de câmp care ar putea
să apară sub forma =Sheet1!$C$4:$C$10. Dacă referinţa este incorectă se va selecta şirul de caractere al referinţei şi
se va repeta selecţia câmpului referit din foaia de lucru; existenţa în câmpul Names in Workbook a unei denumiri -
în cazul de faţă notaţia z culeasă automat de către EXCEL din prima celulă de deasupra câmpului selectat. Vom
şterge această denumire şi vom scrie în locul ei domz;
Folosirea formulei de calcul a unei arii imerse se face astfel:
- Se plantează cursorul în celula D11;
- Se apasă butonul fx de pe bara de scule Standard;
- După deschiderea cutiei de dialog Paste function se selectează categoria de funcţii User Defined iar din lista de
funcţii se selctează funcţia Arie_cupla;
- După ce se apasă pe butonul OK şi este afişată cutia de dialog Arie_cupla se introduc, prin selecţie cu mouse-
ul, domeniile de celule pentru valorile z (Dom_z) şi pentru valorile semilăţimilor (Dom_y);
- O dată ce prima celulă pentru funcţia de arie a fost completată, celelalte celule se autocompletează folosind
metoda extinderii prin tragere, astfel: se selectează celula completată (D11), se "apucă" cu cursorul mouse de
"mânerul de extindere" (din partea din dreapta-jos a celulei) şi se "trage" peste celulele E1:N11;
- În sfârşit, pentru a calcula volumul imers, se selectează cursorul în celula N13 şi se apasă pe butonul fx de unde
se selectează funcţia Volum_imers;
- În cutia de dialog a funcţiei Volum_imers se introduc domeniile de celule D12:N12 pentru abscisele x şi
D11:N11 pentru mărimile ariilor transversale imerse.

Observaţie: În aplicaţia de mai sus valorile au fost exprimate în m pentru lungimi, m2 pentru arii şi m3 pentru volum.
Din acest motiv deplasamentul navei rezultă imediat în tone din înmulţirea volumului cu greutatea specifică a apei.
1

LABORATOR Nr.2
Interfaţări folosind AutoLISP, EXCEL şi Visual BASIC
1. Generarea unui fişier de date folosind AutoLISP sub AutoCAD
1.1. Scrierea programului AutoLISP
Se va genera o funcţie de comandă care va permite scrierea pe disc a unui fişier de date conţinând coordonatele
graficului funcţiei y=e-x sin x.
Programul AutoLISP necesar este dat mai jos:
; Funcţie de calcul a valorii funcţiei y
(defun y (x /) (* (exp (* -1 x)) (sin x)))

; Funcţie de scriere a unui rând în fişier. Funcţiile rtos convertesc o valoare reală în şir de caractere. Parametrul 1
; determină scrierea în format ştiinţific (cu exponent zecimal) iar parametrul 6 reprezintă precizia de scriere (cu 6
; zecimale). Funcţia strcat concatenează şiruri de caractere iar funcţia write-line execută scrierea în fişierul care are
; ca descriptor de fişier parametrul fis
(defun scriexy (x fis /)
(write-line (strcat "X=" (rtos x 1 6) " Y=" (rtos (y x) 1 6)) fis)
)

; Funcţie comandă de scriere a fişierului


(defun c:scriefis (/ np dx ip x df)
; Se definesc: np numărul de puncte de scris în fişier (100), dx pasul de calcul, ip contorul de ciclu şi
; x=0 valoarea de start
(setq np 100 dx (/ (* 2 pi) (1- np)) ip 0 x 0)
; Se deschide pentru scriere fişierul SINAMO.DAT. Funcţia open returnează ca rezultat o dată de tip special numită
; descriptor de fişier. Articolul disc\\cale se stabileşte de fiecare student în funcţie de configuraţia proprie.
(setq df (open "disc:\\cale\\SINAMO.DAT" "W"))
; Se rulează un ciclu de scriere în fişier afiecărui rând de date
(while (< ip np)
(scriexy x df)
(setq x (+ x dx) ip (1+ ip))
)
; Se închide fişierul
(close df)
)

1.2. Utilizarea programului


După salvarea programului într-un fişier cu numele Wrsin.Lsp, se încarcă în AutoCAD cu comanda Tools>Load
Application şi se scrie comanda scriefis.
Ca rezultat va fi scris fişierul SINAMO.DAT care avea structura următoare:

X=0.000000E+00 Y=0.000000E+00
X=6.283185E-02 Y=5.896666E-02
X=1.256637E-01 Y=1.105328E-01
...
X=6.220353E+00 Y=-1.248616E-04
X=6.283185E+00 Y=-1.704360E-17

2. Desenarea unei diagrame în AutoCAD cu date citite din fişier, folosind AutoLISP
2.1. Scrierea programului AutoLISP
Se va genera o funcţie de comandă care va permite citirea datelor dintr-un fişier şi reprezentarea lor sub formă de
diagramă.
Programul AutoLISP necesar este dat mai jos:
; Funcţie de citire a unui punct din fişier. Parametrul de intrare în funcţie este un descriptor de fişier
(defun citeste_punct (fis / rnd)
; Este citită o linie (rând) din fişier
(if (setq rnd (read-line fis))
; Funcţia extpct extrage lista punctului din rândul citit
(extpct rnd)
)
)
2
; Funcţie de extragere a unui punct (creare de listă de punct) dintr-un rând de text citit din fişierul de date
(defun extpct (rnd / drnd)
; Se crează o copie (dublură) a rândului de date citit. Dublura are numele drnd şi pe ea se vor opera o serie de
; prelucrări ulterioare. Se iniţializează variabila logică cauta la valoarea t şi contorul de explorare a rândului la
; valoarea 0
(setq drnd rnd cauta t contor 0)
; Se rulează un ciclu de prelucrare a rândului
(while cauta
; Se avansează contorul de caracter cu o unitate
(setq contor (1+ contor))
; Dacă rezultatul extragerii primelor trei caractere ale rândului este şirul " Y=" atunci căutarea a luat sfârşit şi
; simbolul cauta devine nil. Altfel, din şirul drnd este eliminat primul caracter şi se va continua căutarea. Valoarea
; simbolului contor va fi indicele din şir a caracterului spaţiu care separă textele descriptoare ale coordonatelor
; X şi Y;
(if (equal (substr drnd 1 3) " Y=")
(setq cauta nil)
(setq drnd (substr drnd 2))
)
)
; Se crează lista de punct extrăgându-se din şirul rnd numai părţile cu semnificaţie numerică şi, cu ajutorul funcţiei
; atof, convertindu-le în valori numerice reale. Funcţia extpct va returna ca rezultat lista de punct deoarece ea este
; ultima evaluare din corpul funcţiei
(list (atof (substr rnd 3 (- contor 2)))
(atof (substr rnd (+ contor 3)))
)
)

; Funcţie de desenare a diagramei


(defun c:diagrama (/ df pt)
; Se deschide fişierul de date. Articolul disc\\cale se stabileşte de fiecare student în funcţie de configuraţia proprie
(setq df (open "disc:\\cale\\SINAMO.DAT" "R"))
; Se iniţiază comanda Polyline
(command "PLINE")
; Se rulează un ciclu de citire din fişier a datelor şi conversie a lor în liste de puncte care sunt furnizate ca date
; comenzii de trasare a polininiei aflată în derulare
(while (setq pt (citeste_punct df)) (command pt))
; Se încheie comanda Polyline
(command "")
)

Fig. 1.

2.2. Utilizarea programului


După salvarea programului într-un fişier cu numele Rdfunc.Lsp, se încarcă în AutoCAD cu comanda
Tools>Load Application şi se scrie comanda diagrama. Rezultatul obţinut va fi cel din figura 1.

3. Generarea unui fişier de date folosind Visual BASIC for Applications (VBA) sub EXCEL
3.1. Crearea fişierului EXCEL
Cu ajutorul programului EXCEL se crează mai întâi un fişier denumit Operare.xls.

Fig. 2.
3

În acest fişier, în pagina Sheet1 se organizează capul de tabel din domeniul A1:B1 şi se scriu datele de pe rândul
2 (domeniul A2:B2), pentru funcţia:
y=e-cx Asin(x)
n fiind numărul de intervale pentru care se calculează funcţia pe domeniul 0…2π.

3.2. Scrierea programului în VBA


În editorul de VBA din EXCEL se generează foaia Module1 în care se scrie următorul program:

Sub ScrieFis()
‘ Valoarea celulei A2 se atribuie variabilei c
c = Application.Worksheets("Sheet1").Cells(2, 1)
‘ Valoarea celulei B2 se atribuie variabilei A
A = Application.Worksheets("Sheet1").Cells(2, 2)
‘ Valoarea celulei C2 se atribuie variabilei n
n = Application.Worksheets("Sheet1").Cells(2, 3)
‘ se stabileşte calea către fişierul de creat. Fiecare student va proceda conform cu configuraţia proprie
cale = "Disc:\Cale\SINAMO.DAT"
‘ Se deschide fişierul pentru scriere. Dacă nu există este creat. Dacă există va fi suprascris.
Open cale For Output Access Write Lock Write As #1
‘ Se calculează lungimea domeniului de calcul
Pi = 4 * Atn(1)
‘ Se calculează fiecare punct din domeniu
For j = 0 To n
x = j * 2 * Pi / n
y = Exp(-c * x) * A * Sin(x)
‘ Se formează şi se alipesc şirurile de caractere componente şi se scriu în fişier
Print #1, "X=" & CStr(x) & " Y=" & CStr(y)
Next j
‘ Se închide fişierul
Close #1
End Sub

Se revine în foaia Sheet1.


Se deschide cutia de dialog Forms aplicând comanda View>Toolbars>Forms şi se crează butonul Scrie date.
Acest buton se asociază cu subrutina ScrieFis folosind comanda Assign Macro.

3.3. Folosirea programului


Programul se foloseşte simplu, apăsând butonul Scrie date.
Dacă se doreşte, valorile c, A, sau chiar n pot fi modificate acţionând asupra celulelor corespunzătoare.
Din EXCEL nu este vizibil nici un efect. Trebuie deschis fişierul SINAMO.DAT folosind Notepad.
Conţinutul lui este următorul:
X=0 Y=0
X=6.28318530717959E-02 Y=5.89666627512599E-02
X=0.125663706143592 Y=0.110532804759263
X=0.188495559215388 Y=0.155189988238673

X=6.28318530717959 Y=-4.57376446929804E-19

4. Exploatarea unui fişier de date folosind Visual BASIC for Applications sub EXCEL
4.1. Crearea fişierului EXCEL
Se foloseşte acelaşi fişier denumit anterior Operare.xls.
Se generează capul de tabel din celulele B4 şi C4 (inscripţiile x şi y) pentru datele citite din fişierul de date.

4.2. Scrierea programului în VBA


În editorul de VBA din EXCEL, în foaia Module1, se scrie următorul program:
Sub CitesteFis()
‘ se stabileşte calea către fişierul de creat. Fiecare student va proceda conform cu configuraţia proprie
cale = "Disc:\Cale\SINAMO.DAT"
‘ Se selectează domeniul de sub capul de tabel pentru date citite şi i se şterge conţinutul
Range(Cells(5, 2), Cells(65535, 3)).Select
Selection.ClearContents
‘ Se selectează celula D4
Range("D4:D4").Select
‘ se deschide fişierul de date pentru citire şi se iniţializează contorul de rânduri citite j
Open cale For Input Access Read Lock Write As #1
j=0
4
‘ Cât timp nu s-a atins sfârşitul de fişier
While Not EOF(1)
‘ citeşte o linie de text din fişierul de date
Line Input #1, textline
‘ determină lungimea şirului de text
ncar = Len(textline)
‘ iniţializează variabila logică blank cu valoarea False
blank = False
‘ se iniţializează contorul de caractere explorate
k=1
‘ Cât timp nu s-a întâlnit caracterul spaţiu
While Not blank
‘ se extrage caracterul de indice k din şirul de text
character = Mid(textline, k, 1)
‘ Dacă caracterul este spaţiu variabila blank devine True, altfel se incrementează contorul de caractere pentru
‘ continuarea explorării
If character = " " Then
blank = True
Else
k=k+1
End If
Wend
‘ se extrage şirul de caractere reprezentând valoarea lui x şi apoi cel reprezentând valoarea lui y prin ignorarea
‘ caracterelor nenumerice x y şi spaţiu
Xstr = Mid(textline, 3, k - 2)
Ystr = Mid(textline, k + 3)
‘ Se convertesc şirurile de text în valori numerice şi se plasează în celulele de pe rândul corespunzător
Application.Worksheets("Sheet1").Cells(5 + j, 2) = Val(Xstr)
Application.Worksheets("Sheet1").Cells(5 + j, 3) = Val(Ystr)
‘ se incrementează de rânduri citite
j=j+1
Wend
‘ se închide fişierul de date
Close #1
End Sub

Se revine în foaia Sheet1.


Se deschide cutia de dialog Forms aplicând comanda View>Toolbars>Forms şi se crează butonul Citeste date.
Acest buton se asociază cu subrutina CitesteFis folosind comanda Assign Macro.
Folosind instrumentul de creare de diagrame Chart Wizard se crează diagrama din figura 3 într-o foaie separată
Chart1.

Fig.3.

4.3. Folosirea programului


Programul se foloseşte simplu, apăsând butonul Citeste date.
5

5. Folosirea multiplă a facilităţilor create în această lucrare


Subiectul central al aplicaţiilor din această lucrare este fişierul de date SINAMO.DAT, aşa cum se prezintă în
figura 4.
El poate fi exploatat în diverse moduri, conform direcţiilor evidenţiate cu cifre romane.

Fig. 4.

I. Generarea fişierului de date din AutoCAD folosind AutoLISP (punctul 1.2 al aplicaţiei), apoi încărcarea în
AutoCAD folosind AutoLISP a fişierului şi desenarea curbei (punctul 2.2 al aplicaţiei);
II. Generarea fişierului de date de sub EXCEL folosind VBA (punctul 3.3 al aplicaţiei), apoi încărcarea fişierului
tot în EXCEL şi completarea câmpurilor de date (punctul 4.3 al aplicaţiei). Diagrama Chart1 se actualizează automat;
III. Generare din AutoCAD cu AutoLISP (punctul 1.2) şi încărcare în EXCEL prin VBA (punctul 4.3);
IV. Generare din EXCEL prin VBA (punctul 3.3) urmată de încărcare din AutoCAD prin AutoLISP (punctul
2.2);
V. Aplicaţie directă sub AutoCAD fără folosirea transferului datelor prin fişier. În acest caz, în locul aplicaţiilor
AutoLISP de la punctele 1 şi 2 se foloseşte o singură aplicaţie AutoLISP simplificată astfel:

(defun c:directdraw (/)


(setq np 100 dx (/ (* 2 pi) np) ip 0 x 0)
(command "PLINE")
(while (<= ip np)
(command (list x (y x)))
(setq x (+ x dx) ip (1+ ip))
)
(command "")
)

(defun y (x /) (* (exp (* -1 x)) (sin x)))

VI. Efectuarea directă şi integrală a aplicaţiei sub EXCEL prin eliminarea apelului la subrutine scrise în VBA şi
deci eliminarea scrierii şi exploatării fişierului de date se poate realiza folosind numai calculul celular.
Conform figurii 5, domeniul C5:C106 se completează cu indicii punctelor
diagramei.
În celula B5 se introduce formula =A5*2*PI()/$C$2
iar în celula C5 se introduce formula =EXP(-$A$2*B5)*$B$2*SIN(B5)
Se selectează domeniul B5:C5 şi se extinde prin tragere până la domeniul de
celule B106:C106 inclusiv.

Obs.: Metodele V şi VI au avantajul simplităţii şi rapidităţii dar sunt aplicaţii


“închise” în ele însele neoferind posibilitatea intercomunicării între programe.
Fig. 5.
1

LABORATOR Nr. 3
Interfaţare EXCEL – AutoCAD folosind fişier LISP
Definirea problemei
Vom realiza o aplicaţie care foloseşte o tehnică de lucru de desenare a formelor coastelor navei folosind
comenzi simple în limbaj AutoLISP.

Fig.1.

Mai exact, vom folosi Excel ca bază de date pentru formele navei şi totodată ca generator al unui program LISP care să
producă desenarea acestor forme în AutoCAD. Programul LISP generat va fi extrem de simplu ca structură, conţinând numai
funcţiile LISP care comandă desenarea. Acest program nu exploatează baza de date din Excel deoarece, neexistând
modalităţi de comunicare directă între AutoLISP şi Excel, această exploatare nu este posibilă. Ar trebui să se creeze un fişier
text, extras al datelor din baza de date din Excel, fişier pe care AutoLISP l-ar putea citi. Dar aceasta ar însemna dublarea
practic a bazei de date, modalitate ineficientă de lucru. Ca urmare fişierul program AutoLISP rezultat nu va exploata o bază
de date ci o va reflecta. Evident, programul rezultat este inflexibil şi va executa mereu acelaşi lucru. Flexibilitatea aplicaţiei
rezultă din posibilităţile de variabilitate ale programului Visual Basic din Excel care generează programul fix AutoLISP.

Construirea fişierul Excel


În continuare, vom expune regulile de completare a fişierului.
- Fişierul conţine o singură foaie în care pe coloanele 1, 2 şi 3 sunt înscrise coordonatele în sistem normalizat
ale unei nave cu L=1, B=1 şi T=1;
- Nava este descrisă prin cuple. Mai puţin prima cuplă, toate celelalte sunt precedate de caracterul F scris în celula
de pe coloana 1 anterioară primului punct al seriei care descrie cupla;
- La sfârşitul seriilor de date, în prima celulă de pe ultimul rând este plasat caracterul E.
În acest mod nava este descrisă printr-un singur grup de curbe de secţiune.
- În celula de pe coloana 4 a primului rând este introdusă valoarea lungimii navei. Celula primeşte numele
Lung;
- În celula de pe coloana 5 a primului rând este introdusă valoarea lăţimii navei. Celula primeşte numele Lat;
- În celula de pe coloana 6 a primului rând este introdusă valoarea pescajului navei. Celula primeşte numele
Pesc;
- În celula de pe coloana 4 a unui rând cu coordonate se introduce formula =celulax*Lung , unde celulax
este referinţa celulei care conţine coordonata normalizată x. De exemplu în celula D2 se va găsi formula
=A2*Lung;
- În celula de pe coloana 5 a unui rând cu coordonate se introduce formula =celulay*Lat/2 , unde celulay
este referinţa celulei care conţine coordonata normalizată y. De exemplu în celula E2 se va găsi formula
=B2*Lat/2;
- În celula de pe coloana 6 a unui rând cu coordonate se introduce formula =celulaz*Pesc , unde celulaz este
referinţa celulei care conţine coordonata normalizată z. De exemplu în celula F2 se va găsi formula =C2*Pesc;
2

Toate celelalte celule cu coordonate transformate se vor autocompleta folosind facilitatea de extindere a unei
formule prin tragere.
De aici încolo orice modificare a valorilor pentru lungime, lăţime şi pescaj produce modificarea automată a
coordonatelor transformate.
Foaia Sheet1 a documentului Corp.xls va arăta ca în figura 1.
Setul complet de date pentru forma adimensionalizată (numai coloanele A, B şi C) este cel din tabelul 1.

Tabelul 1
A B C A B C A B C
2 0 0 1 40 F 78 0.7 1 0.6
3 0 0.01 1 41 0.4 0 0 79 0.7 1 0.8
4 0 0.03375 1.2 42 0.4 0.85 0 80 0.7 1 1
5 0 0.0573 1.4 43 0.4 1 0.2 81 0.7 1 1.2
6 0 0.12 1.6 44 0.4 1 0.4 82 0.7 1 1.4
7 F 45 0.4 1 0.6 83 0.7 1 1.6
8 0.1 0 0 46 0.4 1 0.8 84 F
9 0.1 0.025 0 47 0.4 1 1 85 0.8 0 0
10 0.1 0.2375 0.2 48 0.4 1 1.2 86 0.8 0.320916 0
11 0.1 0.30125 0.4 49 0.4 1 1.4 87 0.8 0.587392 0.2
12 0.1 0.330625 0.6 50 0.4 1 1.6 88 0.8 0.6625 0.4
13 0.1 0.358125 0.8 51 F 89 0.8 0.740625 0.6
14 0.1 0.394375 1 52 0.5 0 0 90 0.8 0.83125 0.8
15 0.1 0.442406 1.2 53 0.5 0.85 0 91 0.8 0.93 1
16 0.1 0.519197 1.4 54 0.5 1 0.2 92 0.8 0.98375 1.2
17 0.1 0.62875 1.6 55 0.5 1 0.4 93 0.8 1 1.4
18 F 56 0.5 1 0.6 94 0.8 1 1.6
19 0.2 0 0 57 0.5 1 0.8 95 F
20 0.2 0.35 0 58 0.5 1 1 96 0.9 0 0
21 0.2 0.66934 0.2 59 0.5 1 1.2 97 0.9 0.0375 0
22 0.2 0.72875 0.4 60 0.5 1 1.4 98 0.9 0.19 0.2
23 0.2 0.75625 0.6 61 0.5 1 1.6 99 0.9 0.239541 0.4
24 0.2 0.77875 0.8 62 F 100 0.9 0.315625 0.6
25 0.2 0.80875 1 63 0.6 0 0 101 0.9 0.45125 0.8
26 0.2 0.84375 1.2 64 0.6 0.85 0 102 0.9 0.6475 1
27 0.2 0.885625 1.4 65 0.6 1 0.2 103 0.9 0.796875 1.2
28 0.2 0.929375 1.6 66 0.6 1 0.4 104 0.9 0.8725 1.4
29 F 67 0.6 1 0.6 105 0.9 0.904375 1.6
30 0.3 0 0 68 0.6 1 0.8 106 F
31 0.3 0.7125 0 69 0.6 1 1 107 1 0 1
32 0.3 0.96625 0.2 70 0.6 1 1.2 108 1 0.328125 1.1
33 0.3 0.98375 0.4 71 0.6 1 1.4 109 1 0.4125 1.2
34 0.3 0.9935 0.6 72 0.6 1 1.6 110 1 0.483667 1.3
35 0.3 0.9985 0.8 73 F 111 1 0.531232 1.4
36 0.3 1 1 74 0.7 0 0 112 1 0.5625 1.5
37 0.3 1 1.2 75 0.7 0.62 0 113 1 0.5875 1.6
38 0.3 1 1.4 76 0.7 0.9375 0.2 114 E
39 0.3 1 1.6 77 0.7 0.98625 0.4 115

Pentru a forma listele de coordonate ale punctelor, vom scrie următoarea funcţie în Visual Basic:
Function PunctAcad(x, y, z)
PunctAcad = "'(" & CStr(x) & " " & CStr(y) & " " & CStr(z) & ")"
End Function

Ca urmare, în celula de pe coloana 7 a fiecărui rând cu coordonate se va introduce formula PunctAcad. De


exemplu, în celula G2 se va găsi formula =PunctAcad(D2,E2,F2). Efectul va fi de scriere în celula G2 a
expresiei listă îngheţată '(0 0 8).
Pentru generarea fişierului AutoLisp, se va folosi subrutina în Visual Basic următoare:
Sub Scrie_Lisp()
Dim Celula As Object
Set Celula = Application.Worksheets("Sheet1").Cells
3
cale = "C:\Tccn\G2141a\Cad\Corp.lsp"
Open cale For Output Access Write Lock Write As #1
inicmd = "(command " & Chr(34) & "3dpoly" & Chr(34)
cmd = inicmd
gatafisier = False
gatapline = False
i=2
While Not gatafisier
cel = Celula(i, 1)
If cel = "E" Then
gatafisier = True
gatapline = True
Else
If cel = "F" Then gatapline = True
End If
If gatapline Then
cmd = cmd & " " & Chr(34) & Chr(34) & ")"
Print #1, cmd
If Not gatafisier Then
cmd = inicmd
gatapline = False
End If
Else
cmd = cmd & " " & CStr(Celula(i, 7))
End If
i=i+1
Wend
Close #1
Set Celula = Nothing
End Sub

Fişierul creat, de tip text, va fi compus dintr-un număr de linii (câte una pentru fiecare cuplă) conţinând funcţia
command de trasare a unei polilinii 3D. Pentru prima cuplă funcţia va fi:

(command "3dpoly" '(0 0 8) '(0 0.1 8) '(0 0.3375 9.6) '(0 0.573 11.2) '(0 1.2 12.8) "")

Exploatarea fişierului AutoLISP din AutoCAD


Exploatarea manuală.
Se lansează în lucru programul AutoCAD.
Se împarte câmpul de lucru în 4 porturi de vedere.
Se setează porturile de vedere ca proiecţii Front, Top, Left şi NE Isometric.
Acum, efectuând din AutoCAD comanda de încărcare a fişierului Corp.lsp, rezultatul va fi desenarea foarte
rapidă a setului de cuple. Avantajul procedeului este acela de a putea efectua foarte rapid modificări de
coordonate sau dimensiuni generale ale navei şi de a obţine imediat fişierul AutoLisp modificat, iar apoi
redesenarea cuplelor modificate.

Automatizarea exploatării fişierului AutoLISP.


Ne vom servi de o tehnică deja cunoscută parcurgând următoarele etape:
- De sub Excel se crează o subrutină de scriere a unui fişier SCRIPT şi lansare în lucru a programului
AutoCAD. Ea va fi următoarea:
Sub Create_Script_and_Launch()
calescr = "C:\Tccn\G2141a\Cad\Launch.scr"
calelsp = "C:\\Tccn\\G2141a\\Cad\\Corp.lsp"
Open calescr For Output Access Write Lock Write As #1
Print #1, "vpoint 1,0,0"
Print #1, "(load " & Chr(34) & calelsp & Chr(34) & ")"
Print #1, "zoom all"
Close #1
Shell "C:\Program Files\AutoCAD R14\acad.exe /b C:\TCCN\G2141a\CAD\Launch.scr", _
vbNormalFocus
End Sub

- Se construieşte un obiect grafic de comandă. El poate fi o diagramă ca aceea din figura 5, un simplu
dreptunghi cu text, sau un buton de comandă construit cu bara de instrumente Forms, şi asociat cu
macrocomanda Create_Script_and_Launch.
- Când se apasă obiectul de comandă creat, au loc următoarele acţiuni (urmăriţi textul subrutinei de mai sus):
În directorul C:\Tccn\G2141a\Cad este creat fişierul script Launch.scr care conţine textul:
4

vpoint 1,0,0
(load "C:\\Tccn\\G2141a\\Cad\\Corp.lsp")
zoom all

Este lansat în lucru programul AutoCAD cu directiva de încărcare a fişierului Launch.scr şi de comutare de
către sistemul de operare a ţintei intrărilor în AutoCAD.
Este încărcat fişierul Launch.scr şi începe execuţia comenzilor lui.
Prima comandă este de stabilire a vederii din punctul x=1, y=0 şi z=0 către origine.
A doua comandă încarcă fişierul AutoLISP Corpacad.lsp şi execută comenzile din el.
A treia comandă produce încadrarea completă a desenului.
Din acest moment AutoCAD rămâne deschis şi activ (mai departe se poate lucra în el).
Dacă se doreşte repetarea comenzii din Excel, AutoCAD trebuie închis, altfel sistemul de operare va
deschide o instanţă paralelă.
1

LABORATOR Nr. 4
Interfaţare Multisurf – AutoCAD prin program AutoLISP
1. Definirea temei
În această lucrare vom prezenta o metodă de lucru constând din generarea de către o altă aplicaţie a unui
fişier de date şi exploatarea acestor date de către o altă aplicaţie folosind un program scris într-un limbaj de
programare şi care filtrează datele extrase şi execută comenzile necesare îndeplinirii sarcinii de lucru.
Mai exact, în acest caz vom folosi programul MultiSurf ca generator a unei baze de date pentru formele
navei. Informaţia privitoare la formă va fi stocată în fişierul shiplins.3da. Programul AutoLISP va fi generat cu
un editor de text ASCII, în cazul nostru NotePad sau editorul de Visual LISP din AutoCAD, şi apoi va fi încărcat
şi executat de sub AutoCAD.

2. Generarea bazei de date.


Se foloseşte programul MultiSurf.
Dacă nu aveţi un model de navă creat anterior vom crea rapid unul pentru o ambarcaţiune cu forme simple.
Etapele de parcurs sunt următoarele:
- Se deschide programul Multisurf cu setările iniţiale Units: m-MT, Home View: Latitude 30 Longitude 135
Ortographic, Divs Multiplier:1.
- Se crează modelul navei din figura 1, conform indicaţiilor din tabelul 1, de mai jos:

Fig. 1.
Tabelul 1
Nume Semnificaţie Tip Suporţi şi valori
BP Base Point AbsPoint x=0, y=0, z=0
SP Side Point RelPoint BP, dx=0, dy=1.5, dz=0
FP Fore Point RelPoint BP, dx=10, dy=0, dz=0
HP Height Point RelPoint BP, dx=0, dy=0, dz=1.5
SPl Side Plane Plane2 SP, BP
FPl Fore Plane Plane2 FP, BP
HSP Height Side Point ProjPoint HP, SPl
FHP Fore Height Point ProjPoint HP, FPl
FBSP Fore Base Side Point ProjPoint SP, FPl
FHSP Fore Height Side Point ProjPoint HSP, FPl
CL Center Line Line BP, FP
SL Side Line Line SP, FBSP
SHL Side Height Line Line HSP, FHSP
CB1 Center Bead 1 AbsBead CL, t=0.95
CB2 Center Bead 2 AbsBead CL, t=0.84
CB3 Center Bead 3 AbsBead CL, t=0.62
2

SB1 Side Bead 1 AbsBead SL, t=0.75


SB2 Side Bead 2 AbsBead SHL, t=0.82
MCv3 Master Curve 3 BCurve Type=2, BP, SP, HSP
MCv4 Master Curve 4 BCurve Type=2, CB3, SB1, SB2
MCv5 Master Curve 5 BCurve Type=2, CB2, CB1, FHP
MCv1 Master Curve 1 MirrCurve MCv5, *X=0
MCv2 Master Curve 2 MirrCurve MCv4, *X=0
HullSf Hull Surface BLoftSurf MCv1, MCv2, MCv3, MCv4, MCv5
Frm Frames XContours First Index=0, Last Index=20, X0=-10, Xint=1, HullSf
WL Water Lines ZContours First Index=0, Last Index=5, Z0=0, Zint=0.3, HullSf
BL Butock Lines YContours First Index=0, Last Index=5, Y0=0, Yint=0.3, HullSf

Pentru accesul la comenzile de creare a entităţilor de pe coloana Tip a tabelului 1 se accesează articolele de
meniu ca mai jos:
- AbsPoint: Create>Point>3-D Point>AbsPoint
- RelPoint: Create>Point>3-D Point>RelPoint
- Plane2: Create>Plane>Plane2
- ProjPoint: Create>Point>3-D Point>ProjPoint
- Line: Create>Curve>Line
- AbsBead: Create>Point>Bead>AbsBead
- Bcurve: Create>Curve>BCurve
- MirrCurve: Create>Curve>MirrCurve
- BloftSurf: Create>Surface>Lofted Surface>BloftSurf
- Xcontours: Create>Contours>XContours
- Zcontours: Create>Contours>ZContours
- Ycontours: Create>Contours>YContours

Fig.2.

- Se aplică comanda View/Ship Lines cu opţiunile: Body plan division (xbody)=5, Body plan factor
(bfac)=1, Style=1 (Body plan above, different scale). Va rezulta reprezentarea din figura 2.
În acest moment fişierul shiplins.3da este creat şi îşi aşteaptă utilizarea.

3. Scrierea programului AutoLISP.


- Se deschide programul NotePad pentru editarea fişierului program sursă în AutoLISP. Dacă se lucrează cu
versiunea AutoCAD 2000 sau superioară, aceasta are propriul său editor de AutoLISP, şi deci folosirea
editorului NotePad nu mai este necesară;
- Se scrie programul următor, şi apoi se salvează cu numele Corpacad.lsp:
(defun c:ms2draw (/)
(if (setq filename (numefis))
(progn
(setq df (open filename "r"))
(setq oldcol (getvar "CECOLOR") oldblip (getvar "BLIPMODE")
oldcmdec (getvar "CMDECHO") oldsnap (getvar "OSMODE")
)
(setvar "BLIPMODE" 0) (setvar "CMDECHO" 0) (setvar "OSMODE" 0)
(setq eof nil)
(command "ERASE" "ALL" "")
(setq rowlist (extrlista df))
(setq xpnt1 (nth 1 rowlist) ypnt1 (nth 2 rowlist) zpnt1 (nth 3 rowlist))
(while (not eof)
(setq coasta T first T)
(setq rowlist (extrlista df))
(setq color (eqcolor (nth 0 rowlist))
3
xpnt2 (nth 1 rowlist) ypnt2 (nth 2 rowlist) zpnt2 (nth 3 rowlist)
)
(setvar "CECOLOR" (itoa color))
(command "3DPOLY" (list xpnt1 ypnt1 zpnt1))
(while coasta
(if first
(progn
(command (list xpnt2 ypnt2 zpnt2)) (setq first nil))
(if (setq rowlist (extrlista df))
(progn
(setq color (eqcolor (nth 0 rowlist))
xpnt2 (nth 1 rowlist) ypnt2 (nth 2 rowlist)
zpnt2 (nth 3 rowlist)
)
(if (= color 0)
(progn
(setq coasta nil xpnt1 xpnt2 ypnt1 ypnt2 zpnt1 zpnt2)
(command "")
)
(command (list xpnt2 ypnt2 zpnt2))
)
)
(progn (setq eof T coasta nil) (command ""))
)
)
)
)
(close df)
(setvar "BLIPMODE" oldblip)
(setvar "CMDECHO" oldcmdec)
(setvar "OSMODE" oldsnap)
)
)
(terpri)
)

(defun extrlista (df /)


(if (setq row (read-line df))
(eval (read (strcat "(list " row ")")))
)
)

(defun eqcolor (color / accol)


(setq accol(list 0 172 84 125 14 212 36 253 135 150 100 130 11 211 50 255))
(nth color accol)
)

(defun numefis()
(getfiled "Selectare fisier de linii" "" "3da" 0)
)
- După salvarea programului, se închide programul NotePad. El poate fi totuşi lăsat deschis, pentru eventuale
acţiuni de depanare.

4. Folosirea programului AutoLISP.


- Se deschide programul AutoCAD;
- Se lansează comanda Tools/Load Application. Va avea loc deschiderea cutiei de dialog Load
AutoLISP, ADS and ARX files;
- Se apasă butonul File. Se deschide cutia de dialog Select AutoLISP, ADS or ARX file. Se selectează
fişierul Corpacad.lsp;
- După revenirea în cutia de dialog Load AutoLISP, ADS and ARX files, se selectează numele
fişierului Corpacad.lsp din lista Files to Load şi se apasă butonul Load;
- Se lansează comanda MS2DRAW şi va avea loc deschiderea cutiei de dialog Selectare fisier de linii
din care se alege fişierul shiplins.3da dorit;
- Are loc imediat desenarea modelului.

Obs: Deoarece limbajul AutoLISP încă nu v-a fost predat iar depanarea programelor scrise în acest limbaj
poate fi ceva mai dificilă decât în cazul altor limbaje, căutaţi să transcrieţi programul cu maximă acurateţe, în
special în privinţa numărului şi tipului parantezelor şi, de asemenea, în privinţa ghilimelelor.
1

LABORATOR Nr. 5
Interfaţare EXCEL – AutoCAD prin fişier SCRIPT
1. Interfaţare prin scriere manuală a fişierului SCRIPT
1.1. Crearea unui fişier bază de date.
Acest lucru se poate face cu un fişier Excel organizat astfel:
- Fişierul conţine o singură foaie în care pe coloanele 1, 2 şi 3
sunt înscrise coordonatele normalizate ale unei nave cu L=1, B=1
şi T=1;
- Nava este descrisă prin cuple. Mai puţin prima cuplă, toate
celelalte sunt precedate de caracterul F scris în celula de pe
coloana 1 anterioară primului punct al seriei care descrie cupla;
- La sfârşitul seriilor de date, în prima celulă de pe ultimul
rând este plasat caracterul E.
În acest mod nava este descrisă printr-un singur grup de curbe
de secţiune.
- În celula de pe coloana 4 a primului rând este introdusă
valoarea lungimii navei. Celula primeşte numele Lung;
- În celula de pe coloana 5 a primului rând este introdusă
valoarea lăţimii navei. Celula primeşte numele Lat;
- În celula de pe coloana 6 a primului rând este introdusă
valoarea pescajului navei. Celula primeşte numele Pesc;
- În celula de pe coloana 4 a unui rând cu coordonate se
introduce formula =celulax*Lung , unde celulax este referinţa
Fig.1. celulei care conţine coordonata normalizată x. De exemplu în
celula D2 se va găsi formula =A2*Lung;
- În celula de pe coloana 5 a unui rând cu coordonate se introduce formula =celulay*Lat/2 , unde celulay este
referinţa celulei care conţine coordonata normalizată y. De exemplu în celula E2 se va găsi formula =B2*Lat/2;
- În celula de pe coloana 6 a unui rând cu coordonate se introduce formula =celulaz*Pesc , unde celulaz este
referinţa celulei care conţine coordonata normalizată z. De exemplu în celula F2 se va găsi formula =C2*Pesc;
Toate celelalte celule cu coordonate transformate se vor autocompleta folosind facilitatea de extindere a unei
formule prin tragere.
De aici încolo orice modificare a valorilor pentru lungime, lăţime şi pescaj produce modificarea automată a
coordonatelor transformate.
Foaia Sheet1 a documentului Corp.xls va arăta ca în figura 1.
Setul complet de date pentru forma adimensionalizată (numai coloanele A, B şi C) este cel din tabelul 1.

1.2. Crearea fişierului de comenzi SCRIPT


Pentru a desena în AutoCAD curba unei coaste putem folosi comanda 3DPOLY şi proprietatea de repetare a
unei comenzi la apăsarea tastei ENTER (introducerea unei linii noi) sa la apăsarea tastei spaţiu. Încheierea
comenzii se face prin apăsarea tastei ENTER.
Aşadar, o linie nouă care conţine un singur caracter spaţiu încheie comanda anterioară şi iniţiază repetarea ei
fără să mai fie necesară scrierea numelui comenzii.
Tabelul 1
A B C A B C A B C
2 0 0 1 40 F 78 0.7 1 0.6
3 0 0.01 1 41 0.4 0 0 79 0.7 1 0.8
4 0 0.03375 1.2 42 0.4 0.85 0 80 0.7 1 1
5 0 0.0573 1.4 43 0.4 1 0.2 81 0.7 1 1.2
6 0 0.12 1.6 44 0.4 1 0.4 82 0.7 1 1.4
7 F 45 0.4 1 0.6 83 0.7 1 1.6
8 0.1 0 0 46 0.4 1 0.8 84 F
9 0.1 0.025 0 47 0.4 1 1 85 0.8 0 0
10 0.1 0.2375 0.2 48 0.4 1 1.2 86 0.8 0.320916 0
11 0.1 0.30125 0.4 49 0.4 1 1.4 87 0.8 0.587392 0.2
12 0.1 0.330625 0.6 50 0.4 1 1.6 88 0.8 0.6625 0.4
13 0.1 0.358125 0.8 51 F 89 0.8 0.740625 0.6
14 0.1 0.394375 1 52 0.5 0 0 90 0.8 0.83125 0.8
15 0.1 0.442406 1.2 53 0.5 0.85 0 91 0.8 0.93 1
16 0.1 0.519197 1.4 54 0.5 1 0.2 92 0.8 0.98375 1.2
2

17 0.1 0.62875 1.6 55 0.5 1 0.4 93 0.8 1 1.4


18 F 56 0.5 1 0.6 94 0.8 1 1.6
19 0.2 0 0 57 0.5 1 0.8 95 F
20 0.2 0.35 0 58 0.5 1 1 96 0.9 0 0
21 0.2 0.66934 0.2 59 0.5 1 1.2 97 0.9 0.0375 0
22 0.2 0.72875 0.4 60 0.5 1 1.4 98 0.9 0.19 0.2
23 0.2 0.75625 0.6 61 0.5 1 1.6 99 0.9 0.239541 0.4
24 0.2 0.77875 0.8 62 F 100 0.9 0.315625 0.6
25 0.2 0.80875 1 63 0.6 0 0 101 0.9 0.45125 0.8
26 0.2 0.84375 1.2 64 0.6 0.85 0 102 0.9 0.6475 1
27 0.2 0.885625 1.4 65 0.6 1 0.2 103 0.9 0.796875 1.2
28 0.2 0.929375 1.6 66 0.6 1 0.4 104 0.9 0.8725 1.4
29 F 67 0.6 1 0.6 105 0.9 0.904375 1.6
30 0.3 0 0 68 0.6 1 0.8 106 F
31 0.3 0.7125 0 69 0.6 1 1 107 1 0 1
32 0.3 0.96625 0.2 70 0.6 1 1.2 108 1 0.328125 1.1
33 0.3 0.98375 0.4 71 0.6 1 1.4 109 1 0.4125 1.2
34 0.3 0.9935 0.6 72 0.6 1 1.6 110 1 0.483667 1.3
35 0.3 0.9985 0.8 73 F 111 1 0.531232 1.4
36 0.3 1 1 74 0.7 0 0 112 1 0.5625 1.5
37 0.3 1 1.2 75 0.7 0.62 0 113 1 0.5875 1.6
38 0.3 1 1.4 76 0.7 0.9375 0.2 114 E
39 0.3 1 1.6 77 0.7 0.98625 0.4 115

Prin urmare se poate proceda astfel:


Numai la început, în celula G1 se scrie numele comenzii 3dpoly.
În celula G2 se scrie formula =D2&","&E2&","&F2.
Folosind tehnica de autocompletare din EXCEL sau comanda Copy/Paste se extinde formula pe toate
rândurile pe care există coordonate x,y,z.
Pe rândurile unde coordonatele lipsesc şi este prezentă inscripţia F se introduce un spaţiu. Acest lucru se
poate face o singură dată la primul astfel de rând, în cazul nostru rândul 7, după care cu Copy/Paste se copiază
rândul de câte ori este necesar.
Acum fişierul Corp.xls arată ca în fig. 2.
În final se selectează de pe coloana G toate rândurile cu date (inclusiv rândul 114 care pe coloana A conţine
inscripţia E şi se aplică comanda Copy.

Fig.2.

Se deschide programul Notepad unde se aplică comanda Paste şi se salvează cu numele Corp.scr. Aspectul
conţinutului fişierului Corp.scr este redat parţial mai jos:
3

3dpoly
0,0,8
0,0.2,8
0,0.675,9.6
0,1.146,11.2
0,2.4,12.8

10,0,0
10,0.5,0
10,4.75,1.6
10,6.025,3.2
10,6.6125,4.8
10,7.1625,6.4
10,7.8875,8
10,8.84812,9.6
10,10.38394,11.2
10,12.575,12.8

Tot ce mai rămâne acum de făcut este să se deschidă programul AutoCAD şi să se lanseze comanda
Tools/Run Script încărcând fişierul Corp.scr.

2. Interfaţare prin scrierea automată a fişierului SCRIPT


2.1. Crearea programului de scriere
După cum se constată, tehnica de lucru de mai sus presupune o anumită cantitate de manoperă care creşte o
dată cu creşterea dimensiunii problemei, până la a deveni obositoare. De aceea, ori de câte ori este posibil,
manualitatea trebuie înlocuită de automatizare.
Deoarece EXCEL include facilităţi de programare şi deoarece conţine baza de date primară asupra căreia
programul trebuie să lucreze, vom prezenta un program în VBA (Visual Basic for Applications) al cărui rol este
de a genera automat fişierul de comenzi Corp.scr.
În editorul de Visual BASIC din EXCEL, se crează modulul de program Module1, în care se scrie subrutina
de mai jos. Rolul acestei subrutine este acela de a scrie fişierul script care va conţine comenzile şi datele
necesare pentru a genera o serie de polilinii 3D care vor materializa cuplele descrise în fişierul Excel.
Sub Scrie_script()
Dim Celula As Object
Set Celula = Application.Worksheets("Sheet1").Cells
cale = "C:\Tccn\G2141a\Cad\Corpacad.scr"
Open cale For Output Access Write Lock Write As #1
Print #1, "vpoint 1,0,0"
Print #1, "3dpoly"
gatafisier = False
gatapline = False
i=2
While Not gatafisier
cel = Celula(i, 1)
If cel = "E" Then
gatafisier = True
gatapline = True
Else
If cel = "F" Then gatapline = True
End If
If gatapline Then
Print #1, ""
If Not gatafisier Then
Print #1, "3dpoly"
gatapline = False
End If
Else
x = Trim(CStr(Celula(i, 4)))
y = Trim(CStr(Celula(i, 5)))
z = Trim(CStr(Celula(i, 6)))
Print #1, x; ","; y; ","; z
End If
i=i+1
Wend
Print #1, "zoom all"
4
Close #1
Set Celula = Nothing
Shell "C:\Program Files\AutoCAD R14\acad.exe /b C:\TCCN\G2141a\CAD\corpacad.scr", _
vbNormalFocus
End Sub

Fişierul Corpacad.scr va avea conţinutul de mai jos, prezentat prin extrasul începutului şi sfârşitul fişierului:
vpoint 1,0,0
3dpoly
0,0,8
0,0.1,8
0,0.3375,9.6
0,0.573,11.2
0,1.2,12.8

3dpoly
10,0,0
10,0.25,0
10,2.375,1.6
10,3.0125,3.2
10,3.30625,4.8
10,3.58125,6.4
10,3.94375,8
10,4.42406,9.6
10,5.19197,11.2
10,6.2875,12.8

3dpoly
20,0,0
20,3.5,0
20,6.6934,1.6
20,7.2875,3.2
20,7.5625,4.8
20,7.7875,6.4
…..
90,8.725,11.2
90,9.04375,12.8

3dpoly
100,0,8
100,3.28125,8.8
100,4.125,9.6
100,4.83667,10.4
100,5.31232,11.2
100,5.625,12
100,5.875,12.8
zoom all

Instrucţiunea Shell situată înaintea sfârşitului subrutinei


lansează în lucru programul AutoCAD cu încărcarea şi
execuţia fişierului Corp.scr. Calea către fişier
C:\TCCN\G2141a\CAD\corpacad.scr trebuie înlocuită cu
calea specifică pentru fiecare utilizator.
Fig.3. 2.2. Crearea interfeţei de acţiune sub Excel
Folosind facilitatea de creare a diagramelor din Excel (Chart Wizard), se crează diagrama din figura 3 pentru
planul de forme normalizat.
La această diagramă se folosesc numai valorile pentru y şi z (coloanele B şi C) în serii de date separate pentru
fiecare coastă în parte.
Se porneşte de la o singură serie de date (prima coastă) apoi, după încheierea procedurii de creare a
diagramei, se accesează diagrama selectând curba trasată şi acţionând comanda Chart>Source Data. Din cutia
de dialog Source Data, se selectează pagina Series şi se foloseşte butonul Add pentru a defini şi adăuga noi serii
de date.
După crearea diagramei, folosind meniul contextual (clic pe butonul dreapta cu cursorul poziţionat pe
obiectul grafic diagramă), articolul Assign Macro, se asociază macrocomanda Scrie_script cu diagrama.
În acest mod, diagrama capătă rolul unui buton de comandă pentru generarea fişierului script, dar totodată şi
de lansare în execuţie a programului AutoCAD, încărcarea şi execuţia comenzilor din fişierul script.
1

LABORATOR Nr.6
Interfaţare Excel – Cosmos/M, prin fişier de comenzi
1. Generalităţi. Formularea temei
Printre multele faze de proiectare ale unei nave una dintre cele mai importante este aceea de verificare a structurii. În
prezent acest lucru se face folosind programe de elemente finite, unul dintre cele mai răspândite fiind COSMOS/M.
Deşi modelarea structurii şi verificarea acesteia se pot realiza integral în COSMOS/M, acest lucru se face prin
proceduri manuale, lente şi laborioase.
Vă prezentăm în continuare, o metodă (evident mult simplificată faţă de cea reală) pentru a înlocui operaţiile
manuale, automatizând majoritatea operaţiilor.
În esenţă, conform figurii 1, se foloseşte programul Excel pentru a crea un fişier numit Model.xls în care este definit
atât modelul structurii navei (într-o formă codificată) cât şi comenzile necesare programului COSMOS/M pentru a
genera şi rula modelul FEM al structurii.
Fişierul text de comenzi Model.geo se extrage din fişierul Model.xls şi se încarcă în COSMOS/M în fişierul model
FEM Model.gen

EXCEL Fişier text de comenzi COSMOS/M


Model.xls Model.geo Model.gen

Fig.1.

Etapele lucrării sunt cele de mai jos.


2. Cunoştinţe preliminare necesare
Modelul geometric al structurii navei.
Modelul extrem de simplificat (nerealist chiar) al unei porţiuni de structură de navă, dar suficient pentru a înţelege
modul de a pune şi rezolva problema este prezentat în figura 2:

Fig.2.

Denumirile elementelor de osatură modelate sub forma unor suprafeţe patrulatere sunt:
1 – Fund plat
2 – Gurnă (în realitate curbă)
3 – Bordaj
4 – Planşeu de dublu fund
5 – Varangă
6 – Perete transversal
7 – Punte
8 – Carlingă centrală

Elemente sintactice ale comenzilor din COSMOS/M.


Prezentăm mai jos sintaxa comenzilor folosite în lucrare. Pentru informaţii complete asupra acestor comenzi se poate
consulta facilitatea Help a programului COSMOS/M. Comenzile sunt prezentate în ordinea folosirii lor în aplicaţie.
2

Generarea punctelor:
PT, indice, x, y, z
De exemplu: PT,5,1.0,2.5,3
generează punctul de indice 5 cu x=1.0, y=2.5, z=3.0

Generarea suprafeţelor din 4 puncte:


SF4PT, indice, p1, p2, p3, p4
De exemplu: SF4PT,3,6,10,12,8
generează suprafaţa patrulateră din 4 puncte şi anume cele de indici 6, 10, 12 şi 8 în ordinea parcurgerii ciclice a
conturului.
Obs.: O suprafaţă cu numai 3 laturi se poate obţine dacă una din laturi are lungime nulă adică punctul p4 repetă
punctul p3, de exemplu SF4PT,3,6,10,12,12

Iniţierea unui grup de elemente:


Un grup de elemente este o colecţie de elemente cu aceleaşi proprietăţi.
EGROUP, indice, tip de elemente, opţiune 1, …, opţiune 8
De exemplu: EGROUP,2,SHELL3T,0,0,0,0,0,0,0,0
iniţiază grupul de elemente 2 de tip SHELL3T (membrană groasă cu 3 noduri). Toate elementele generate după această
comandă aparţin acestui grup.
Obs.: numărul şi valorile opţiunilor depind de tipul de element adoptat.

Iniţierea unui set de constante reale:


Un set de constante reale o colecţie de proprietăţi comune elementelor din set. Un set de constante reale se aplică
asupra unui grup asociat setului.
RCONST, grup de elemente asociat, numărul setului de constante reale, poziţia de start a primei constante, număr
de constante de introdus, constanta 1, …, constanta n
Obs.: o comandă RCONST poate introduce maximum 10 constante. Dacă sunt mai mult de 10 se repetă comanda luând
poziţia de start a primei constante egală cu 11 şi se defineşte numărul restului constantelor şi constantele respective.
De exemplu: RCONST,2,2,1,1,0.007
iniţiază setul de constante de indice 2 asociat cu grupul 2 de elemente finite, începând cu constanta 1, setul conţinând o
singură constantă, şi anume grosimea elementelor egală cu 7 mm (dimensiunile din aplicaţie sunt în metri).

Discretizarea automată (Automeshing):


Discretizarea este divizarea entităţilor geometrice (în particular suprafeţe) în elemente finite. Această operaţie poate
fi făcută automat de către COSMOS/M, dar corectitudinea rezultatului depinde de cîteva condiţii dintre care cea mai
importantă este folosirea aceleiaşi mărimi de element şi a aceleiaşi proceduri de discretizare.
MA_SF, suprafaţă iniţială, suprafaţă finală, increment, indicator de discretizare, mărime medie de element, metodă
de discretizare
De exemplu: MA_SF,5,8,1,0,0.125,1
comandă discretizarea automată a suprafeţelor 5, 6, 7 şi 8 pe baza mărimii medii a elementului finit, mărimea medie a
elementului fiind 0.125m, prin metoda de discretizare ierarhică

Iniţierea unui set de proprietăţi de material:


MPROP, indicele setului de proprietăţi, numele proprietăţii, valoarea proprietăţii
De exemplu: MPROP,1,EX,2.1E+8
iniţiază setul de proprietăţi de material cu indicele 1, în care se defineşte modulul de elasticitate pe direcţie x cu
valoarea de 2.1 108 KN/m2. Toate elementele care se vor genera ulterior vor avea proprietăţile din acest set până la
momentul iniţializării altui set de proprietăţi.

Alipirea nodurilor coincidente:


Este posibil ca în urma discretizării să rezulte noduri coincidente (duplicate) sau ca urmare a unor imprecizii să
rezulte noduri distincte dar care ar trebui să fie coincidente. Comanda NMERGE le alipeşte (elimină nodurile duplicat
excedentare menţinând numai pe unul singur).
NMERGE, nod iniţial, nod final, increment, toleranţă, 0, 1, 0
Obs.: ultimii trei parametri sunt specifici acestei lucrări. Pentru informaţii suplimentare se va consulta Help-ul
Cosmosului.
De exemplu: NMERGE,1,250000,1,0.003,0,1,0
realizează alipirea tuturor nodurilor duplicate din mulţimea de noduri de la 1 la 250000 în limitele unei toleranţe de 3mm.

Definirea acceleraţiei gravitaţionale:


ACEL, ax, ay, az
defineşte acceleraţia gravitaţională asociată cu cazul activ de încărcare şi aplicabilă asupra întregii structuri. Valorile ax,
ay şi az sunt componentele acceleraţiei.
De exemplu: ACEL,0,0,-9.81
3

Specificarea opţiunilor de analiză liniară statică:


Această comandă este mai complexă decât permite cadrul acestei lucrări şi de aceea vom prezenta numai exemplul
specific acestei lucrări: A_STATIC,G,0,0,1e-006,1e+010,0,0,0,0,0,0,0,0,0,0,0
Are rolul de a declara considerarea încărcărilor gravitaţionale

Iniţializarea unei liste de selecţie:


INITSEL, nume de entitate, indicator de iniţializare, indicele setului de selecţie
Nume de entitate = PA, PT, …, EL, ALL
Indicator de iniţializare = 1 (şterge lista şi dă acces la toate entităţile) sau –1 (complementarea listei)
Dacă indicele setului de selecţie este 0 se iniţializează toate seturile definite anterior
De exemplu: INITSEL,EL,1,0
iniţializează toate seturile de selecţie ştergând (golind) listele acestora.

Inţializarea sau adăugarea de elemente la o listă de selecţie pe baza proprietăţilor:


ESELPROP, numele proprietăţii selecţiei, set iniţial, set final, increment, numărul setului de selecţie
De exemplu: ESELPROP,EG,2,2,1,2
selectează grupul de elemente 2 în setul de selecţie 2.

Deselectarea unui set de selecţie bazat pe proprietăţi:


UNESELPROP, numele proprietăţii selecţiei, set iniţial, set final, increment, numărul setului de selecţie
De exemplu: UNESELPROP,EG,2,2,1,2
deselectează setul selectat la exemplul anterior.

Selectarea entităţilor încadrabile într-un domeniu dimensional


SELRANGE, nume de entitate, sistem de coordonate, indicator de activare a coordonatei x, indicator de activare a
coordonatei z, indicator de activare a coordonatei z, xmin, xmax, ymin, ymax, zmin, zmax, număr set de selecţie
Obs.: sunt date numai perechile coordonată minimă – coordonată maximă pentru indicatorii de activare diferiţi de 0
(valoarea acceptată a indicatorului de activare este 1)
De exemplu: SELRANGE,ND,0,1,0,0,3,3,6
crează setul de selecţie 6 care conţine nodurile situate la abscisa x=3 în sistemul de coordonate global (0).

Deselectarea entităţilor încadrabile într-un domeniu dimensional:


UNSELRANGE, nume de entitate, sistem de coordonate, indicator de activare a coordonatei x, indicator de activare
a coordonatei z, indicator de activare a coordonatei z, xmin, xmax, ymin, ymax, zmin, zmax, număr set de selecţie
De exemplu: UNSELRANGE,ND,0,1,0,0,3,3,6
deselectează toate nodurile selectate la exemplul anterior.

Impunerea de condiţii la limită (restricţii ale gradelor de libertate) pentru un şir de noduri:
DND, nod iniţial, eticheta deplasării restricţionate, valoarea deplasării, nod final, increment, etichete adiţionale
Etichetele deplasărilor pot fi:
UX, UY, UZ deplasări după X, Y sau Z; RX, RY, RZ rotiri după X, Y, sau Z; AL toate gradele de libertate; AU,
toate deplasările; AR toate rotirile, etc.
De exemplu: DND,1,RY,0,250000,1,RZ
impune rotire nulă după axa Y pentru toate nodurile de la 1 la 250000 care se găsesc într-un set de selecţie realizat
anterior, celelalte noduri (neselectate) rămânând neafectate de comandă.

Lansarea în lucru a analizei statice:


R_STATIC

Folosirea macrocomenzilor.
Programul COSMOS/M recunoaşte un limbaj de programare simplu, aşa numitul limbaj de macrocomenzi.
El permite apelarea unor macrocomenzi (echivalent al subrutinelor din alte limbaje de programare). Pentru a se
putea apela macrocomenzile acestea trebuie să fie conţinute în fişierul geomacro.mac prezent în directorul de instalare
al COSMOS/M.
În cazul nostru fişierul geomacro.mac are următoarea componenţă:
C* ***Hydrostatic pressure
C* ***with flat free surface KN/m2
C* ***Leonard Domnisoru

$macro,hst_shell,Depth,density,sgn
parassign,csid,int,0
parassign,i,int,0
#loop LB1 ELMAX
parassign,i,int,i+1
#if (exist(EL|i) && listsel(EL|i))
4

parassign,fnum,int,0
parassign,z,real,ZELF(i|fnum|csid)
parassign,pval,real,((Depth-z)*density*9.81)
parassign,fnum,int,5
#if (pval>0)
parassign,pval,real,(pval*sgn)
PEL,i,pval,fnum,i,1,4
#endif
#endif
#label LB1
$ENDM
C* ***End Hydrostatic pressure

C* ***Presiune marfa***
C* ***Dumitru Dragomir
$macro,press_marf,presmarf,sgn
parassign,i,int,0
#loop LB2 ELMAX
parassign,i,int,i+1
#if (exist(EL|i) && listsel(EL|i))
parassign,fnum,int,5
parassign,pval,real,(presmarf*sgn)
PEL,i,pval,fnum,i,1,4
#endif
#label LB2
$ENDM
C* ***Sfarsit presiune marfa

Cele două macrocomenzi au parametrii:


Pentru macrocomanda hst_shell:
Depth – pescajul navei
Density – densitatea apei
Sgn – sensul presiunii hidrostatice: +1 dacă presiunea este în sens contrar normalei la suprafaţa elementului şi –1
când presiunea are sensul normalei.

Pentru macrocomanda press_marf:


Presmarf – presiune mărfii asupra planşeului
Sgn – aceeaşi semnificaţie ca la hst_shell

Atribuirea valorilor argumentelor se face cu comanda:


parassign, variabilă, tip de dată, valoare
De exemplu:
parassign,density,real, 1.026
Apelul macrocomenzii se face cu comanda:
CALLMACRO, nume macrocomandă, listă de parametri
De exemplu:
CALLMACRO,hst_shell,Depth,density,sgn

3. Crearea fişierului Model.xls


Aplicaţia se crează într-un fişier Excel compus din 3 foi de lucru, şi anume:
- Foaia “Centralizator” – Figura 1;
- Foaia “Date” – Figura 2;
- Foaia “Model” – Tabelul 1;
Completarea celulelor foilor debutează cu foaia “Date“ astfel:
- se scriu capetele de tabel de pe rândurile 1 şi 15;
- se completează indicii punctelor şi ai suprafeţelor de pe coloana A;
- se completează coordonatele punctelor (x, y şi z) de pe coloanele B, C şi D;
- se completează indicii punctelor p1, …, p4 de pe coloanele B, C, D şi E;
- în celula F2 se scrie formula ="PT"&","&A2&","&B2&","&C2&","&D2 şi se extinde pe tot domeniul F2:F13;
- în celula F16 se scrie formula ="SF4PT"&","&A16&","&B16&","&C16&","&D16&","&E16 ţi se extinde pe
tot domeniul F16:F23;
Urmează completarea foii “Centralizator”, astfel:
- se completează capul de tabel de pe rândul 1;
- se completează denumirile grupurilor de elemente de pe coloana A;
- se completează indicii grupurilor de pe coloana B;
- se completează indicii suprafeţelor iniţiale şi finale (de început şi de sfârşit) ale grupurilor, situate pe coloanele C şi D;
5

- se completează grosimile (în metri) ale tablelor grupurilor, pe coloana E;


- în celula F2 se scrie valoarea comună a mărimii medii a elementelor necesară operaţiei de discretizare automată
(automeshing). În lucrarea noastră aceasta este de 0.125m. Dacă se doreşte, valoarea poate fiî ulterior
modificată. Pentru a ne asigura că aceeaşi valoare va fi folosită şi la celelalte grupuri de elemente, în celula F3
se introduce formula: =F2 şi se extinde pe restul coloanei;
- în celula G2 se introduce formula: ="EGROUP,"&Date!A2&",SHELL3T,0,0,0,0,0,0,0,0" şi se extinde pe restul
coloanei;
- în celula H2 se introduce formula: ="RCONST,"&B2&","&B2&",1,1,"&E2 şi se extinde pe restul coloanei;
- în celula I2 se introduce formula: ="MA_SF,"&C2&","&D2&",1,0,"&F2&",1" şi se extinde pe restul coloanei.

Fig.1.

Fig.2.

Tabelul 1
A
1 INITSEL,ALL,1,0
2 RCDEL,1,5000,1
3 EGDEL1,5000,1
4 EDELETE,1,250000,1
5 SFDEL,1,8000,1
6 CRDEL,1,24000,1
7 PTDEL,1,24000,1
8 C* Panouri
9 PT,1,0,0,0
10 PT,2,0,2,0
11 PT,3,3,0,0
12 PT,4,3,2,0
6

13 PT,5,0,0,0.5
14 PT,6,0,2.5,0.5
15 PT,7,3,0,0.5
16 PT,8,3,2.5,0.5
17 PT,9,0,0,2.5
18 PT,10,0,2.5,2.5
19 PT,11,3,0,2.5
20 PT,12,3,2.5,2.5
21 SF4PT,1,1,2,4,3
22 SF4PT,2,2,6,8,4
23 SF4PT,3,6,10,12,8
24 SF4PT,4,5,6,8,7
25 SF4PT,5,1,5,6,2
26 SF4PT,6,5,9,10,6
27 SF4PT,7,9,10,12,11
28 SF4PT,8,1,5,7,3
29 C* Proprietati si discretizare
30 MPROP,1,EX,2.1E+8
31 MPROP,1,NUXY,0.3
32 MPROP,1,DENS,7.800
33 EGROUP,1,SHELL3T,0,0,0,0,0,0,0,0
34 RCONST,1,1,1,1,0.005
35 MA_SF,1,3,1,0,0.125,1
36 EGROUP,2,SHELL3T,0,0,0,0,0,0,0,0
37 RCONST,2,2,1,1,0.007
38 MA_SF,4,4,1,0,0.125,1
39 EGROUP,3,SHELL3T,0,0,0,0,0,0,0,0
40 RCONST,3,3,1,1,0.005
41 MA_SF,5,8,1,0,0.125,1
42 C* Aranjamente
43 NMERGE,1,250000,1,0.003,0,1,0
44 C* Incarcare gravitationala
45 ACEL,0,0,-9.81
46 A_STATIC,G,0,0,1e-006,1e+010,0,0,0,0,0,0,0,0,0,0,0
47 C* Incarcare cu presiune hidrostatica
48 INITSEL,EL,1,0
49 ESELPROP,EG,1,1,1,1
50 parassign,Depth,real, 1.5
51 parassign,density,real, 1.026
52 parassign,sgn,int,1
53 CALLMACRO,hst_shell,Depth,density,sgn
54 UNESELPROP,EG,1,1,1,1
55 C* Incarcare cu marfa KN/m2
56 ESELPROP,EG,2,2,1,2
57 parassign,sgn,int,-1
58 parassign,presmarf,real,12.56694
59 CALLMACRO,press_marf,presmarf,sgn
60 UNESELPROP,EG,2,2,1,2
61 C* Conditii de margine
62 SELRANGE,ND,0,1,0,0,0,0,3
63 DND,1,UX,0,250000,1,RY,RZ
64 UNSELRANGE,ND,0,1,0,0,0,0,3
7

65 SELRANGE,ND,0,0,1,0,0,0,4
66 DND,1,UY,0,250000,1,RX,RZ
67 UNSELRANGE,ND,0,0,1,0,0,0,4
68 SELRANGE,ND,0,1,1,1,0,0,0,0,0,0,5
69 DND,1,UZ,0,250000,1
70 UNSELRANGE,ND,0,1,1,1,0,0,0,0,0,0,5
71 SELRANGE,ND,0,1,0,0,3,3,6
72 DND,1,RY,0,250000,1,RZ
73 UNSELRANGE,ND,0,1,0,0,3,3,6
74 R_STATIC

Foaia “Model“ se completează astfel:


- Celulele A1, ..., A7 se completează cu textele din tabelul 1. Efectele comenzilor sunt următoarele:
A1 – iniţializarea tuturor seturilor de selecţie;
A2 – ştergerea tuturor seturilor de constante reale;
A3 – ştergerea tuturor grupurilor de elemente;
A4 – ştergerea tuturor elementelor;
A5 – ştergerea tuturor suprafeţelor;
A6 – ştergerea tuturor curbelor;
A7 – ştergerea tuturor punctelor.
Rolul acestor comenzi este acela de a evita ca la rularea (încărcarea repetată) a fişierului de comenzi Model.geo să
mai rămână entităţi geometrice sau de altă natură de la rularea anterioară.
- în celula A8 se scrie comentariul C* Panouri (tot ce este precedat de caracterele C* este ignorat de
COSMOS/M);
- în celula A9 se introduce formula de referire =Date!F2 şi se extinde în josul coloanei până când se epuizează
punctele modelului. Epuizarea se constată când încep să fie afişate valori nule;
- în celula A21 se introduce formula de referire =Date!F16 şi se extinde în josul coloanei până când se epuizează
suprafeţele modelului. Epuizarea se constată când încep să fie afişate valori nule;
- în celula A29 se introduce comentariul C* Proprietati si discretizare
- în celula A30 se introduce textul MPROP,1,DENS,7.800
- în celula A30 se introduce textul MPROP,1,NUXY,0.3
- în celula A31 se introduce textul MPROP,1,DENS,7.800
- în celula A33 se introduce formula de referire =Centralizator!G2
- în celula A34 se introduce formula de referire =Centralizator!H2
- în celula A35 se introduce formula de referire =Centralizator!I2
- se repetă referinţele către celulele G3, H3, I3 şi G4, H4 şi I4 ale centralizatorului;
- celelalte celule ale foii se completează conform tabelului 3 prin scriere directă.

4. Crearea fişierului Model.geo


Se procedează în continuare astfel:
- se lansează aplicaţia Notepad;
- se revine în foaia Model a fişierului Model.xls şi se selectează tot domeniul de celule A1:A74;
- se execută comanda Copy;
- se trece în Notepad, se execută comanda Paste şi se salvează fişierul cu denumirea Model.geo. Fişierul nu
trebuie închis deoarece pot fi necesare anumite corecţii.

4. Rularea aplicaţiei pe COSMOS/M


Se procedează în continuare astfel:
- se deschide programul COSMOS/M, versiunea Geostar 256K;
- La cererea programului de a deschide un fişier se va introduce denumirea Model. Ca urmare va fi creat un fişier
nou cu numele Model.gen;
- Se aplică comanda File/Load obţinându-se deschiderea cutiei de dialog File;
- Cu butonul Find al cutiei de editare Input Filename se caută fişierul Model.geo şi se încarcă apăsând butonul
OK al cutiei File.
Dacă toate comenzile din fişier sunt corecte va avea loc încărcarea şi rularea aplicaţiei.
Se va obţine mai întâi imaginea din figura 3.
Folosind comanda Result/Plot/Stress se deschide cutia de dialog ACTSTR unde se apasă butonul Contour Plot şi se
trece în cutia STRPLOT unde se selectează Shape flag=1:Deformed, şi în cutia de editare Deformed scale factor se scrie
valoarea 0.5 (mai mică decât cea afişată).
Ca urmare se va obţine imaginea din figura 4. unde sunt reprezentate tensiunile Von Mises din structură.
8

Fig.3.

Fig.4.
1

LABORATOR Nr.7
Interfaţare Excel – MicroStation, prin tehnica DDE
Fomularea temei:
Pentru exemplificare, a fost adoptată schema de interacţiune MicroStation – EXCEL, în care MicroStation este
client iar EXCEL este server. Prin această schemă MicroStation deschide un canal de comunicare spre EXCEL de unde
extrage datele necesare, pe care le foloseşte într-o construcţie geometrică, în cazul de faţă generarea suprafeţei laterale a
unei cârme pe baza datelor citite din EXCEL.

Realizarea temei:
Pentru realizarea acestei teme au fost parcurse următoarele etape:
1. Se lansează în execuţie EXCEL şi se crează un fişier nou denumit "carma.xls";
2. Din meniul Tools>Options se deschide cutia de dialog Options. Se selectează pagina General în care se activează
stilul de referire R1C1 a celulelor şi se dezactivează ignorarea cererilor din partea altor aplicaţii – figura 1;
3. În foaia de lucru Sheet1 se completează tabelul cu date pentru profilul cârmei, figura 2;
4. Deoarece acestei foi i se vor adresa cererile şi transferurile de date, ca o condiţie de reuşită a comunicării, ea trebuie
să fie prima din şirul de foi de lucru, indiferent de numele ei;
5. Cu ajutorul editorului de Visual BASIC din EXCEL se generează funcţia Nrpuncte, ca mai jos:

Function Nrpuncte()
gasit = False
indice_rand = 2
While Not gasit
indice_col = 1
While (Not gasit) And (indice_col <= 2)
gasit = _
IsEmpty(Application.Worksheets("Sheet1").Cells(indice_rand, indice_col))
If Not gasit Then indice_col = indice_col + 1
Wend
If Not gasit Then indice_rand = indice_rand + 1
Wend
Nrpuncte = indice_rand - 2
End Function

Această funcţie găseşte indicele primului rând pe care nu este înscrisă nici o dată în celulele din coloanele 1 şi 2.
Prin aceasta se determină numărul de puncte definite de utilizator, astfel încât se poate lucra cu un profil definit prin
orice număr de puncte;

Fig.1. Fig.2.

6. Se lansează în execuţie MicroStation şi se crează un fişier nou denumit "carma.dgn" în care se stabilesc setările
dimensionale potrivite scopului, şi dispunerea ferestrelor conform sistemului de proiecţie european;
7. În editorul de Visual BASIC din MicroStation se scrie programul principal de mai jos şi se salvează cu numele
"carma.bas";
2

Sub main()
Dim chnmb As Integer
Dim point As MbePoint
Dim v As String
Dim i as String
Dim k As Long
q$=Chr$(34)
' Se initiaza canalul de schimb de date
chnmb=DDEInitiate("Excel", "C:\My Documents\Aplexcel\carma.xls")
' Plaseaza in celula de pe randul 2 si coloana 3 referinta la formula
' "Nrpuncte" definita in modulul Visual BASIC din EXCEL
' Ca urmare, celula R2C3 va contine numarul de puncte al curbei
cmd$= "=Nrpuncte()"
DDEPoke chnmb, "R2C3", cmd$
' Incepe comanda de plasare a primei curbe
MbeSendCommand "PLACE CURVE ICON "
' Stabileste setarile curbei B-Spline
MbeSetAppVariable "3DTOOLS", "ms3DToolSettings.curve.type", 2&
MbeSetAppVariable "3DTOOLS", "ms3DToolSettings.curve.mode", 0&
MbeSetAppVariable "3DTOOLS", "ms3DToolSettings.curve.params.closed", 0&
' Trasarea curbei pe baza datelor din fisierul EXCEL
' Mai intai citeste din celula R2C3 numarul de puncte al curbei
max=Val(DDERequest$(chnmb,"R2C3"))
k=1
While k<=max
i=CStr(k+1)
cel$="R"&i$&"C1"
v=DDERequest$(chnmb, cel$)
point.x = Val(v)
cel$="R"&i$&"C2"
v=DDERequest$(chnmb, cel$)
point.y = Val(v)
point.z = 0
MbeSendDataPoint point, 1%
k=k+1
Wend
MbeSendReset
' Trasarea celei de a doua curbe identica cu prima dar la alta cota z
k=1
While k<=max
i=CStr(k+1)
cel$="R"&i$&"C1"
v=DDERequest$(chnmb, cel$)
point.x = Val(v)
cel$="R"&i$&"C2"
v=DDERequest$(chnmb, cel$)
point.y = Val(v)
point.z = 2000
MbeSendDataPoint point, 1%
k=k+1
Wend
MbeSendReset
' Construieste suprafata carmei prin sectiunile de capete
MbeSendCommand "CONSTRUCT SURFACE CROSSSECTION "
point.x=Val(DDERequest$(chnmb, "R2C1"))
point.y=Val(DDERequest$(chnmb, "R2C2"))
point.z=0
MbeSendDataPoint point, 1%
point.z=2000
MbeSendDataPoint point, 1%
point.z=2100
MbeSendDatapoint point, 1%
MbeSendDatapoint point, 1%
DDETerminate chnmb
End Sub

8. Din meniul Utilities>Macros se deschide cutia de dialog Macros din care se selectează macrocomanda carma;
9. Se apasă butonul Run pentru a rula macrocomanda. Ca urmare se va obţine construcţia din figura 3.
3

Fig.3.

Dacă se doreşte un alt profil, se procedează astfel:


1. Se şterge complet construcţia generată anterior;
2. Se comută în EXCEL unde se fac modificările necesare în tabelul de date al profilului;
3. Se comută în MicroStation şi se rulează din nou macrocomanda carma.
Se observă că, pe această cale, cele două aplicaţii colaborează în realizarea unei teme de proiectare, fiecare punând
la dispoziţia utilizatorului posibilităţile sale de lucru, astfel încât sarcina de lucru se poate realiza foarte comod.

Posibilităţi de extindere a aplicaţiei:


Desigur, exemplul prezentat a fost de o simplitate extremă, cu scopul de a pune mai
clar în evidenţă structura aplicaţiei.
Aşa cum s-a văzut din cele de mai sus, comunicaţia este posibilă în ambele direcţii.
De aceea, o dată făcută generarea unei geometrii într-un program de tip CAD, pot fi
iniţiate prelucrări specifice CAD, cum ar fi calcule de suprafeţe şi volume, centre de
greutate şi momente de inerţie, decupări de suprafeţe şi compuneri de volume, etc, iar
rezultatele de tip numeric obţinute pot fi transmise înapoi programului de tip gestionar
de baze de date pentru stocare şi folosire într-o etapă de lucru ulterioară.
Pe această cale, schimburile de date necesare programelor din categoriile
reprezentate schematic în figura 4, pot fi realizate eficient şi relativ simplu, asigurând
astfel integrarea diverselor componente ale procesului de proiectare cu calculele
Fig.4. inginereşti şi cu lucrările de pregătire a fabricaţiei.

S-ar putea să vă placă și