Search  
Friday, May 25, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Clase - VCX si PRG  Sa fac o clasa?...
 Sa fac o clasa?
 
 1/6/2011 5:12:21 PM
User is offlineji_ci
191 posts
5th


Sa fac o clasa?
 (Romania)
N-am mai facut pana acum o clasa! Dar tot citind pe forum mi-am dat seama ca in proiectul meu ar fi binevenita o clasa? Am o schema in proiect facuta din imagini! Schema e impartita in mai multe parti care reprezinta instaltiile! Si as face o clasa INSTALATIE! Ea ar trebuii sa contina elemente (care sunt imagini), reteaua intre elemente (care sun tot imagini)! Problemele ar fi urmatoarele:
1. Instalatiile nu sunt toate asemanatoare> nu au intotdeauna elemente si retele identice!
2. Cum fac clasa? Pe un container?
3. Daca instalatia are mai multe elemente de acelasi fel ar trebui sa fac si o clasa elemente?
4. Cum as putea face legatura intre clasa mea instalatie si baza de date in care instaltia este reprezentata printr-un cod
Pana acuma am creat fiecare instalatie in parte si denumirile la imagini le-am dat in functie de codurile elementelor, retelelor si instalatiei din tabel!  Dar cred ca o clasa ar fi o solutie mai eleganta!

 1/8/2011 11:05:17 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Posteaza un desen cu schema. Cea pe hartie, nu formul cu imagini.

Daniel Buduru
 1/9/2011 3:28:21 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania) Modified By ji_ci  on 1/9/2011 4:29:13 PM)
Am inceput sa inteleg treaba cu clasele. Deci imi usureaza munca extraordinar! Si cred ca am nevoie de o gramada de clase! In schema circ1, circ2 etc reprezinta cate o instalatie! Modelele de instalatii care apar pe schema se tot repeta!
schema.jpg 
 1/10/2011 10:12:14 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Fiecare circuit este de sine statator, sau sunt interconectate?
S1 din circuitul 1 si S1 din circuitul 2 sunt contactele aceluiasi switch, sau ambele circuite au cate un switch S1?

Daniel Buduru
 1/10/2011 2:38:09 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
S1 de la circ 1 este element diferit de S1 de la circ 2 dar sunt de acelasi tip(din aceasi categorie), la fel si celelalte! Circ 1 si Circ 2 poate fi alimentat fie din 1 fie din 2 in functie de pozitia S1 si S2.
 1/10/2011 7:28:17 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Daca fiecare circuit este independent, poti face o clasa circuit.
O derivezi din container, cu backstyle= 0 - transparent, borderwidth=0, astfel incat containerul sa nu se vada, ci numai obiectele continute.
Ca sa il poti vedea totusi in designer, poti sa ii pui borderwidth=1 iar in initul clasei sa pui this.borderwidth=0.
Acestei clase ii pui proprietati si metode care sa controleze aspectul la miscarea mouse si ce mai e nevoie.
In clasa circuit poti pune un label care sa afiseze numele sau codul circuitului si poti declara unul sau mai multi vectori in care sa tii starea echipamentelor (inchis/deschis, actionat/neactionat, etc) continute in circuit.
Tot in clasa pui o proprietate in care sa tii acea expresi logica despre care am dicutat intr-un alt thread.
In clasa adaugi un control shape, pe care il faci transparent si fara border. Acest obiect va capta miscarea mouse pe deasupra containerului, astfel incat sa nu fie nevoie sa scrii cod in fiecare obiect din container.In initul clasei, pui acest obiect deasupra - cu ZOrder - si il dimensionezi cat containerul - cu metoda Move. Poti eventual sa lasi o distanta intre el si container, 3-4 pixeli, astfel incat Shape.MouseMove sa selecteze circuitul, iar container.mousemove sa deselecteze circuitul. In general functioneaza, dar mai sunt situatii in care nu se declanseaza mousemove peste o zona mica, asa ca tot ai nevoie de o deselectare suplimentara.
Poti modifica proprietatea shape.DrawMode cat timp circuitul este selectat astfel incat sa puna in evidenta echipamentele din interior. Experimenteaza cu diferite valori. Vezi DrawMode=1 sau DrawMode=16, dar si celelalte valori.

Poti sa mai creezi o clasa echipament, care sa aiba proprietatile echipamentului pe care il reprezinta. Aceasta clasa poate fi derivata din container, shape, image sau label, depinde cum vrei sa reprezinti echipamentul.

Din clasa circuit instantiezi toate circuitele de care ai nevoie.
In designer, aduci pe form aceasta clasa - fie o tragi cu mouse din biblioteca ei din proiect, fie adaugi biblioteca in formcontrols toolbar. si o iei de acolo.
Apoi incepi sa pui in ea echipementele si sa desenezi circuitul.
Daca un circuit se utilizeazeaza de mai multe ori, il poti salva ca si clasa - il selectezi apoi alegi din menu-ul File Save As Class si il pui in acceasi biblioteca.
Poti salva si o clasa mai redusa, doar cu echipamentele comune, pe care sa o completezi apoi cu ce mai trebuie la fiecare circuit.

Oricum, incepi cu ceva simplu, un circuit cu 1-2 echipamente, pana pui la punct clasa circuit, apoi treci la schema reala.

Ar trebui sa revezi si baza de date.
Ai nevoie de o tabela cu circuite - idcircuit, denumire, eventual cod, functia logica si un camp in care sa tii starea fiecarui echipament atunci cand faci simularea. Poate fi un camp caracter, in care pui un sir de valori de 0 sau 1, fiecare pozitie din sir reprezentand un echipament din circuit
Apoi o tabela child, circuitcomponente, cu echipamentele din circuit: idcircuit, idechipament, cod echipament si un index care sa reprezinte pozitia echipamentului respectiv in acel camp cu starea echipamentelor din circuit.
Si o tabela cu echipamente - cod echipament, denumire, tip echipament si celelalte caracteristici de care mai ai nevoie.
IDcircuit e cheie primara in tabela circuite si cheie straina in tabela circuitcomponente
Codechipament e cheie primara in tabela echipamente si cheie straina in tabela circuitcomponente
Idechipament e cheie primara in tabela circuitcomponente.




Daniel Buduru
 1/10/2011 11:55:00 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Multumesc de rabdare si de indrumari! Asa am gandit si eu ... inclusiv treaba cu shape-ul doar ca eu am folosit un Image BackStyle=Transparent! Bineinteles ca cu shape-ul e mai bine! Ptr a scoate in evidenta circuitul eu am folosit un Check Style=Graphical pe care il fac vizibil cand sunt cu mouse-ul pe circuit! Ma ajuta mult treaba cu Zorder (nu am folosit pana acum si chiar vroiam sa intreb daca este ceva in genul asta). Treaba cu cei 3 pixeli diferent a intre Shape si Container nu merege ... m-am chinuit si eu ieri si nu sesizeaza cand trec rapid cu mouse-ul! Dar am rezolvat-o pana la urma in alt mod! Intrebare! La click deasupra circuitului deschid un form cu circuitul respectiv! As vrea sa fac un singur form valabil ptr toate circuitele ... si asta m-am gandit sa o fac cu AddObject! Dar nu stiu cum pot sa aduc un obiect pe forma din clasa creata de mine! Se poate?
Cu baza de date .... mai rumeg! Cand spui echipament cred ca te referi la S1, S2 ...?! Am inteles ideea ... si imi dau seama de ce intrebai daca sunt independente circuitele! Problema e ca in functia logica a unui circuit intervin si elemente(echipamente) din alte circuite!?

 1/11/2011 10:20:23 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Daca circuitele nu sunt de sine statatoare, ci interconectate, e obligatoriu ca toate elementele sa aiba denumiri distincte. Nu poti avea S1 in doua circuite ...
Trebuie sa alegi un sistem de notare care sa asigure identificarea unica a fiecarui element. Fie prefixezi elementul cu identificatorul circuitului - C1S1, C2S1 - fie le dai nume la rand - S1, S2, S2 - dar unice pe toata schema.
In acest caz, trebuie grupate dupa schema - sau instalatie, sau cum o numesti - si nu dupa circuit.

Intr-adevar, am zis echipamente in loc de elemente. Nu mai stiam cum te-ai referit la ele.

Ca sa poti afisa fiecare circuit intr-un form ar trebui sa faci cate o clasa pentru fiecare circuit, sa o salvezi intr-o biblioteca si sa o incarci de acolo. Pentru un "show" poate merge, insa nu e o solutie pentru o aplicatie reala.
Ai putea face o clasa care sa se populeze singura cu elemente, cu datele incarcate dintr-o tabela. Ceva complicatii la plasarea elementelor si destul de multe la trasee ...Se justifica doar la o utilizare frecventa.

Daca schema e prea mare pentru un form, poti pune bare de scroll pe form.

Daca poti trece la VFP9, se simplifica mult lucrurile. Poti folosi biblioteca gdiplus, cu care poti crea pe loc imaginea unui circuit, pornind de la obiect, imagine pe care sa o pti apoi afisa intr-un form.
Tot cu VFP9 - cu proprietatea anchor a obiectelor - poti crea clase care sa se redimensioneze dupa necesitati, deci vei putea face un zoom pe un obiect sau pe toata schema.

Daniel Buduru
 1/12/2011 11:52:44 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
La baza de date inca rumeg!
Nu intampin probleme in afisarea circuitelor in schema ... nu asta e porblema! Ca nu am asa multe circuite in schema (am mai multe scheme cu putine circuite care le pot incadra intr-un form fara scroll)! si le-am facut schemele in modul designer! Problema e ca din formul cu schema vreau la evenimentul click asupra unui circuit sa deschid intr-un alt form doar circuitul repectiv! Si pentru asta as face un singur form in care sa pot deschide orice tip de circuit ... adica  sa-mi afiseze clasa de circuit pe care vreau sa o deschid! Poate ca si pentru treaba asta e valabil ce mi-ai scris mai sus?! Am facut clasele ptr fiecare tip de circuit si le am salvate intr-o biblioteca!
 1/13/2011 8:58:03 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Poti apela forma cu unul sau doi parametri prin care sa-i indici ce obiect sa instantieze.
In form.init pui asta:

LPARAMETERS tcClass, tcLibrary
IF empty(tcClass) && nu s-a precizat clasa
   return .f.
Endif
This.NewObject('Circuit',tcClass, tcLibrary)
this.Circuit.Visible=.t.

Pentru apelare :
Do Form FrmCircuit WITH clasa_circuit, biblioteca_circuit


Daniel Buduru
 1/13/2011 10:30:01 AM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Asta era! Acum bineinteles ca-mi trebuie si marit circuitul in noua forma! Se poate afla afla codul la Clasa pe care am facut-o in modul designer? M-am gandit sa rulez codul respectiv si in el sa modific dimensiunile din circuit!
 1/13/2011 12:27:31 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Ce intelegi prin "codul clasei facute in designer"?

Modificarea dimensiunii circuitului se poate face in cod, fie in clasa circuitului, fie in forma pe care o lansezi.
Oriunde o pui, daca vrei ca circuitul sa se redimensioneze odata cu formul, metoda va trebui apelata din form.resize

In VFP Foundation exista o clasa, _resizable, in _controls.vcx. Clasa asta se pune intr-un form si se ocupa de redimensionarea obiectelor.
O poti folosi ca atare - nu mai stiu daca actioneaza si in interiorul containerelor-, dar te poti inspira din cod ca sa-l faci pe al tau.


Daniel Buduru
 1/13/2011 12:45:27 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
O sa incerc clasa de care mi-ai spus!
Ideea e ca am facut clasa circuit la dimensiunile din schema! Cand deschid un circuit intr-un alt form de fapt il deschid in trei locuri in formul respectiv! Deci in formul in care il deschid trebuie sa am de trei ori circuitul! De aceea ma intereseaza sa pun clasa intr-un loc anume pe form si la dimensiuni mai mari!
 1/13/2011 1:33:53 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Nu clasa o ai pe form, ci un obiect instantiat din acea clasa. Poti instantia oricate obiecte doresti.

Pozitionarea obiectului se face cu metoda move:
Thisform.obiect.move(left, top, width, height)

Pentru redimensionare iti trebuie un cod care sa itereze prin obiectele din clasa si sa le modifice pozitia/dimensiunile.
Mai intai, codul trebuie sa memoreze pozitia si dimensiunile initiale ale obiectului - la o prima trecere, de preferinta in initul clasei, si sa le stocheze in proprietati ale obiectului.
Apoi se stabileste un raport intre dimensiunea initiala / dimensiunea actuala (factorul de scara, care poate fi subunitar - micosorare - sau supraunitar - marire).
Apoi se deplaseaza/redimensioneaza fiecare obiect cu acest factor de scara.

