Documente Academic
Documente Profesional
Documente Cultură
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
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ă.
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
; 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.
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
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
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)
)
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)))
)
)
Fig. 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π.
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
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.
Fig.3.
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:
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.
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.
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
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) "")
- 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.
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
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.
(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.
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.
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.
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
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
Fig.1.
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ă
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
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ă.
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
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
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.