Daca treci in vfp9, folosesti proprietatea anchor si redimensionarea se face automat ...




Daniel Buduru
 1/13/2011 3:57:49 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Am inteles despre ce-i vorba! Multumesc!
Referitor la modelul de baza de date care mi l-ai dat .... eu am starea elementelor in tabela circuitcomponente intr-un camp logic! Idelement e format din concatenare idtipelement si idcircuit! De ce crezi ca e mai buna varianta cu campul in tabela circuite in care sa memorez starile elementelor?
 1/13/2011 5:33:43 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A) Modified By Daniel Buduru  on 1/13/2011 6:40:17 PM)
Daca IDElement este format din concatenarea idcircuit si idtipelement inseamna ca, daca ai mai multe elemente de acelasi tip intr-un circuit, ele vor avea acelasi id - dar nume diferite si stari diferite.
Evident, baza de date o faci cum vrei, si poate va merge cata vreme cat nu o folosesti intr-un mediu real. Exista insa niste reguli de proiectare ale unei baze de date, pe care nu modelul tau nu le respecta. Discutii pe tema asta au fost destule pe forum, si nu e cazul sa le reiau.

Referitor la starea elementelor, e adevarat ca o ai la fiecare element in parte, deci in inregistrari separate in tabela, si nu vei putea scrie o functie logica ai carei parametri sunt in inregistrari diferite dintr-o tabela. Pentru a scrie functia, ai nevoie ca starea fiecarui element sa o ai intr-un vector, iar modelul cu campul caracter completat cu 0 si 1 este cea mai simpla si compacta metoda de a salva un vector intr-un camp. Apoi poti folosi acest vector in functia logica, poti modifica starea elementelor si poti salva noua stare.

Daniel Buduru
 1/13/2011 7:19:01 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Nu ... nu am elemente de acelasi tip in circuit ... deci prin concatenare imi iese un id unic! Dar n-ar fi asta o problema ... pana la urma pot sa fac un camp in tabela din concatenarea asta! Da asa e .... trebuie transformate starile intr-un vector ... si o fac destul de anevoios ... printr-un select din tabela intr-un array si apoi un FOR! Cu tabelele sugerate de tine cum ar trebui sa fac vectorul cu starile elementelor?
 1/13/2011 10:24:33 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A) Modified By Daniel Buduru  on 1/13/2011 11:25:58 PM)
Daca exista o norma de proiectare a circuitelor care spune ca nu poti avea decat un singur element dintr-un tip intr-un circuit, iar regula asta se aplica fara exceptii in proiectare, ar fi ok. Doar ca, intr-un circuit poti avea doua intrerupatoare, sau doua relee si regula asta nu se respecta. Daca nu le ai acum, e o situatie punctuala, nu o regula.
Idelement trebuie sa fie unic in toata schema, si nu e acelasi lucru cu codul.

Starea unui element nu este o caracteristica a elementului singur, ci a elementului in circuitul in care se afla. Prin urmare, starea tuturor elementelor trebuie definita in acelasi timp, deci intr-o singura inregistrare, si nu independent unul de altul.
Mai mult, daca circuitele sunt interconectate, ar trebui sa ai un vector de stare la nivelul schemei, nu al circuitului.
Oricum, inteleg ca asta e un proiect de scoala, nu o aplicatie reala, asa ca faci cum iti este mai la indemana.

Despre vector:
La nivelul circuitului sau al schemei, ai nevoie de un vector de stare a elementelor.
Poti lucra fie cu un vector unidimensional, unde fiecare element al vectorului reprezinta elementul cu acelasi index al circuitului. In acest caz, trebuie sa asiguri pastrarea ordinei in care elementele sunt citite/atribuite. Poti face asta in ordinea in care obiectele sunt definite in clasa, deci ordinea in care sunt iterate prin clasa.objects(i).
Pentru a salva vectorul in sir:
lcString=''
for lni=1 to alen(avector)
   lcString=lcString+iif(avector(lni=.t.,1,0)
next

pentru a incarca vectorul din sir:
lcString=trim(lcstring)
dime avector(len(lcString)
for lni=1 to len(lcString)
  avector(lni)=(subs(lcString,lni,1))='1')
next

Poti lucra cu un vector bidimensional, unde pe o coloana ai numele sau id-ul elementului, iar pe cealalta ai starea. Vectorul seincarca tot prin scanarea obiectelor din circuit, dar nu te mai intereseaza ordinea.
Pentru a crea vectorul :
with this  &&este o metoda a clasei
dime avector(1,2)
lnIndex=0
for lni=1 to .objectcount
  loObject=.Objects(lni)
  if type("loObject.stare")<>"U"
    lnIndex=lnIndex+1
    dime avector(lnIndex,2)
    avector(lnIndex,1)=loObject.Name
    avector(lnIndex,2)=loObject.Stare
  endif
Next
Pentru salvarea lui in string:
lcString=''
for lni=1 to alen(avector,1)
   lcString=lcString+tran(avector(lni,1))+chr(13)+tran(avector(lni,2))+chr(13)
next

Pentru a incarca vectorul din string:
=Alines(avector, lcstring)
dime avector(alen(avector)/2,2)

Pentru a seta starea obiectelor (elementelor) din circuit:
For lni=1 to alen(avector,1)
   cname=avector(lni,1)
   lvalue= inlist(avector(lni,2),'.T','1')
   this.&cname = lValue
Next

Ar mai fi si alte variante, cu un obiect de stare, care sa aiba ca proprietati numele elementelor, iar ca valoare a acestor proprietati, starea lor.
In vfp9 ai avea la dispozitie obiectul colectie pentru asta.


Daniel Buduru
 1/13/2011 11:10:28 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
E corect tot ce imi spui vizavi de proiectarea bazei de date! Tipul elementului de fapt e o denumire a elementelor din circuit care imi apar in aproape toate circuitele! Si chiar daca sunt mai multe intrerupatoare ele sunt notate I1, I2 etc ... asta-i idtipelement de care vorbeam ... desi e normal si eu in locul tau m-as fi gandit ca tipelement se refera la intreruptoare, relee etc. E inspiratia mea proasta in alegerea denumirilor! Deci in final nu am idelement acelasi ... si nu pot sa am! Stiu ca-mi trebuie un vector ptr toata schema .... mi-ai spus inca de la inceput intr-un alt thread ... si l-am facut dar pe incercatelea! Deci cu baza asta de date improvizata chiar am reusit sa fac ce mi-am propus> actionarea elementelor (cu interdictile de rigoare) si chiar colorarea circuitelor in functie de cele trei stari in care se pot afla! Dar clar totul e facut cam babeste ... si vreau sa fac cat de cat serios! Nu e proiect de scoala!  E doar hobby ... si chiar se va folosii programul! Multumesc inca o data de rabdare! O sa incerc treaba cu vectorii! Am reusit treaba cu reseize!
 1/14/2011 7:17:39 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Care-i varianta cea mai buna de a schimba imaginea din clasa Element in functie de starea elementului> inchis sau deschis? Sa fac o procedura care sa fie apelata la fiecare schimbare de stare? Sau pot lega cumva Image.Picture de proprietatea creata de mine element.stare?
 1/14/2011 7:41:08 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
In clasa elementului adaugi doua proprietati (sau cate stari ai). Sa zicem, PictureOn si PictureOff. In aceste proprietati pui numele fisierelor care contin imaginea respectiva.
Apoi adaugi metoda stare_assign. Poti adauga metoda ca atare, sau poti merge in Properties Editor, selectezi proprietatea stare, apoi bifezi Assign si salvezi.
In stare_assign pui urmatorul cod:
lparameters tuNewValue
this.stare=tuNewValue
this.image1.picture=iif(this.stare=1, this.PictureOn,this.PictureOff)
this.image1.refresh
Ori de cate pri modifici starea, s eva schimba si poza, fara a avea nevoie de alt cod.


Daniel Buduru
 1/15/2011 10:31:43 AM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Am reusit treaba cu pozele ... e mult mai simplu si elegant asa! Multumesc! Dar baza de date ma omoara! E bine ce am facut pana acum (vezi jpg)? Instalatiile reprezinta circuitele de care am vb, iar tensiuni sunt categorii in care se impart instalatiile!
dbc.jpg 
 1/18/2011 12:29:20 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Scuze pentru raspunsul tarziu.

Uneori, la strcuturarea bazelor de date, sa intampla "sa nu vezi padurea din cauza copacilor". 
Cheia modelarii eficiente este abstractizarea.
Instalatia, schema, circuitul, elementul de circuit sunt obiecte.
Instalatiile, schemele, circuitele, elementele de circuit  au caracteristici - nume, tensiune de lucru, tensiune de comanda, putere, functie de transfer ...
Aceste caracteristici sunt proprietatile obiectului - nume, tensiune le lucru, tensiune de comanda, putere, functie de transfer.
daca obiectul contine alte obiecte, el este un container.
Modelul bazei de date este container / obiecte continute. Pentru acest model, sunt necesare doua tabele, container (parent) si tabela obiecte (child).
Structura ambelor tabele este aproape identica, intrucat in ambele tabele sunt tinute obiecte.
Vom avea urmatoarea structura :
ID Obiect - Identificator unic al obiectului, cheie primara
ID Parinte - Identificatorul containerului, cheie straina
ID Clasa  - Identificatorul clasei din care este instantiat obiectul, cheie straina
Cod obiect - identificator unic al obiectului, alocat de utili;izator, cheie surogat
Nume obiect - unic in cadrul containerului, cheie surogat impreuna cu id parinte.
Functia de stare- expresie logica al carui rezultat este starea obiectului si care poate referi doar obiecte care au acelasi parinte.
Stare
Alte caracteristici necesare modelarii

Tabela parinte poate sa nu contina campul idparinte, sau acesta poate ramane necompletat.
De obicei, in aceste tabela se tine doar structura ierarhica.

Intr-un container putem avea mai multe obiecte de acelasi fel, si atunci e eficient sa definim o clasa pentru aceste obiecte:
ID clasa- identificator unic, cheie primara
Denumire clasa - denumire unica in tabel, cheie surogat
ID Clasa parinte - necompletat daca este clasa de baza.
Cod alocat de utilizator - (ex, BT136 sau S202S02), unic in tabel, cheie surogat
Proprietati  - putere, tensiune de lucru, tensiune de comanda, curent de comanda , numar contacte .....

Pentru proprietatile ale caror valori sunt normalizate, se pot face nomenclatoare.
Ex: Nomenclator tensiuni:
ID Tensiune = 1
Tensiune = 5V

Acum sa vedem cum modelam instalatiile:

Tabela tip elemente este tabela de clase de baza.
idclasa=2
Nume='Releu'

Tabela elemente este tabela de clase
ID Clasa = 5
ID Tip=2
Denumire= Releu 12VDC/220VAC 4A
tensiune = 220V - poate fi luata din nomenclator, si atunci campul devine idtensiune.
Stare = Neactionat, starea implicita

Apoi tabelea de instalatii (sau circuite, sau scheme, cum vrei sa-i zici) - o instalatie cuprinde TOATE obiectele a caror stare intra in functia de transfer a instalatiei.
Sa-i zicem instalatii_H (H de la Header)
IDInstalatie = 3
Nume instalatie = "Instalatia 3"
Cod instalatie =" I03"
Vector de stare ='100111001'
Functia de transfer =" CP01 AND (NOT F06)"
Stare

Tabela de componente ale instalatiilor - instalatii_L (L de la Linii)
ID Instalatie =3
ID Element =1
ID Clasa =5
Index  - unic in instalatie, cheie surogat (impreuna cu id instalatie)
Nume element in instalatie =" Contactor pornire"
Cod element in instalatie = "CP01"
Functia de stare
Stare = 0

Cam asta ar fi, foarte pe scurt.


Daniel Buduru
 1/19/2011 9:09:09 AM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Multumesc! Sa zicem ca incep sa vad padurea ... dar nu ajung in poienita linistita!
Nu prea inteleg cum fac practic cheia surogat!
Index  - unic in instalatie, cheie surogat (impreuna cu id instalatie)
- asta e indexul care imi arata pozitia elementului in vecturul de stare din tabela instalatii_header!

 1/19/2011 9:20:52 AM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: Sa fac o clasa?
 (N/A)
Citam din carte: O valoare care este unica in tabela, dar nu este cheie primara, se numeste cheie surogat.

Este folosita de obicei pentru identificarea unica a unei inregistrari, dar spre deosebire de cheia primara, care ar putea avea o valoare de genul asta: E18FEC31-2EA1-49A2-A7A6-902DC0D1FF05, si, in acelasi timp, este generata si intretinuta de sistemul de gestiune a bazei de date (VFP, SQL Server, whatever), SI, SIMULTAN, nu are relevanta in contextului businessului gestionat de aplicatie (asta e un mod mai complicat de a spune "valoarea din cheia primara e generata de sistem si n-o vede nimeni niciodata), cheia surogat are relevanta in contextul businessului: Cod de client, CNP asigurat, Marca Angajat, Index Instalatie, Cod Produs, etc etc etc, si este introdusa in general de catre utilizator, de la tastatura.

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 1/19/2011 10:20:38 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A) Modified By Daniel Buduru  on 1/19/2011 11:23:26 AM)
Grig ti-a spus deja ce este cheia surogat.
Practic, daca id instalatie este numeric, creezi un index candidate cu expresia str(id instalatie,3)+str(index, 3), acoperitor pentru id instalatie pana la 999 si index pana la 999.
Cheia astfel creata nu accepta valori index duplicate pe acceasi instalatie, dar accepta acelasi index pe instalatii diferite.



Daniel Buduru
 1/19/2011 10:25:10 AM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Acum cred ca inteleg! Revenind la baza mea de date ... cand am un element care corespunde la 2 tensiuni! ex trasformator1 220/24V ... aici cum se procedeaza! Bine o varianta ar fi sa trec in nomenclator tensiuni si teniunea 220/24V! Dar nu stiu daca e solutia corecta!? Mai ales ca tensiunea nu reprezinta doar o proprietate ... ci in proiect trebuie sa-mi impart instalatiile pe tensiuni! Deci elementul meu trebuie sa-mi apara si la 220V si la 24V!
 1/19/2011 10:46:24 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A) Modified By Daniel Buduru  on 1/19/2011 12:06:20 PM)
Tabela de clase (elemente) trebuie sa contina toate caracteristicile care te intereseaza pentru un element.
De obicei, ai tensiunea/curentul de comanda si tensiunea / curentul de lucru - cum ar fi cazul unui releu, contactor static - si atunci pui un camp pentru tensiunea de comanda si altul pentru tensiunea de lucru
Poti avea componente care sa lucreze intr-o gama de tensiuni - ex. alimentare 100V-240V, si atunci poti pune un camp logic pentru plaja asta
La transformatoare ai tensiune / curent de intrare si tensiune/curent de iesire. Fie pui campuri separate, fie le asimilezi unor campuri existente
Dar trebuie sa tii cont doar de caracteristicile care te intereseaza mai departe, nu de toate caracteristicile unui element. Poti pune un camp memo in care sa tii toata descrierea lui, dar in campuri treci doar ceea ce iti trebuie pentru filtrari si selectii, astfel incat sa poti optimiza un filtru dupa acea caracteristica.
Iti creezi campurile necesare in tabela de elemente, chiar daca pentru o categorie de elemente anumite campuri raman necompletate.

In nici un caz un element nu apare de mai multe ori in aceasta tabela, chiar daca are mai multe tensiuni sau este folosit in mai multe locuri.

Daniel Buduru
 1/19/2011 4:31:04 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Deja ma doare capul si sunt gata sa renunt! Ma incurca echipamantele pe 2 nivele de tensiuni ... gen transformatorul! Schemele mele sunt impartite pe nivele de tensiuni! 220, 110, 24! Transformatorul are primar si secundar! Cand afisez schema pe 220 ... afisez circuitul primar al transformatorului, iar la 110 afisez circuitul secundar! La un moment dat ma intereseaza sa afisez tot circuitul transformatorului cu primar si secundar si cu toate elementele! Deci am un circuit care cuprinde 2 circuite!
 1/19/2011 5:46:47 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Daca expui problema complet, de le inceput, se scuteste timp - si nu numai.
Baza de date e una si modelararea functionarii circuitului e altceva. Ca vrei s ale faci pe amandoua cu acelasi program, ok. Dar sunt lucruri diferite.
Cum vrei tu, sa pui transformatorul de doua ori, o data cu 220V si alta data cu 12V inseamna sa ai in schema doua transformatoare, nu unul.
Daca vrei sa pui in evidenta circuitele si elementele, trebuie sa te gandesti la ce anume iti trebuie la reprezentare.
Cu tabelele definite pana acum, circuitul este definit, dar inca nu poate fi  reprezentat.
O solutie ar fi sa pui cate un camp logic in tabela pentru fiecare tensiune (normalizata) cu care lucrezi in aceste circuite, si sa bifezi tensiunile pe care le are elementul respectiv in circuit.
Sa ne intelegem: un releu poate avea tensiunea de comanda de 12V si tensiunea admisa pe contacte de 240V, dar asta nu inseamna ca nu suporta si tensiunea de 110V pe contacte ... desigur, la alt curent. Valoarae tensiunii pe contacte o stabilesti doar in circuitul in care il folosesti, nu ca o caracteristica a releului. In acelasi timp, tensiunea de comanda (12V) este o caracteristica a releului.
Ce te faci cu un triac de 800V? ce tensiune ii treci in tabela de elemente? Daca treci 800V, nu iti apare cand selectezi elementele cu 240, 110, 24 ...
Daca numarul tensiunilor e mare si nu e convenabil sa pui campuri in tabela, atunci creezi o tabela child, cu idobiect si tensiune, unde pui cate o inregistrare pentru fiecare tensiune aplicabila obiectului.
Daca vrei sa reprezinti circuitele pe tensuini, pentru transformator ar nevoie de cate o poza pentru fiecare infasurare, si o regula de afisare a lor - cand una, cand alta, cand ambele (sau cate infasurari are traful, poti avea chiar mai multe tensiuni pe un traf, ex 110, 240, 24, 12, 5 ....)

Aplicatia se defineste de la final, de la ce vreau sa fac cu ea si ce vreau sa-mi arate. Cand am stabilit cerintele, incep sa vad ce-mi trebuie pentru a le realiza si de unde iau datele.


Daniel Buduru
 1/19/2011 10:46:17 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Ok! Deci programul este necesar pentru a rezulta in final niste instructiuni text pentru aducerea in anumite stari a circuitelor!
Deci am containerul ala mare care cuprinde mai multe instalatii! Instalatiile sunt de fapt nivelele de tensiune! Fiecarei instalatii ii corespunde un nivel de tensiune!  Fiecare nivel de tensiune (instalatie) cuprinde mai multe circuite! Fiecare circuit are elemente de comutatie! Acum ... programul afiseaza instalatiile pe un Pageframe ... cate o instalatie (adica schema ei) pe  cate un Page! Utilizatorul selecteaza din schema (instalatie) circuitul care il intereseaza! Acesta va fi afisat cu elementele componente intr-un alt form! Fiecare circuit are anumite portiuni la care utilizatorul poate dori sa le schimbe starea! Sunt mai multe stari care se definesc dupa pozitia elementelor din portiune! Problema e ca o portiune nu cuprinde elemente distincte! Ex Portiunea1_circ1 pentru a defini starea y trebuie deschis I_circ1, S1_circ1, S2_circ1, iar pentru a defini starea x a Portiune2_circ1 trebuie deschis I_circ1 si S3_circ! Utilizatorul poate alege dintr-un combo starea in care vrea sa fie adusa portiunea sau portiunile sau poate executa in schema circuitului deschiderea sau inchiderea elementelor de comutatie! LA final trebuie sa-i afiseze niste linii de instructiuni text cu ordinea operatilor care trebuiesc efectuate! Fiecare actionare (deschidere sau inchidere) cuprinde anumite linii text! Ex pentru deschidrea unui element tip S . Se selecteaza S1_circ1. Se deschide S1_circ1. Se verifica poz deschis a S1_circ1. Problema apare si atunci cand am transformatorul! Transformatorul in sine nu are nici un element de comutatie dar si acesta se poate aduce in anumite stari care sunt definite de elemente de comutatie din circuitul primar si secundar! Deci la un transformator pe utilizator poate sa-l intereseze circsec_tr1 sau circprim_tr1 sau tr1 sau toate trei sau (tr1 circsec_tr1) sau ... etc! Cam asta ar fi in mare!


 1/19/2011 11:33:57 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Ar trebui sa identifici toate elementele de comutatie la nivelul schemei, nu al circuitului, iar vectorul de stare sa fie la nivelul schemei.
Evident, trebuie reperate segmente din acest vector corespunzatoare fiecarui circuit, astfel incat sa poti adresa elementele din el.
Doar cu un vector de stare la nivelul schemei vei putea realiza ce doresti, vector care sa fie actualizat la orice schimbare de stare a unui element.

In ceea ce priveste tensiunile, trebuie sa pui in fiecare obiect atatea proprietati cate tensiuni niminale sunt pe schema, sa zicem T1, T2, T3, de tip logic.
Daca un element are si tensiunea T1, si tensiunea T2, le bifezi pe amandoua. Oricum, tensiunea este o caracteristica a circuitului, nu a elementului de comutatie. El poate avea o tensiune maxima admisibila, care poate fi mai mare decat a crcuitului in care lucreaza.

Dupa parerea mea, ar trebui fie sa se vada pe acelasi form sau pagina toate elementele a caror stare trebuie modificata, fie sa nu poata fi modificata starea altor elemente decat cele vizibile, starea celorlalte putand fi afisata intr-un tabel pe form, fie sa gestionezi si perechile de contacte, respectiv sa iti apara in circuit contactul unui releu / comutator care se gaseste in alt circuit. De altfel, asa se si reprezinta pe schema.

Pentru a gestiona contactele, ar trebui ca in tabela de elemente - acolo unde sunt definite generic - sa ai un camp pentru numarul de contacte, si sa ai o tabela child pentru tabela instalatii_L, in care sa ai id obiect, idcontact, NI/ND si idinstalatie (circuit) in care se gaseste contactul. Legatura se face pe idobiect. iIcontact ar fi idobiect+numar contact, de ex idobiect*1000+nrcontact
Contactul respectiv trebuie sa apara si in obiectul (containerul) circuitului, sa isi schimbe imaginea in functie de starea elementului de care apartine.

Din pacate, nu mai am timp acum, si cred ca nu voi  putea accesa forumul pana vineri seara.

Daniel Buduru
 1/23/2011 11:10:34 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Se poate itera cu un singur FOR prin toate obiectele continute de un form, inclusiv prin obiectele Containerelor din form?
 1/23/2011 11:35:49 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Vezi aici un cod postat de Grig:
http://profox.ro/Forum/tabid/55/forumid/7/threadid/4326/scope/posts/Default.aspx


Daniel Buduru
 1/23/2011 11:57:59 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Cotinui cu baza de date.
Problema cea mai mare este aceea ca formul cu simularea functionarii, respectiv clasele circuitelor nu au o legatura in cod cu baza de date. Baza de date si circuitele se modifica independent una de alta, baza de adte putand fi modificata oricand de catre utilizator, in timp ce clasele pot fi modificate doar in design, de catre programator. De aici apar problemele de care te tot lovesti.
O astfel de aplicatie nu rezista.
Fie faci o aplicatie care, pornind de la baza de date, sa creeze circuitele, respectiv sa adauge in container fiecare obiect specificat in baza de date si sa faca legaturile intre ele, fie construiesti schema in design-time, in clase, apoi, din form, creezi tabela de circuite, prin scanarea obiectelor si crearea inregistrarilor corespunzatoare in tabela. Fezabil, destul de simplu pentru elementele inseriate, dar se complica la pozarea elementelor in paralel
Doar tabela cu elementele de circuit se completeaza dinainte, si mai trebuie ca fiecare obiect din clase sa aiba intr-o proprietate id-ul elementului.

In ceea ce priveste generarea scriptului cu operatiile care trebuie executate, in ordine, nu e clar daca vrei sa se inregistreze pur si simplu pasii facuti de catre utilizator, sau sa se listeze o secventa deja definita pentru actiunea respectiva, secventa stocata undeva.



Daniel Buduru
 1/24/2011 9:19:34 AM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Corect ar fi prima varianta ... aceea cu utilizatorul caruia i se peminte crearea circuitelor! Asa am vrut sa fac la inceput dar mi-am dat seama ca e prea mult ptr mine .... poate mai tarziu o sa incerc o astfel de aplicatie! Deocamdata am lasat iarasi baza de date la urma ... de aceea nici nu am mai scris pe forum! In aplicatia veche facusem schema in design-time si starile circuitelor si ale elementelor le faceam prin iteratie in functie de denumirea obiectelor din form(dadusem nume la obiecte astfel incat se le imi permita o iteratie) .... dar bineinteles ca e mai buna varianta cu proprietatea ID in obiect! Nu intelg la ce te referi cand zici ca se complica la elemente in paralel? Daca ai putea sa-mi dai un exemplu!?
 1/24/2011 9:56:36 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A) Modified By Daniel Buduru  on 1/24/2011 11:22:06 AM)
Sa zicem ca faci o clasa circuit, derivata din container, apoi o clasa generica pentru elementul de circuit, pe care o particularizezi cu o poza pentru tipul de element, si o clasa conductor - care sa reprezinte circuitl electric.
Ca sa construiesti obiectul in run-time, adaugi in form clasa circuit, apoi incarci rand pe rand elementele de circuit. Pentru a adauga un element de circuit, creezi  in container un obiect derivat clasa elementului, ii pui poza corespunzatoare tipului d eelement, si il pozitionezi in container. Pentru elementele inseriate, e suficient sa il deplasezi la dreapta (sau in jos) cu un numar de pixeli fata de elementul precedent, iar intre ele sa aduci un obiect concuctor (sau sa extinzi primul obiect conductor pana ajunga la elementul de circuit).
Daca ai elemente in paralel, trebuie sa definesti un nod pe conductor, sa definesti setul de elemente in paralel si sa pozitionezi obiectul pe doua directii.
Nu e foarte complicat, dar ceva mai mullt decat la serie - trebuie definite niste reguli si niste informatii in baza de date care sa permita plasarea corecta a elementelor si a conductorului.
De fapt, circuitul este deschis de functia logica - fiecare factor din functia logica este un element de circuit, operatorul SI inseamna conectare in serie, operatorul SAU - conectare in paralel.
Ca sa simplifici lucrurile, trebuie sa diferentiezi cumva partea de comanda a un ui element de circuit de partea de executie. De exemplu, la un contactor ai o parte de comanda (bobina), care este capatul unui circuit, si o parte de executie, contactele, care se intercaleaza in alte circuite. Daca ai un singur nume pentru contactor, atat pentru comanda, cat si pentru contacte, vei avea o gramada de confuzii.
Regula este ca fiecare borna a unui contactor sa fie numerotata, iar in schema se indica numele/codul elementului si numarul contactului.
Numele elementului si codul trebuie sa fie unice in schema, chiar daca pentru asta in nume si cod sunt incluse parti din numele/codul parinte.

O idee ar fi ca la fiecare element sa tii elementul la care se conecteaza in amonte In felul asta poti determina cum se leaga fiecare element, nu mai ai nevoie de index - ceea ce te scuteste de o mare complicatie, si anume, generarea si intretinerea indexului - si poti acoperi si crcuite arborescente.
Apare o problema la derivatie, unde ai mai multe elemente in amonte.
O solutie ar fi sa definesti si elementul din aval, dar asta inseamna redundanta si trebuie evitata.
O alta solutie ar fi definirea unui element de tip nod sau bara de conectare, care sa se conecteze la mai multe elemente in amonte - ceea ce inseamna o tabela de conectari, unde un element poate avea mai multe elemente in amonte.
Se mai poate face si o analiza pe tabela, astfel incat se se determine automat la cine se leaga in aval fiecare circuit, daca nu are nici un descendent. La asta ajuta diferentierea partii de comanda de partea de executie: daca un element nu are descendenti si e comanda, e capat de circuit; daca nu are descendenti, e in derivatie si e contact, se leaga la urmatorul element de circuit care are in amonte un element in paralel cu cel in cauza.
Trebuie analizata problema si tatonata un pic solutia.


Daniel Buduru
 1/24/2011 10:21:14 AM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Am definita si o clasa nod si am si tabela in sensul asta! Si bineinteles ca si la asta am o functie logica! Intradevar functia logica e mai stufoasa in momentul cand imi apar elementele in paralel! Cu siguranta am sa mai revin cu intrebari cand am sa ajung la faza aia! Am incercat codul lui Grig vis-a-vis de iterarea obiectelor dintr-un form! Am incercat pe o clasa facuta de mine care se bazeaza pe Container (schema) si a functionat! Ma interesa sa le modifica dimensiunea functie de rezolutia calculatorului! Si am incercat pe Formul unde am un Pageframe care contine pe cate o pagina clasele derivate din schema! Codul mi se "blocheaza" la PageFrame1 imi spune "Objects cannot be enumerated"! Metoda cu modificareadimensiunilor o apelez la Init-ul formului!
 1/24/2011 10:22:55 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A) Modified By Daniel Buduru  on 1/24/2011 11:36:46 AM)
Am editat postul anterior, uita-te un pic la el.

Daniel Buduru
 1/24/2011 10:36:31 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
 ji_ci wrote
....
 Am incercat pe o clasa facuta de mine care se bazeaza pe Container (schema) si a functionat! Ma interesa sa le modifica dimensiunea functie de rezolutia calculatorului! Si am incercat pe Formul unde am un Pageframe care contine pe cate o pagina clasele derivate din schema! Codul mi se "blocheaza" la PageFrame1 imi spune "Objects cannot be enumerated"! Metoda cu modificareadimensiunilor o apelez la Init-ul formului!

Pageframe nu are o colectie objects, ci pages. Pune un if sau do case in care sa analizezi clasa, apoi paseaza obiectul corespunzator.

Modificarea dimensiunilor trebuie apelata din resize. Daca are si o stocare a dimensiunilor initiale, o apelezi si din form.init

Sfatul meu insistent e sa treci pe vfp9. Sunt multe elemente de limbaj care faciliteaza ce vrei sa faci.
Cu proprietatea anchor, redimensionarea se face automat, nu mai e nevoie de nici un fel de cod.
Cu Bindevent poti face ca toate contactele unui contactoir sa-si schimbe starea la actionarea lui.
Si nu numai astea ...

Sfatul meu e sa mergi pe crearea automata a circuitelor. E fezabila si, cu cat incepi mai devreme, cu atat e mai bine.
Fa doar cele trei clase - circuit, element de circuit si conductor. Vei avea nevoie probabil si de o clasa nod. In orice caz, nu faci clase distincte pentru fiecare tip de element de circuit, altfel risti sa definesti un nou tip de element de circuit, pentru care nu ai inca o clasa, si aplicatia clacheaza.
Daca ai o singura clasa, in care doar incarci o poza specifica, in lipsa pozei specifice se va afisa una generica, dar programul va functiona fara probleme.


Daniel Buduru
 1/24/2011 12:50:01 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Glumind as spune ca nu mai intru pe forum! Ca de o luna n-am facut nimic concret! Ca tot ce fac imi dau seama ca nu e corect! Trebuie sa-mi fac o reevaluare a ceea ce vreau sa fac ... ca deja nici eu nu mai stiu!
In orice caz nu o sa ma apuc sa fac o platforma de lucru ptr utilizator in care sa-si fac el circuitele .... e prea complicat! Utilizatorul doar va actiona elementele din circuit! ATAT! Modificarile sau alte schemele voi face eu in design-time! Eu trebuie sa-mi fac munca mai usoara! Si va trebuie sa lupt pe 2 fronturi ... din cate imi dau seama sa fac si in baza de date ce fac in clase! Nu vad altfel cum as putea creea automat circuitele! Nu pot sa-i dau in baza de date elementele continute de un circuit si sa-mi deseneze circuitul!
 1/24/2011 1:11:07 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A) Modified By Daniel Buduru  on 1/24/2011 2:11:54 PM)
 ji_ci wrote
....
In orice caz nu o sa ma apuc sa fac o platforma de lucru ptr utilizator in care sa-si fac el circuitele .... e prea complicat! Utilizatorul doar va actiona elementele din circuit! ATAT! Modificarile sau alte schemele voi face eu in design-time! Eu trebuie sa-mi fac munca mai usoara! Si va trebuie sa lupt pe 2 fronturi ... din cate imi dau seama sa fac si in baza de date ce fac in clase! Nu vad altfel cum as putea creea automat circuitele! Nu pot sa-i dau in baza de date elementele continute de un circuit si sa-mi deseneze circuitul!

E mai complicat cum ai inceput. Poti sa-i dai in baza de date elementele si sa-ti deseneze circuitul, si e mai putin laborios decat sa-l faci manual in designer.

Daniel Buduru
 1/24/2011 1:58:42 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
N-am idee cum as putea face asta? Ar trebui la fiecare element sa-i spun ordinea in circuit, felul cum se leaga de celelalte elemente (in paralel sau in serie), mai trebuie si o clasa conductor care leaga elementele intre ele (eu i-am spus nod) ... dar cum le va pozitiona in circuit?
 1/24/2011 2:15:33 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Scuze .... mi-ai raspuns la asta inainte!
 1/24/2011 4:15:59 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Daca ma uit la poza pe care ai postat-o, fiecare circuit este legat la doua linii.
Sa zicema ca circuitul se desfasoara pe verticala, de sus in jos si de la stanga la dreapta, deci originea in stanga sus, inaltimea creste in jos iar latimea creste la dreapta. Aceeasi orientare a axelor ca si in formul vfp.
Vom deriva clasa schemei dintr-un container, astfel ca sa poate fi plasat si in pageframe
Definim in clasa circuitului legarea la una sau mai multe linii de tensiune.
Cum definim tabelele din baza de date vom stabili pe urma, dupa ce vedem ce informatii ne trebuie.
Instantiem clasa schemei (in form, nu ma leg acum d epageframe):
thisform.Newobject('Schema', ClasaSchema,BibliotecaScheme)
oSchema=eval('thisform.'+'Schema')
In clasa schemei vom avea metode pentru adaugarea liniilor si circuitelor
Adaugam in schema fiecare linie - cate linii si cum se numesc luam din tabela.
Vom avea in schema un vector care sa tina evidenta liniilor .aLinii(1,2)
Vectorul aLinii  se incarca din tabela. Sub ce forma, nu conteaza acum.
In aLinii(i,1) vom avea numele liniei (L1, L2,  ...) iar in aLinii(i,2) vom avea referinta la obiect.
Mai avem nevoie de o proprietate, LinieSpacing, in care tinem distanta dintre linii (in pixeli)
Cum instantiem liniile:
For lnLinie=1 to alen(this.aLinii,1)
  this.NewObject(this.aLinii(lnLinie,1),ClasaConductor,BibliotecaScheme)
  loLinie=eval('this.'+this.aLinii(lnLinie,1))
  loLinie.Left=this.left
  loLinie.top=5+this.LinieSpacing*(lnLinie-1)
  loLinie.Width=this.Width
  loLinie.Visible=.t.
Next
In metoda resize vom avea cod care sa aduca liniile la latimea schemei
For lni=1 to alen(this.aLinii,1)
  this.aLinii(lni,2).Width=this.Width
Next
In resize se va mai adauga cod  si pentru alte operatii

Acum incarcam fiecare circuit. Pentru asta, in clasa Schema avem metoda AddCircuit
Vom avea un vector, aCircuite(1,2), in care vom tine evidenta circuitelor
Incarcam in vector, din tabela, numele circuitelor, apoi instantiem circuitele.
For lni=1 to alen(this.aCircuite,1)
  this.NewObject(this.aCircuit(lni,1),ClasaCircuite, BibliotecaScheme)
  this.aCircuit(lni,2)=eval('this.'+this.aCircuit(lni,1))
 * pozitionam circuitul
    if lni=1
      this.aCircuit(lni,2).Left=5
    else
      this.aCircuit(lni,2).Left=this.aCircuit(lnI,2).left+this.aCircuit(lni,2).Width+this.nCircuitSpacing
   endif
Next
Dupa instantiere, incarcam datele circuitului din tabele - si asta vom vedea cum
Apoi il conectam la linii. Pentru asta, putem avea in clasa circuitului metoda ConectareLinii
Containerul circuitului va fi pozitionat peste liniile din schema, astfel incat liniile de conecatre sa apartina circuitului, nu schemei
In circuit vom avea o proprietate nLiniiSpacing, in care avem distanta dintre liniile de circuit, si nElementSpacing pentru distanta dintre elemente.
Vom avea si vectorul aLinii(1,4), cu liniile la care se conecteaza circuitul. in aLinii(i,1) vom avea numele liniei (L1, L2, etc), la fel ca la schema
Executam conectarea la linii
Mai intai stabilim pozitia top a primului element, astfel incat sa fie sub cea mai de jos linie din schema
this.TopElement=this.parent.aLinii(alen(this.parent.alinii,1),2).top-this.Top+this.nElementSpacing
For lni=1 to alen(this.aLinii,1)
   this.newobject(this.alinii(lni,1), ClasaConductor, BibliotecaScheme)
   loLinie=eval('this.'+this.aLinii(lni,1))
   this.aLinii(lni,2)=loLinie
   loLinie.left=this.nLiniiSpacing*lni
  *cautam linia schemei la care trebuie sa se conecteze
   nLinieSchema=ASCAN(loLinie.Name, this.parent.aLinii,1)
   oLinie.Top=this.parent.aLinii(nLinieSchema,2).Top-this.top
   oLinie.Height=this.nTopElement-oLinie.Top
  oLinie.Visible=.t.
Next
Incepem sa instantiem elementele - vom avea o metoda in clasa circuitului pentru asta
Incarcam vetorul aElemente din tabela, aElement(i,1)= numele elementului, aElement(i,2) = referinta la element
for lni=1 to alen(this.aElemente,1)
   this.NewObject(this.aElemente(lni,1), ClasaElemente, BibliotecaScheme)
   loElement=eval('this.'+this.aElemente(lni,1))
   * incarcam in proprietatile elementului datele din tabela
   * legam elementul la linia corespunzatoare
   nLinie=ascan(this.aLinii, loElement.linie,1)
   loLinie=this.aLinii(nLinie,2)
   *Determinam de cine se leaga elementul
      lnparent=ascan(loElement.ParentName, this.aElemente,1)
   if lnParent=0
      loParent=.null;
   endif
   IF lnI=1 or ISNULL(loParent)
       loElement.Top = this.TopElement
  Else
      loElement.Top = loParent.Top+this.nElementSpacing
 Endif

* Acum vine pozitionarea orizontala.
* Determinam al catelea element pe nivel este cautand cate elemente cu acelasi element in amonte sunt deja instantiate.
lnLevelIndex=0
for lni =1 to alen(this.aElements,1)
   if this.aElements(lni,2)<>loElement and this.aElements(lni,2).ParentName=loElement.ParentName
     lnLevelIndex=lnLevelIndex+1
   endif
Next
loElement.Left=this.aLinii(1,2).Left+this.nLiniiSpacing*lnLevelIndex

Acum ar trebui facuta legatura la nod. Daca ai un element nod, cu numarul de legaturi (1, 2, 3 ...) se poate face o clasa care sa aiba deja liniile.
Nu continui acum, mi-a luat mai mult timp decat imi permit acum, dar ideea asta e, si e fezabila
Dupa ce s-au instantiat toate elementele, urmeaza dimensionarea containerului circuit astfel incat sa cuprinda toate obiectele.
nMaxRight=0
nMaxHeight=0
for lni=1 to alen(this.aElemente,1)
   loElement=this.aElemente(lni,2)
   nMaxRight=max(nMaxRight, loElement.left+loElement.Width)
   nMaxHeight=max(nMaxHeight, loElement.Top+loElement.Height)
next
this.Width=nMaxWidth+5
this.Height=nMaxHeight+5

Cam asta e de facut. Desigur, la implementare mai apar probleme, dar se rezolva pe rand.

Daniel Buduru
 1/24/2011 4:21:31 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (N/A)
Eu tocmai incercam sa-ti trimit pe mail schema completa ... dar nu ma lasa ... O sa citesc ce mi-ai scris!
 1/24/2011 4:54:24 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (N/A)
Eu cred ca am putea sa simplificam lucrurile sarind de etapa cu linii! Adica eu am facute poze cu toate liniile dintre elemente (la astea le spun eu noduri!) Deci circuitul este format din noduri! Grafic reprezint elementuldoar prin contactul lui (inchis sau deschis)! Restul graficului din elemente rezulta din combinarea a doua poze de nod! As merge pe varianta asta deoarece pe liniile acelea mai intervin si alte elemente grafice (care tin numai de design) si mi-e mai usor sa fac in AutoCad nodul! Si iarasi trebuie sa reprezint cele trei stari ale nodului in care intra si elementul (si elementul va primi culoarea nodurilor vecine) prin trei culori! Daca as face Elementul grafic in intregim ar insemna sa fac 9 poze fiecare tip de element! De aceea reprezint numai contactul.... iar restul elementului rezulta din noduri!
 1/24/2011 5:16:53 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A) Modified By Daniel Buduru  on 1/24/2011 6:17:45 PM)
Poti simplifica, desigur. 
Cu observatia ca, daca poza este generica - respectiv conecteaza un element la 2 elemente sau 2 elemente la unul, e ok.
Daca insa poza reprezinta legatura specifica dintre C1 S1, C1S2 si C1 S3, nu mai e ok.
Nu e nevoie sa faci nodul grafic, se poate face un container in care sa pui linii, iar aceste linii sa primeasca ce culori e nevoie.
La contacte, am o observatie. Eu presupun ca in schema pe care ai postat-o S1 si S2 reprezinta contactele normal inchid/normal deschis ale aceluiasi contactor, si nu doua contactoare diferite - actionarea lor succesiva ar pune in legatura cele doua linii, ceea ce nu e bina. In acest caz, ar trebui pastrata reprezentarea standardizata a contactelor NI/ND.

Nu mi-ai spus daca poti trece pe vfp9.

Daniel Buduru
 1/24/2011 5:40:12 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Partea mai delicata ramane schimbarea starilor la actionarea unui element. Delicata in vfp6, mult mai usor fezabila in vfp9.
Acum presupun ca ai scris cod in fiecare clasa, cod specific acelei clase.
Daca insa instantiezi un circuit pornind de la datele din tabela, nu mai poti utiliza decat cod generic, nu particularizat.
Particularizarea se face prin valaorea unor proprietati.
Practic, la fiecare actionare a unui element trebuie sa ii schimbi starea in vectorul de stare, apoi in fiecare circuit sa apelezi o metoda care evalueaza functia logica si actualizeaza restul elementelor.
Fiecare modificare a starii unui element genereaza modificarea starii altor elemente, din acelasi circuit sau din alte circuite.
Te vei lovi de problema precedentei schimbarii starilor, respectiv de ordinea apelarii metodelor care evalueaza functia.
Poti avea o situatie in care modificarea starii unui circuit induce modificarea starii altui circuit, care, la randul lui, modifica din nou starea primului circuit. Situatia apare frecvent in circuite cu bucla de reactie.
In cazul in care lucrezi cu bindevents, evaluarea se face automat pana cand starea este stabilizata.


Daniel Buduru
 1/24/2011 8:13:57 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)

Imi cer scuze ca raspund asa tarziu! Un nod este portiunea dintre elementele invecinate ale unui singur circuit! Ex noduri sunt portiunea dintre C1S1, C1S2 si C1I sau cea dintr C1I si C1S3 samd ... in final tot circuitul este format din noduri imbinate! As merge pe varianta de poza ptr fiecare nod .... ptr ca deja le am facute! Pentru fiecare nod aceasi poza in trei culori diferite pentru fiecare stare a nodului! In chema nu am contactori sau contacte auxiliare ... sunt doar elemente gen intreruptor (adica un singur contact inchis sau deschis)!
Restul e asa cum ai scris mai sus! Fiecare modificare a starii unui element trebuie modificata si in vectorul cu stariile elementelor din schema! O schimbare a starii unui element nu duce la schimbarea altori stari ale altor elemente (se modifica doar starea elementului actionat)! In schimb a asa e cum ai presupus si tu ... o schimbare a starii unui element duce la schimbarea stariilor a mai multor noduri din scheme nu numai a celor din circuit! De aceea functia logica (care o am intr-o tabela) e mai stufoasa in ea fiind incluse toate elementele din schema! Am incercat in functie logica sa pun doar starile elementelor si de sursa de tensiune ... ar mai fi o varianta ca functia logica sa depinda starile nodurilor invecinate (dar ramane sa mai studiez varianta asta)! O sa incerc VFP9!
 1/24/2011 8:21:13 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Cele doua linii (bare) se pot interconecta intre ele ... deci se poate la un moment dat sa se  inchide S1 si S2 la acelasi circuit .... rezultand ca bara1 si bara2 devin intr-un fel o singura bara! Dintre circuitele de pe schema va trebui sa nominaliz (asta o va face utilizatorul) care este sursa de tensiune! Ex Circuitul 1 va fi sursa de tensiune pentru Bara2 ... Bara1 va fi alimentata cu tensiune din Bara2 (daca se inchid cele trei elemente ale circuitului nenominalizat ... vezi schema) sau poate avea ca sursa alt circuit!
 1/25/2011 9:24:19 AM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Ar mai fi o problema ... si nu vreau s-o rezolv cu scrollbar (utilizatorul trebuie sa vada toata schema pe ecran)! Schema nu-mi incape pe ecran si atunci trebuie sa pozitionez circuitele sus si jos si cele 2 linii imi apar de doua ori .... asta inseamna ca am sus circuitele rotite la 180 ... dar vad ca nu e o problema in VFP9! Alta ar fi cu elementele .... cred ca va trebuii sa le includ in clasa nod ... ca nu am cum sa le pozitionez altfel! Atunci o nod va contine contactul elementului iar nodul pereche nu!
 1/25/2011 9:52:45 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Daca vei combina elementele nu vei mai putea automatiza schema.
1. In VFP9 scalarea se face automat, deci nu vor fi probleme cu dimensiune schemei
2. Daca vrei sa pozitionezi circuite si pe o parte si pe alta a liniilor, se poate face si asta in cod. Mai intai, porneste cu un model simplu, o schema cu doua circuite. Trebuie sa rezolvi alte probleme acum,.
3. In circuit, pozitionezi elementele unul sub altul cu axa pe o linie. Elementele legate in paralel se plaseaza la dreapta, vor fi asimetrice fate de linie (ulterior, dupa ce clasa functioneaza, poti ajusta codul astfel incat sa le plasezi simetric)
4. Ai nevoie de o clasa nod cu mai multe tipuri de nod - o singura legatura,  apoi tipul A: 1 la 2, 1 la 3 (daca ai trei elemente in paralel) pentru conectarea a mai multe, tipul B: 2 la 1, 3 la 1 ...
In functie de cate elemente se conecteaza la acelasi element in amonte, se alege tipul  A1, A2, A3 ... Pentru conectarea mai multor elemente la urmatorul element de circuit alegi tipul B2, B3 ...
Nodul poate fi o regleta de conectare cu n contacte (ca sa ai un element real de circuit, nu unul artificial) la care mai adaugi un sens (ca sa stii cum va trebui pozitionata, cu ramificatia in jos sau in sus)
Cred ca ar trebui sa introduci un cod de grupare pentru elementele conectate in paralel, un fel de id de nivel. Asta te va ajuta sa stii dinainte cate elemente vei avea in paralel si ce fel de nod va trebui pentru conectarea lor.

Ideea de baza este ca toata configurarea sa se faca pe baza unor proprietati, si sa nu creezi elemente artificiale, care nu au un corespondent real in circuit.
Chiar daca aspectul nu este chiar cel dorit de la inceput, asta se rezolva in etapa urmatoare.

Vei trece prin mai multe etape de tataonare, asa ceva nu se face optim din prima incercare, chiar daca ai mai facut aplicatii de acest gen.
Fa o tabela cu ce ai nevoie pentru instantierea schemei,  nu iti bate capul acum cum o legi de restul. Vei tot modifica tabela asta, pana cand ajunge sa contina ce iti trebuie.
Abia dupa ce functioneaza o schema cu doua circuite incepi sa te ocupi de optimizare si de aspect.


Daniel Buduru
 1/25/2011 10:50:26 AM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
E adevarat tot ce spui! E prea complicat deocamdata sa fac un program de genul ala! Trebuie cuprinse o gramada de aspecte! Am sa fac doar cazul particular ... pe schemele pe care le am eu .... deja e prea mult timp de cand trag matza de coada si sunt presat de timp! Deci voi crea in final schemele in design! Pe cazul asta particular sunt convins ca voi invata multe care-mi vor fi de folos in crearea unei aplicatii generale! Mi-ai spus la un moment dat de biblioteca gdplus ... nu o gasesc! As vrea sa folosesc clasa circuit ca si imagine pentru a putea sa o rotesc unde e cazul in schema!
 1/25/2011 11:36:20 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A) Modified By Daniel Buduru  on 1/25/2011 12:38:28 PM)
E in vfp9. Poti folosi GDIPlusX, de la codeplex.

http://www.codeplex.com/wikipage?ProjectName=VFPX&title=GDIPlusX


Programul nu e complicat, tu privesti lucrurile complicat.

In cazul asta particular nu vei invata nimic despre crearea unei aplicatii generale.
Poti face un form desenat, care sa reprezinte o schema, dar asta nu este o aplicatie ....
Fiecare schema va trebui desenata manual, si tot manual scrise codurile care sa faca una sau alta pe schema.

Daca faci o clasa pentru elementul de circuit, doar un container cu un label in care sa apara numele elementului, poti deja instantia un circuit.
La clasa asta adaugi proprietatile numar intrari si numar iesiri.
Cand instantiezi un nod din aceasta clasa, Latimea Nxlatimea unui element, unde N este maximul dintre intrari si iesiri.
Vei putea apoi, in cod,  trasa linii in interior, in functie de intrari si iesiri, astfel incat sa apara legarea corecta.

Pentru inceput, trebuie doar s apui patratele in ordinea corecat in interiorul circuitului, fara sa te intereseze inca ce este in fiecare patrat.
Pare mai comod sa pui poze cu elementele de circuit, dar doar pare. E mai eficient sa desenezi elementele cu obiecte vfp (linie, shape).
Pentru schimbarea culorii e suficient sa modifici forecolor, fara sa ai nevoie de cate o poza in fiecare culoare.

Oricum, la final va fi durat la fel de mult sa desenezi schema manual in designer cat si sa faci aplicatia care se deseneaza singura.

Daca mergi pe desenatul in designer, vei invata la fel de mult cat inveti scriind un document in word.
Tu alegi.

Daniel Buduru
 1/25/2011 12:09:27 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
No bine! M-ai convins si data asta! O sa iau o pauza sa studiez mai bine problema ... ca sa nu alergam dintr-o parte in alta! Doar o intrebare! Oare n-ar fi mai facil pentru utilizator sa-si aleaga dintr-o paleta gen toolbox elemenetele si nodurile si sa-si creeze grafic circuitul? Intreb asta ca sa stiu cum gandesc problema de la inceput!
 1/25/2011 12:34:52 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Partea care iti ridica acum cele mai multe probleme nu este codul pe care trebuie sa-l scrii, ci descrierea circuitului intr-un mod abstract.
Asta e si castigul cel mai mare pe care-l vei avea din realizarea aplicatiei

Poti sa faci si asa, utilizatorul sa aleaga elemente din toolbox si sa-si faca schema. Va trebui sa determini regulile de conectare, si asta doar din plasarea elementelor si din valorile date proprietatilor de catre utilizator.
Nici asta nu e foarte complicat, dar e mai complicat decat definirea circuitului in tabela. Dupa ce vei face aplicatia pronind de la tabela, va fi simplu sa o faci si invers. Ori de cate ori utilizatorul va alege un element de circuit, il vei introduce mai intai in tabela apoi il vei pozitiona si conecta cu acelasi algoritm.

Doar incepi, nu ti se va mai parea atat de complicat dupa ce pui cateva elemente intr-un container.

Daniel Buduru
 1/27/2011 1:50:21 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Am reusit cate ceva ... bineinteles ca problema apare la elementele in paralel! Nu stiu ce date ar trebuii sa dea utilizatorul in ce priveste legaturile intre elemente! As vrea ca utilizatorul sa precizeze doar legaturile in amonte fara sa precizeze ce fel se legatura este! Si pe baza acestor informatii se depistez cum sunt legate elementele ... dar nu stiu daca e suficient! Sau alta varianta ar fi sa introduca formula schemei logice a circuitului sau sa o creez eu pe seama informatiilor primite ... dar nu stiu cum m-ar ajuta in codul pentru creearea circuitului!?
 1/27/2011 3:00:42 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Dupa cum ziceam, problema nu e codul vfp, ci descrierea circuitului

O varianta ar fi sa definesti tipul de nod - cate intrari, cate iesiri. Nodul din amonte de elementele in paralele are o intrare si n iesiri (cate elemente in paralel ai) Nodul din aval are n intrari si o iesire.

O alta varianta ar fi sa formezi grupuri de elemente in paralel. Daca ai lucra cu nivele (un index de grup, nu de element), atunci elementele cu acelasi nivel ar fi in paralel. Asta ar elimina necesitatea elementului parinte.

Alta varianta ar fi sa precizezi elementul de care un element se leaga in paralel. Ai avea un id parinte si un idparalel.

De pornit, ar trebui pornit de la conceptia circuitului. Cand proiectezi, ai intai functia logica, apoi o implementezi cu elemente. Elementele in paralel sunt puse pentru a realiza un SAU logic, nu pentru ca asa e mai frumos desenul. Deci te legi de acel SAU, utilizatorul trebuie sa stie foarte bine ce e cu el.

Daca lucrezi cu nivele in loc de idparinte (e cam acelasi lucru, de altfel) ai avea avantajul ca poti numerota nivelele, sa zicem, din 10 in 10, astfel  incat sa poti insera alte nivele intre ele, si poti sa elimini sau sa inlocuiesti un element de circuit fara a fi nevoie sa refaci referintele.
Un alt avantaj ar fi acela ca ai numara doar elementele pe un nivel si ai stabili deja ce fel de nod iti trebuie.
Fa o incercare cu nivelul, cred ca e mai eficient.




Daniel Buduru
 1/27/2011 6:14:42 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Da ... cred ca varianta cea mai optima si simpla in acelasi timp e cea cu nivelele! Si cred ca e usor de inteles si ptr utilizator .... doar sa inteleaga ca la un nivel se pun elemente in paralel! O sa incerc ... sigur o sa iasa!
 1/27/2011 9:48:54 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Varianta cu nivelele ar rezolva si o alta problema: circuit serie - paralel, cum ar fi un element in paralel cu doua elemente in serie.
Asta s-ar rezolva cu inca o proprietate (camp): cate nivele in plus sunt intre conexiunea amonte si conexiunea aval a unui element.
Implicit ar fi 0, dar, daca ai un element in paralel cu doua elemente in serie, primul s-ar intinde pe doua nivele, deci un nivel in plus, iar cele in serie pe cate un nivel.
Asta era una dintre probleme spinoase, o expresie de forma A OR (B AND C) poate apare oricand.
Daca un circuit se complica prea mult, il poti desface in circuite mai simple, pa care sa le conectezi apoi ca elemente de circuit. Dar nu e economic sa faci asta pentru situatia banala serie/paralel.

Daniel Buduru
 1/30/2011 8:56:39 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Am incercat sa implementez codul pe care mi l-ai scris ceva mai in urma! Am reusit pana la Metoda addElemente ... deci am pus liniile (barele) orizontale si liniile circuitului legate la barele respective! Pe  urma inteleg ca ar trebuii in prima faza legate elementele la liniile circuitului, apoi asezate una sub alta pe verticala si apoi aranjarea pe orizontala! Nu-mi iese ... La elemente care-i referinta la care te-ai gandit? Un alt element? Sau o linie de circuit? Si nu merge treaba cu ASCAN ... a trebuit sa dau eu valorile respective .... imi returneaza numarul elementului din array!
 1/30/2011 10:06:35 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A) Modified By Daniel Buduru  on 1/30/2011 11:08:06 PM)
Codul l-am scris direct pe forum, doar ca un exemplu. Sigur mi-a mai scapat ceva prin el, si oricum nu are niciun fel de tratare a erorilor.
ASCAN returneaza, intr-adevar, indexul elementului din vector - daca nu este prevazut altfel in parametrul 6, nflags.
Ar fi nRow=ASCAN(array, expresia_cautata, nStartElement (1, de regula), nElementsSearched (-1, vrei sa caute in toate), nSearchColumn (coloana in care cauti expresia, -1 pentru toate), nFlags (1- case insensitive, 2 - Set Exact ON, 4 Override Set Exact, 8 - return row index) (15 ar trebui sa pui aici).
Vezi in help sintaxa, nu mai stiu daca in vfp6 exista. Daca nu, obtii indexul liniei cu ASUBSCRIPT(array, ASCAN(array, expresie, 1,-1))
N-am mai lucrat cu vfp6 din 2001 (nici cu vfp9 nu mai lucrez de ceva vreme).

Daca ai trecut pe vfp9, in loc de vector utilizeaza o colectie, poti adresa elementul direct prin nume, nu numai prin index.
Spune-mi daca ai ramas pe vfp6 sau ai trecupt pe vfp9, ca sa stiu ce cod iti dau.

Chestia cu liniile si legarea la ele, precum si nodurile dintre elemente, le potilasa pentru mai tarziu, la fel , dupa ce iti faci mana cu instantierea si pozitionarea elementelor.

Ce nu-ti iese? Posteaza aici codul care nu-ti merge, sau explica in detaliu ce faci si ce nu-ti iese.

Referinta la elemente? Cum ai facut tabela? Ai mers cu parent sau cu nivel? Pune o structura, sa avem pe ce discuta. Oricum, idelement trebuie sa fie un singur camp, chiar daca valoarea din el e o concatenare. La fel si cod element ( ex C1S1) si denumire element, fiecare e un camp si are valori unice. IDElement il aloci prin program, codul si denumirea sunt date de utilizator.








Daniel Buduru
 1/30/2011 11:45:38 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Nu cred ca ajunge doar nivel! Eu m-am gandit la nivele pe orizontala ... adica S1 si S2 primul nivel, I al doilea si S3,S4 al treilea nivel(vezi schema)! Dar nu e suficient trebuie dat si parent in amonte! Ptr ca poate exista cazul sa fie S1,S2,S3 in primul nivel, iar in al doilea un I1, I2, I3 legat la S1, un I4 legat la S2 si un S3 legat la I3 ... Si mai trebuie tinut cont si de tipul legaturilor din amonte! Si astea cred ca trebuie inainte de face legatorile cu clasa nod, pentru a putea face pozitionarea elementelor! Si tipul legaturilor este cred eu> unu la mai multe, mai multe la unu sau unu la unu! Unu la unu e simplu de rezolvata ca ai 2 elemente cu acelasi Left doar Top diferit! Mai multe (in amonte) la unu iarasi ar fi simplu ptr ca pozitionezi elementul din aval la jumatatea dintre elementele de legatura din amonte! Problema e la unu (in amonte) mai multe in aval! Eu am inceput cu aranjarea din amonte in aval ... adica de la linii(bare)! Asta inseamna ca la ultima varianta de legatura trebuie depalasat pe orizontala si elementele din aval si cele din amonte! Nu stiu daca am fost destul de explicit!? Am trecut pe VFP 9!
 1/31/2011 9:03:03 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
De aranjarea pe orizontala nu e cazul sa te ocupi acum. E doar o chestie de design, care se poate ajusta oricand. Pentru inceput, aliniaza doar la stanga.

Circuitul pe care il descrii acum e mai complicat decat cel pe care l-ai pus in poza. .
Posteaza schema completa.


Daniel Buduru
 1/31/2011 2:12:04 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)

Asta-i ce am facut pana acum! E metoda addElemente! AElementeCircuite isi ia valorile din tabela ElementeCircuite in care am idelement,idcircuit,nLevel,Nparent! Nparent este elementul parinte in amonte a lui idelement! Am mai multe randuri cu acelasi idelement ptr ca sunt elemente cu mai multi parinti in amonte! Deocamdata nu stiu sa ma folosesc de nParent!

ultima_bara=ALLTRIM(this.parent.aBare(ALEN(this.Parent.aBare,1),1))

this.ntopElement=this.parent.&ultima_bara..Top-this.top+this.nelementespacing

LastLevel=1

nxElem=0

FOR ElemIni=1 TO ALEN(this.aelementeCircuite,1)

*adaug un nou element doar daca nu am mai fosst adaugat

IF IIF(ElemIni=1, this.aelementeCircuite(ElemIni,1)=1, this.aelementeCircuite(ElemIni,1)<>this.aelementeCircuite(ElemIni-1,1))

this.newobject("Element"+TRANSFORM(this.aElementeCircuite(ElemIni,1)),'ClasaElemente','BibliotecaSCheme')

loElement=EVALUATE("this.Element"+TRANSFORM(this.aElementeCircuite(ElemIni,1)))

ENDIF

*identific nivelul pe care este elementul

ElemLevel=this.aElementeCircuite(ElemIni,3)

*adun elementele pe acelasi nivel

IF ElemLevel=LastLevel

nxElem=nxElem+1

ELSE

nxElem=1

endif

loElement.Top=this.nTopElement+(this.nElementeSpacing+loElement.Height)*(ElemLevel-1)

loElement.Left=5+(this.nElementeSpacing+loElement.Width)*(nxElem-1)

loelement.Visible=.T.

LastLevel=ElemLevel

NEXT

 1/31/2011 2:53:36 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Pana aici e bine.
Nivelul nu acopera configuratia cu mai multe elemente distincte (nu grupate in paralel) in amonte.
Solutia care poate realiza asta e cu idparent, si cu mai multe inregistrari pentru acelasi idparent.
Ai insa nevoie de doua tabele, una cu idcircuit, idelement - unde idelement e cheie primara, iar in a doua tabela idelement, idparent unde si idelement si idparent sunt foreign key din prima tabela. Tabela asta contine cate o inregistrare idelement - idparent pentru fiecare element din amonte la care se conecteaza idelement.
Incarcarea vectorului elemente se face din prima tabela, ierarhia se face din a doua tabela.
Am sa-ti dau un exemplu de cod pe aceste doua tabele, dar nu acum, poate seara dtarziu sau maine dimineata - asta ca sa nu stai sa astepti un raspuns acum.


Daniel Buduru
 1/31/2011 6:11:58 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (N/A)
Daca tot suntem la faza asta cred ca ar trebuii spus ca in circuit intervin si echipamente (trafo, bobina etc) care sunt legate de elemente! Nu cred ca o sa incurce mult problema! Echipamente sunt si barele la care se leaga elementele din circuit ... dar cu legarea la bare pot face o metoda separata! Cu echipamentele insa cred ca ar trebuii incluse in aceeasi metoda addElemente, pentru ca au acelasi rol ca si elementele in realizarea schemei circuitului!
 2/1/2011 11:39:22 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A) Modified By Daniel Buduru  on 2/2/2011 11:44:21 AM)
Ti-am trimis pe mail un proiect cu schema.
Ruleaza formul - instantiaza al doiea circuit din schema postata de tine. Poti adauga circuitul de maimulte ori (acelasi, n-am stat sa introduc date si pentru celalalte).
Incearca sa redimensionezi forma in runtime
Ai clasele cu codul in ele.
In elemente nu e nici o poza, circuitul se termina abrupt, mai ai de lucru, dar ai acum baza de plecare, ca sa nu te mai invarti in jurul cozii :).


Edit
Am atasat proiectul

Daniel Buduru
schema.zip 
 2/1/2011 4:11:12 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Multumesc mult de tot! Chiar e material didactic! Abia astept sa-l studiez mai in amanunt!
 2/3/2011 3:32:11 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Sunt la faza cu colorarea nodurilor in functie de  3 stari! Vreau ca elementul sa aiba BorderColor jumatate- culoarea starii nodului din aval si cealalata jumatate - culoarea starii din amonte! M-am gandit sa folosesc tot circuitline ... in timp ce desenez nodurile sa adaug pe marginea elementului circuitline care sa fie de culoarea starii nodului ! Crezi ca e bine asa?
 2/3/2011 4:19:00 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
E bine si asa.
Eu insa as complica mai putin lucrurile, as colora elementul complet, nu pe jumatate.
Daca vrei sa-l faci jumatate, pune doua shape, pe jumatate de inaltime, una sus si una jos, si coloreaza-le pe ele, fie bordercolor, fie backcolor (caz in care borderwidth il faci 0).
Ti-as recomanda sa nu pui controale imagine cu poze, ci sa desenezi comutatorul cu shape si line, sau doar cu line - vezi proprietatea line.polypoints. Chiar si infasurarea o poti face cu line, daca te folosesti de polypoints.

Nu e cazul sa complici prea mult reprezentarea acum. Mai ai de rezolvat ceva probleme - vectorul de stare, schimbarea starii, si destule altete, ca sa lasi "floricelele" la urma.
Daca reusesti sa colorezi elementul intreg, cu siguranta vei reusi sa-l colorezi si pe jumatate.

Daniel Buduru
 2/3/2011 5:12:11 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania) Modified By ji_ci  on 2/3/2011 6:23:06 PM)
Pai asa imi trebuie in schema .... jumatate din element imi arata starea din amonte, iar cealalta starea din aval! Daca comutatorul e pe poz deschis atunci pot sa am in aval o stare (colorata intr-un fel) si in amonte o alta stare (colorata altfel)! Deci jumatate de element colorata intr-un fel , iar cealalta in alt fel! Si vreau doar conturul la element! In interior voi reprezenta contactul ... probabil va fi suficient o linie! Starea nodului e altceva decat starea elementului! Deci ramanem la varianta cu 2 shape?

De fapt nu merge cu 2 shape ... ca se vede Border pe mijloc...doar daca pun inca un shape peste cele 2 in interiorul elementului!
 2/3/2011 5:36:44 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Fa-l cu linii. Pune-le de la inceput in clasa element.
In init pozitioneaza-le pe fiecare in parte aliniata cu latura corespunzatoare - dimensiunile initiale ale clasei pot fi alterata, trebui sa pozitionezi fiecare obiect relativ la dimesiunea containerului la initializare.
In metoda settip fa-le invizibile pentru tip elenent nod.
Pune anchor-ul corespunzator - nu mai merge 240, trebuie ancorata fiecare linie in parte.

Daniel Buduru
 2/4/2011 10:37:32 AM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania) Modified By ji_ci  on 2/4/2011 11:43:28 AM)
Am rezolvat problema asta! Am adugat 6 linii: trei pentru partea de amonte a elementului (Lineamon1 ...) si trei pentru partea de aval (Lineaval1 ..)!  Imi cer scuze ca te stresez ptr fiecare pas ... dar mai am mult pana sa ma descurc singur! Cred ca ar trebuii sa fac o colectie NOD in care sa adaug toate liniile care fac parte dintr-un nod, inclusiv liniile pe care le-am aduagat in clasa element! Deci un nod este compus din liniile de legatura cu elementele din aval si amonte, plus orizontala (LH) si liniile de amonte ale elementului din aval, respectiv liniile de aval ale elementului din amonte! Ma intereseaza se le am grupate ptr fiecare nod in parte .... ca mai apoi sa pot seta mai usor culoarea lor in functie de starea nodului! Cred ca de o colectie am nevoie?

Cred ca tu ai gandit problema ca liniile nodului sa apartina elementului de tip NOD! Eu cred ca am complicat lucrurile!
 2/4/2011 12:21:38 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A) Modified By Daniel Buduru  on 2/4/2011 1:26:09 PM)
Ti-am scris o bucata buna de cod, dar a expirat sesiunea pana sa termin, asa ca l-am pierdut pe tot :)
Am sa revin, cand am sa mai am putin timp.

Nu face o colectie nod.
Nodul are acelasi potential, starea lui e data de expresia elementAmonte1 OR ElementAmonte2 OR elementAmonteN ...
Poti seta coloarea liniillor nodului cu SetAll('bordrecolor',lnColor,this.lineclass)

Daniel Buduru
 2/4/2011 12:31:08 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania) Modified By ji_ci  on 2/4/2011 1:41:16 PM)
Exact asa am facut!  Doar ca eu i-am zis LiniiNod la colectie!
Deci vorbim de 2 stari diferite! Starea elementului de actionare (inchis sau deschis) si starea nodului (cu tensiune, fara tensiune, in scurtcircuit)! Starea nodului e data de (starea nodului din amonte si starea elementului de actionare) si (starea nodurilor din aval si starea elementelor de actionare)! Pot sa am tensiune si in aval si in amonte!
 2/4/2011 1:24:38 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Eu am zis ca toate liniile din nod au aceeasi tensiune si an amonte si in aval, indiferent daca este stabilita de amonte sau de aval.
Intr-un element de comutatie poti avea tensiuni diferite pe amonte / aval, dar in nod, nu.

Daniel Buduru
 2/4/2011 3:05:53 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Intre timp am facut si starea elementelor de comutatie! Contactul l-am facut cu line ... pe care il rotesc in functie de starea elementului! Am mai adaugat la tabela circuit_e un camp cu starea elementulului! Si in aElemnte am adaugat si campul stare_elemente! Apoi am facut proprietati ptr element ... offcolor, on color, offorientare, onorientare! Si schimb starea elementului la click pe contact (linia pe care am facut-o cu polyline)  unde am this.parent.stare=abs(this.parent.stare-1)! E bine pana acum? Acum ar trebuii sa pot modifica starea si in tabela!?
 2/4/2011 4:32:18 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Ai elemente tri-state? Respectiv iesirea in aer, neconectata la masa sau la tensiune? Comutator cu 3 pozitii?
Starea in tabela nu are sens. Doar tipul de stare pe care il poate avea, On, Off sau neutru, si daca un element e normal inchis sau normal deschis.
La incarcarea circuitului setezi starea normala a fiecarui element, apoi pornesti din amonte in aval cu setarea starilor pe fiecare nivel, in functie de starea normala a elementelor de pe nivelul 1.

Despre propagarea schimbarii starilor mai avem de discutat. Daca ai facut-o cu bindevent, e ok, daca nu, trebuie reluata.
Spune-mi cum ai facut setarea starilor pornind de la un click.
Nu mi-e clara chestia cu abs(this.parent.stare-1). Ai stare negativa?


Daniel Buduru
 2/4/2011 5:01:59 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania) Modified By ji_ci  on 2/4/2011 6:12:31 PM)

Deci vorbim doar de starea elementelor de comutatie care poate fi on sau off! In tabela campul starea elementelor contine valorile 0 (ptr ON) si 1 (ptr OFF)! In selectul ptr aElemente am adaugat si campul stare! Si pentru fiecare elemente am setat proprietarea Stare cu starea elementului din tabela! Apoi .... asa cum mai invatat .... la stare_assign setez proprietatile adaugate (ONcolor, OFColor, ONorientare, OFForeintare) functie de starea elementului! Asta se intampla la incarcarea circutiului! Dupa incarcare cand dau click pe element ... atunci schimb starea elementului ... adica daca starea este 0 atunci ABS(0-1)=1, deci devine 1 ... daca starea este 1 atunci ABS(1-1)=0,  deci starea devine 0! La elementele de comtatie nu am numai 2 stari (ON, OFF) e mai simplu! Desigur starea aceasta trebuie modificata in final si in tabela ptr ca la o alta incarcare a circuitului sa am noile stari ale elementelor! O schimbare de stare a elementului de comutatie nu duce la alte schimbaari in lant ale altor elemente de comutatie! Problema asta va fi mai incolo cand trebuie facuta starea nodurilor ... acolo intradevar am trei stari si depind de starea elementelor de comutatie! 
Bineinteles astept sa-mi spui toate "bubele" care le vezi!
 2/4/2011 5:53:26 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Daca ai doua stari, On si Off, sunt stari logice True si False
stare=CAST(!cast(stare as logical) as int)
sau
stare=mod(stare+1,2)
E mai simplu de evaluat o expresie logica cu porprietati logice, decat sa faci mereu conversia la numeric. Vei vedea dece.
In tabela poti avea camp numeric, dar in obiecte fa stare de tip logic

Mi-ai spus cum faci setarea starii in stare_assign, dar cum o faci la nivel de circuit?

Mai pui doua metode in clasa element, BindElement si SetStare. si o proprietate, ExpresieStare.


In metoda BindElement faci legatura la elementele din amonte
lcExpresieStare=''
for each loObject in this.Amonte foxobject
bindevent(loObject, 'stare', this, 'SetStare',1)
lcExpresieStare=lcExpresieStare+iif(empty(expresieStare),'',' OR ')+'This.Parent.'+trim(loObject.name)+'.stare' &&Aici, daca stare e logic, e evaluat direct, fara conversie
Next
this.ExpresieStare=lcExpresieStare
Cand se schimba valoarea proprietatii stare sin elementl din amonte, se declanseaza metoda SetStare a elementului curent.

In SetStare
LPARAMETERS tuStare
this.Stare=EVAL(this.ExpresieStare)

mai departe, stare_assign isi face treaba ...

Dupa ce implementezi asta, va fi suficient click-ul ca sa faci circuitul sa functioneze.

Daniel Buduru
 2/4/2011 7:47:59 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Imi cer scuze dar eu tot nu inteleg! Cele doua metode cred ca sunt bune ptr starea nodului! Dar starea tuturor elementelor de actionare o incarc din tabela in LoadCircuit la FOR prin aelemente! Iar starea unui element o modific prin click pe element! Nu am expresie logica la elementul de actionare (doar un de blocaj .... care imi permite sa fac actionarea sau nu)! La starea nodurilor acolo intradevar as avea expresie logica si aceea trebuie activata in momentul schimbarii starii unui element de actionare! Probabil nu inteleg eu ceva!? 
 2/4/2011 8:54:39 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A) Modified By Daniel Buduru  on 2/4/2011 10:06:49 PM)
Uit mereu ca tu ai doar comutatoare in schema, nu si relee si elemente de executie.
Trebuie urmarita si tensiunea din amonte, nu numai starea elementului.
Un element poate fi inchis, dar in amonte sa nu aiba tensiune, deci tensiunea nodului din aval depinde de starea elementului din amonte si de tensiunea nodului din amontele elementului.
Adauga o proprietate uamonte la clasa elementului. Tensiunea la iesirea lui ar avea expresia uamonte AND stare.
Ai nevoie ca circuitul sa arate singur pana unde ajunge tensiunea in momentul in care se schimba starea unui element.

Daniel Buduru
 2/4/2011 9:14:31 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Stiu ... exact asta spuneam si eu ceva mai in urma! Probabil ai citit pe fuga! Starea nodului ... de fapt asta trebuie sa imi arate> tensiunea, lipsa ei sau starea de scurtcircuit! Si s-ar putea sa nu fie suficient .... doar starea elementului AND starea nodului din amonte .... ptr ca s-ar putea declansa o modificare in lant a stariilor nodurilor din schema ... aici probabil ar trebui un BindEvent!
 2/4/2011 9:24:28 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A) Modified By Daniel Buduru  on 2/4/2011 10:28:12 PM)
UAmonte AND stare.
In codul pe care l-am scris mai sus inlocuiesti stare cu tensiune, si faci bindevent pe tensiune, care e amonte.tensiune AND stare. Consideram tensiunea la iesirea din element, deci tine cont de tensiunea din amonte si de stare.
Atunci in loc de ExpresieStare avem ExpresieTensiune, si lucrurile incep sa aiba sens. Asa are sens si colorarea pe jumatate a circuitului.

Daniel Buduru
 2/5/2011 9:52:25 AM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Nu reusesc cu tensiunea! Am adaugat un camp TENSIUNE (logical) in tabela circuit_e! La fel ca si starea elementelor de comutatie incarc tensiunea in aElemente! Am si tensiune_assign ... dar nu ma ajuta la inceput ptr ca nodul nu e desenat inca! Am apelat BindTensiune in momentul schimbarii starii unui element (pin click pe el) dar nu mi se apeleaza SetTensiune! Sa fie de la expresia BindEvent()?
 2/5/2011 10:41:05 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Nu e nevoie sa incarci tensiunea in aElemente - nu e tensiunea de lucru a elementelor, ci tensiunea de alimentare a circuitului. Ea se propaga sau nu, in functie de starea elementelor.
Trebuie sa fie o caracteristica a circuitului, pe care sa o primeasca sau sa o ia de la schema.
In circuit, dupa ce incarci toate elementele, setezi tensiunea la nodurile de nivel 1. Mai departe, propagarea trebuie sa se faca automat.
Tensiunea unui element e tensiunea la iesirea elementului, stabilita de expresia tensiunea_ina_amonte AND stare_element
In element, cand se completeaza colectia amonte, chiar in metoda AddAmonte, declari si bindevent

Metoda element.AddAmonte
LPARAMETERS toObject, tuID
IF PCOUNT()=0 OR VARTYPE(toObject)<>"O"
RETURN
endif
this.Amonte.Add(toObject,toObject.name)
BINDEVENT(toObject, 'tensiune', this, 'SetTensiune',1)
IF this.IsNode
this.ExpresieTensiune=this.ExpresieTensiune + IIF(empty(this.ExpresieTensiune),'', " OR ')+'this.parent.'+trim(toObject.Name)+'.tensiune'
else
this.ExpresieTensiune=this.ExpresieTensiune+ IIF(empty(this.ExpresieTensiune),'', " OR ')+"("+cast(this.stare as logical) AND 'this.parent.'+trim(toObject.Name)+'.tensiune'+")"
endif

Metoda SetTensiune
LPARAMETERS tuTensiune
this.tensiune=eval(this.expresieTensiune)
*aici pui codul pentru schimbarea culorilor

iIn metoda stare_assign, mai pui si linia asta:
this.SetTensiune

La tensiune ti-ar trebui trei valori : 1, 0, si nedefinit, dupa cum nodul e legat la tensiunea de alimentare, la masa sau e in aer - cazul nodului dintre doua elemente in starea 0.
Numai asa poti detecta scurtcircuit - atunci cand intr-un nod o linie e legata la 1 si alta la 0.

Deocamdata implementeaza asa, o faci pe urma cu trei stari.

Daniel Buduru
 2/5/2011 2:34:16 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Am pus elemetele de pe nivel 1 pe tensiune egala cu 1 si nu merge! Cred ca nu functioneaza BindEvent(), pentru ca imi da eroare cand ajunge la elementul S01, primul din al doilea nivel ... deci nu primeste tensiunea!
 2/5/2011 7:50:12 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Cred ca a ramas pe undeva o comanda ciclica
Am atasat un proiect cu schema care are implementata si tensiunea si functioneaza la click
Va trebui sa faci un element 'racordare la linie', care sa fie intrare pentru moduriel fara nimic in amonte sau in aval. Elementul asta va fi legat fie la alimentare, fie la masa.

Daniel Buduru
schema3.zip 
 2/5/2011 8:14:29 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania) Modified By ji_ci  on 2/5/2011 9:45:49 PM)
Multumesc mult ... e super! Pana la urma functiona si la mine ... la click! Dar eu ma asteptam sa functioneze de la incarcarea circuitului ... dar n-avea cum! Aici e o mica problema ... ca eu incarc starea elementelor din tabela ... si atunci se apeleaza stare_assign, apoi settesniune si incepe bindevent() si nu am expresieTensiune!

Edit
Scuze ... vad ca ai prevazut si treaba asta! Functioneaza si la incarcarea starii elementelor din tabela!
 2/6/2011 11:15:12 PM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Am mai rezolvat cate ceva ... de ex daca elementele din aval sunt pe acelasi nivel cu cele din amonte! Acuma problema e ca pot avea ptr un circuit mai multe surse ... si ele pot fi si in aval si in amonte!
 2/7/2011 8:38:18 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Nu poti avea un elemntele din aval pe acelasi nivel cu cele din amonte. Contravine conceptului de "nivel".
Daca ai facut asa, mai devreme sau mai tarziu te vei confrunta cu diverse probleme generate de asta.
Pentru a avea mai multe surse, creeaza un tip de element "sursa" sau "racordare la linie" sau cum vrei sa-i zici. Si treci de la tensiunea cu doua stari (0 si 1) la tensiunea cu 3 stari (0,1 si "in aer" sau neconectat, care poate avea valoarea .null.). Numai asa poti determina daca ai un scurt-circuit. In acest moment, tensiunea 0 (sau .f.) poate insemna orice, fie "in aer", fie "la masa".

Daniel Buduru
 2/7/2011 8:47:45 AM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Problema cu sursele e ca pot alimenta in acelasi timp ... adica circuitul poate fi alimentat in acelasi timp si din aval si din amonte ... si nu mai merge Bindevent() actual!
 2/7/2011 9:20:52 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
Bindevent() e o functie vfi care, daca are parametrii corect dati, functioneaza :)
Cred ca vrei s aspui ca nu este suficienta propagarea amonte-aval.
Ce ai de facut este sa definesti functionarea circuitului, apoi sa-l implementezi.
Deci creeaza elementul "sursa', cu nivelul d etensiune corespunzator.
Apoi e nevoie de bindevent si pe elementele aval - se pune un cod similar in addAval.
Ce mai trebuie facut e determinarea sensului din care s-a schimbat tensiunea, astfel incat s anu ajungi sa te invarti in cerc (tensiunea din amonte schimba tensiunae din aval care schimba tensiunea din amonte)
Oricum, trebuie pus in cod sa nu se seteze tensiunea unui element daca noua valoare este identica cu cea veche.
Si va trebui sa rezolvi problema scurt-circuitului. Undeva trebuie sa pui un disjunctor sau un fuzibil, care sa rupa circuitul daca la capetele lui se gasesc tensiuni diferite. De aceea ai nevoie de elementul "sursa', a carui tensiune nu trebuie sa fie schimbata.

Daniel Buduru
 2/7/2011 9:53:33 AM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Am pus cod similar in addAval() si intradevar de invarti in cerc! Cel mai bine de verificat e pe circuitul 3 din schema(cel cu putin elemente) ... acolo se vad clar 2 surse (linia 1 si 2) ... oricum sunt ceva probleme si in creearea circuitului ... eu nu am reusit sa construiesc circuitul!
 2/7/2011 10:28:43 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A)
1. Dupa cum am spus, setezi valoarea tensiunii doar daca este diferita de cea curenta.

luTesniune=eval(evl(this.expresietensiune,'this.tensiune'))
if luTensiune<>this.tensiune
this.tensiune=luTensiune
endif

2. Ca nu ai reusit sa construiesti ciruitul, e o infeormatie corecta, dar absolut inutila ... Folosesti debugger-ul? Stii sa il folosesti?

Daniel Buduru
 2/7/2011 10:38:14 AM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
N-am folosit debugger ... decat la erori si clar nu la capacitatea lui! La circuitul 3 din schema oricum problema e ca la un moment dat am elementul din amonte pe acelasi nivel cu cel din aval ... nu cred ca pot evita treaba asta in cazul circuitului 3.
 2/7/2011 11:14:38 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Sa fac o clasa?
 (N/A) Modified By Daniel Buduru  on 2/7/2011 12:20:39 PM)
Prin "nivel" am inteles sa reprezentam ordinea elementelor in serie.
Circuitele cu care lucrezi nu sunt circuite reale - nu se fac circuite doar cu comutateare actionate manual, care sa poata pune elementele in scurt-circuit.
Circuitele reale se fac cu comutatoare cu 2 pozitii, care comuta de pe un circuit pe altul trecand prin separare completa, nu cu doua intrerupatoare, ca sa nu mai vorbim de restul.
Iar cel din figura 3 - o bobina intre doua linii de tensiune separata cu 3 intrerupatoare - nu stiu unde ar putea exista cu adevarat.
Daca vrei sa faci asa ceva, ok, dar trebui sa-ti faci regulile proprii si sa le implementezi in cod.
Ti-am dat un exemplu de implementare care functioneaza, ghideaza-te dupa el si fa-ti propria aplicatie

Pune cate un breakpoint in metodele unde nu merge - click dreapta pe linia de cod, alegi toogle brakpoint. Sau dublu click pe marginea din stanga, in dreptul liniei de cod. trebui sa apara in stanga o bulina rosie - semn ca e pus un breakpoint.
Debugger-ul se porneste automat cand setezi un breakpoint, poi poti comanda execuite pas cu pas - vezi in menu si toolbar, pozi vedea stiva de apelare - de unde anume s-a apelat metoda curenta - si poti citi proprietatile tuturor obiectelor instantiate

Circuitul din figura 3 are pe nivelul 1 s1 si s2, pe nivelul 2 I conectat in amonte la s2 si bobina conectata in amonte la s1, iar pe nivelul 3 un nod conectat la I si bobina.

Amonte - aval specifica doar ordinea de conectare a elementelor, nu sensul tensiunii. Sensul e dat doar de diferenta de potential dintre elemente.

Daniel Buduru
 2/7/2011 11:23:47 AM
User is offlineji_ci
191 posts
5th


Re: Sa fac o clasa?
 (Romania)
Ok! Am inteles! Cred ca mai mult de cat m-ai ajutat ... nici ca se putea! Nu sunt tensiuni diferite pe liniile respective ....si aplicatia exista in mod real! Sunt doua linii care se pot pune in paralel ( se pot interconecta ) si prin circuitul 3 se face asta prin 2 comutatoare si un interupator care cand sunt inchise cele doua linii se intercoencteaza! 
  Visual FoxPro  Clase - VCX si PRG  Sa fac o clasa?...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement