CADsite forum

AutoCAD => Autolisp => Topic gestart door: marcelmaas op di 15 06 2010, 11:45:48

Titel: routine aanpassen
Bericht door: marcelmaas op di 15 06 2010, 11:45:48
Hi,

Wij werken met geneste blokken waarin attributen uitgelezen zouden moeten worden.
Mijn vraag is of het mogelijk is om bijgevoegde lisp om te bouwen zodat je daarmee de attributen in de geneste blokken uit bijgevoegde tekening kunt optellen?

groeten Marcel..
Titel: Re:routine aanpassen
Bericht door: Atwist op di 15 06 2010, 16:42:12
Hallo Marcel,

Ik heb een lisp bij gevoegd misschien is deze al geschikt voor jou.

Deze is gemaakt door Lee Mac Theswamp en CadTuror.


Atwist
Titel: Re:routine aanpassen
Bericht door: marcelmaas op di 15 06 2010, 17:24:32
Atwist,

Deze lisp telt helaas de attributen uit de blokken niet op, zoals voor ons de bedoeling is.

Wij hebben een block, daarin inserten we een ander block en dat block slaan wij dan op met een andere naam.
Op het moment dat wij het block inserten in het eerste block mag het ook zo zijn dat automatisch de attributen overgenomen worden van het eerste block naar het block wat we op dat moment inserten.

Dat zal allemaal wel een beetje te ver gaan denk ik.

Misschien dat iemand anders nog een idee heeft.

In ieder geval alvast bedankt voor de moeite..

groeten Marcel..
Titel: Re:routine aanpassen
Bericht door: bart op do 17 06 2010, 07:39:03
blocken met atributten nesten is vrij zinloos in mijn ogen
volgens mij kan je dan beter gewoon tekst gebruiken.
Je kan de geneste atributten toch niet rechtstreeks aanpassen met de standaard autocad commando's

Wat is voor jouw de toegevoegde waarde van deze arributten ?
Mogelijk zie ik een interesante eigenschap over het hoofd
Titel: Re:routine aanpassen
Bericht door: marcelmaas op do 17 06 2010, 08:28:43
Hi Bart,

Ik zal proberen om het wat uit te leggen.
Wij hebben een tekening waarin simpele rechthoekige blokken zitten (door ons zelf erin geplaatst)

Dan komen wij op een punt waarop wij in die blokken een soort van klein leidingmatje gaan plaatsen als dynamischblock waaraan attributen hangen voor W (vermogen), L/H (waterhoeveelheid en KPA (drukval).

Van die combinatie van rechthoek en het leidingmatje maken wij dan weer een block (om te voorkomen dat iemand dat dynamisch block kan verdanderen) met daarin een bepaalde code die de tegel (combinatie van de rechthoek en het leidingmatje) krijgt om hem te kunnen onderscheiden van de andere tegels waarin grotere of kleinere leidingmatjes met dus andere vermogens, l/h enz zitten.

Dus kort gezegd hebben we soms veel verschillende soorten tegels die qua vermogen enzo verschillend zijn waardoor iedere tegel een eigen code krijgt die in dat leidingblok komt te staan.

Uit groepjes van verschillende tegels moeten we daarna de attributen kunnen optellen, om bijvoorbeeld het totale vermogen van een groep te kunnen aangeven.

Het attributen verhaal is hierin dus heel belangrijk, en als we niet de attributen uit een geneste blok kunnen halen dan moeten we het anders gaan aanpakken.

Ik zal een klein voorbeeld tekeningetje bijvoegen waardoor het misschien duidelijk wordt.
Wat je in deze tekening ziet is een plafond spiegel met daarop onze activering (leidingwerk wat voor koeling of verwarming van de plafond tegel zorgt)
Daarboven staan de vermogens per groep van activering.

Deze tekening is op de manier getekend zoals we dat al een paar jaar doen, maar dat gaat via een uitgebreide lisproutine en heeft inmiddels veel nadelen, daarom willen we het anders gaan doen.

Ik hoop dat je het allemaal nog kunt volgen.

groetn Marcel..

Titel: Re:routine aanpassen
Bericht door: bart op do 17 06 2010, 13:20:02
Je block beschermen door hem te nesten? waar tegen dan.
Als je dubbelklikt op het block kan je in de blockeditor je dynamische block heel simpel wijzigen.

Een bescherming tegen per ongeluk wijzigen kan ook door de laag te locken
waar je het block in insert

Gebruik je het zelfde dynamische block in de zelfde tekening voor verschillende tegels ?
Titel: Re:routine aanpassen
Bericht door: HofCAD op do 17 06 2010, 13:31:06
Beste Marcel,

Gebruik eens in bijgevoegde tekening het programma AttNesBlk in AttNesBlk.lsp
(Attributes in Nested Blocks), want waarschijnlijk lost dit een deel van je probleem op.
Het programma leest slechts nu nog slechts een attribuutwaarde per genest block uit.

Met vriendelijke groet, HofCAD CSI.
Titel: Re:routine aanpassen
Bericht door: roy_043 op do 17 06 2010, 14:24:40
Deze dan?
Als een insert "losse" attributes heeft dan worden deze gebruikt. Als "losse" attributes ontbreken wordt pas gezocht naar geneste attributes.
Let op de spelling van tags: de routine gaat hier HoofdLetterGevoelig mee om. Er is sprake van de tags GKW en GWK ...
Tenslotte een vraag:
Waarom is het merk 10-1200-k4 een dynamisch block? Lijkt mij onlogisch, het is immers een vaststaand element.
Titel: Re:routine aanpassen
Bericht door: marcelmaas op do 17 06 2010, 15:10:39
Hi Roy,

Deze werkt inderdaad zoals wij zouden willen, hij telt alleen de KPA niet op, maar misschien doen we iets fout.?

Nou komt dat eigenlijk goed uit, want de KPA's kun je ook niet zonder meer optellen, daar is een ingewikkelde formule voor nodig.
We hebben een Excel programma waarin we wat gegevens moeten invullen over de vermogens en lengte + breedte van het leiding matje, dan komt er daaruit onderin de Excel een totale weerstand over de aansluitgroep uit.
Achter de schermen in die Excel zit dus een formule die we zouden kunnen bouwen in deze lisp.

Ik weet niet of er iemand is die goed is met Excel en formules in lisp, maar dan zouden we echt Mega blij zijn, want nu moeten we steeds die Excel erbij halen om de KPA's op te tellen.

Ik heb de Excel bijgevoegd, misschien dat je er eens naar wilt kijken dan snap je wat ons probleem is.

In ieder geval al super bedankt voor de aanpassing van de lisp, enuhhh Hofcad ook nog bedankt voor de moeite :-)
Titel: Re:routine aanpassen
Bericht door: roy_043 op do 17 06 2010, 15:34:12
Citaat van: marcelmaas op do 17 06 2010, 15:10:39hij telt alleen de KPA niet op, maar misschien doen we iets fout.?
In het originele bestand staat:

...
    (if (eq (caar item) "KPA")
    (setq tmp (list (caar item)
          (vl-princ-to-string (apply 'max (mapcar 'atof (mapcar 'cdr item))))))
...

max wil zeggen: gebruik het maximum van een lijst met getallen.
In het nieuwe bestand is dit niet veranderd.
Titel: Re:routine aanpassen
Bericht door: marcelmaas op do 17 06 2010, 15:38:07
Okay dus hij pakt het hoogste KPA getal van de tegels die je selecteerd?
Titel: Re:routine aanpassen
Bericht door: roy_043 op do 17 06 2010, 15:46:41
Ja. Als je wilt dat "KPA" ook wordt opgeteld dan moet je regel 88 aanpassen:
Oud:

                  (if (= (caar item) "KPA") 'max '+)

Nieuw:

                  '+
Titel: Re:routine aanpassen
Bericht door: marcelmaas op do 17 06 2010, 16:12:56
Okay bedankt voor de info, maar zoals al eerder gezegd mag je die niet zomaar optellen.
Titel: Re:routine aanpassen
Bericht door: Joop op vr 18 06 2010, 12:16:24
Ik heb het excelbestand even bekeken en een stukje geanaliseerd. (zie hieronder)

Er zijn meerdere tabbladen beveiligd en verborgen.
Wil je de berekening van dit spreadsheet in lisp zetten heb je deze gegevens nodig.Gelukkig zijn eze gegevens zijn wel nog, via een omweggetje, op te halen.

Zonder wachtwoord is er echter geen legale manier om te controleren of deze waarden het gevolg zijn formules
Citeer
Totale drukval koeling >> =SOM(K76:K77)

K76 >> =ALS('Getal van Reynolds'!B26<2000;L50*'Getal van Reynolds'!B41;L50*'Getal van Reynolds'!B40)
K77 >> =$K$60*'Getal van Reynolds'!B62

>> =ALS('Getal van Reynolds'!B26<2000;L50*'Getal van Reynolds'!B41;L50*'Getal van Reynolds'!B40)+$K$60*'Getal van Reynolds'!B62

'Getal van Reynolds'!B26 >> 1221.42291121901
'Getal van Reynolds'!B40 >> 222.696844582837
'Getal van Reynolds'!B41 >> 285.2672831
'Getal van Reynolds'!B62 >> 25.5006588965302

Totale drukval koeling >> =ALS(1221.42291121901<2000;L50*285.2672831;L50*222.696844582837)+$K$60*25.5006588965302

L50 >> =A15*M36+A16*Q36+A17*U36+A18*M48+A19*Q48+A20*U48

A15 >> [Aantal panelen regel 1] >> [AP1]
M36 >> =M35+2*$C$10/1000
A16 >> [Aantal panelen regel 2] >> [AP2]
Q36 >> =Q35+2*$C$10/1000
A17 >> [Aantal panelen regel 3] >> [AP3]
U36 >> =U35+2*$C$10/1000
A18 >> [Aantal panelen regel 4] >> [AP4]
M48 >> =M47+2*$C$10/1000
A19 >> [Aantal panelen regel 5] >> [AP5]
Q48 >> =Q47+2*$C$10/1000
A20 >> [Aantal panelen regel 6] >> [AP6]
U48 >> =U47+2*$C$10/1000

Totale drukval koeling >> =[AP1]*(M35+2*$C$10/1000)+[AP2]*(Q35+2*$C$10/1000)+[AP3]*(U35+2*$C$10/1000)+[AP4]*(M47+2*$C$10/1000)+[AP5]*(Q47+2*$C$10/1000)+[AP6]*(U47+2*$C$10/1000)

$C$10 >> [Gemiddelde lengte aansluitslang]
M35 >> [tabel waarde]
etc..
etc.........
Titel: Re:routine aanpassen
Bericht door: marcelmaas op vr 18 06 2010, 13:41:21
Hi Joop,

De collega die deze excel sheet gemaakt heeft is op vakantie, en pas weer over een week weer terug.
Ik heb het wachtwoord toch weten te achterhalen, maar weet niet of het voldoende is.
Zie bijgevoegde bestand.
Titel: Re:routine aanpassen
Bericht door: roy_043 op vr 18 06 2010, 14:29:46
Met OOo was het originele bestand al volledig te bekijken. De zeven verborgen bladen bevatten complexe berekeningen. Als je niet de auteur bent kost het veel speurwerk om alles te analyseren. Mijn conclusie: De berekening is (zeer waarschijnlijk) in lisp te zetten maar dat zal veel tijd kosten. En die zin valt dit, wat mij betreft, buiten het kader van dit forum.
Titel: Re:routine aanpassen
Bericht door: marcelmaas op vr 18 06 2010, 15:55:27
Nou we zijn er zelf ook achter dat we dat gewoon met die excel sheet moeten blijven doen, daar het inderdaad veel te veel werk zou gaan worden om dat in een lisp te gieten.

Wel zouden we eigenlijk aan de  sumtable.lsp nog wat willen toevoegen.
Nu worden daarmee namelijk de KPA en de FLOW van de GKW (gekoeld water) opgeteld.
En eigenlijk hebben we zoals nu in de aanpaste bijgevoegde tekening te zien is ook voor CV (warmte), KPA en FLOW die opgeteld moeten worden.

Misschien dat dat nog toe te voegen is aan de bijgevoegde sumtable_v2c.lsp dat zou ons al heel blij maken.

groeten Marcel..
Titel: Re:routine aanpassen
Bericht door: roy_043 op vr 18 06 2010, 16:14:34
Welke attributen opgeteld worden kun je zelf aanpassen door regel 46 te wijzigen:
Oud:

      (setq match_list (list "GKW" "FLOW" "KPA"))

Nieuw:

      (setq match_list (list "GKW" "FLOW" "KPA" "CV"))


Het tabel-block moet dan wel overeenkomstige attribuut-definities bevatten.
Titel: Re:routine aanpassen
Bericht door: marcelmaas op ma 21 06 2010, 08:32:05
Hi Roy,

Iets toevoegen aan een lisp zou ik nog wel kunnen, maar het is net wat ingewikkelder dan dat.

Het is namelijk nu zo dat de attributen uit het block in het block GKW_Totaal gestopt worden die je vervolgens kunt invoegen.

Nu zitten er in het block ook attributen die beginnen met CV_  , die zouden gestopt moeten worden in het block CV_Totaal die je dan vervolgens ook moet kunnen invoegen meteen nadat je GKW_Totaal hebt ingevoegd.

Dat werkte namelijk met sumtable.lsp ook zo.

Is er iemand die dat nog aan deze sumtable_v2c.lsp zou toe kunnen voegen?

Titel: Re:routine aanpassen
Bericht door: roy_043 op ma 21 06 2010, 09:08:55
Citaat van: marcelmaas op ma 21 06 2010, 08:32:05Dat werkte namelijk met sumtable.lsp ook zo.
Het moet dan gaan over een ander lisp-bestand dan jij hebt gepost bij jouw eerste bericht. In sumtable_v2.LSP is uitsluitend sprake van het block "GKW_Totaal". Er zit in dat programma ook geen "lus" die suggereert dat het inserten van meerdere blocks na elkaar mogelijk is (geweest). Maar waarom meerdere blocks, je kunt toch ook alle gegevens in één block weergeven?
Titel: Re:routine aanpassen
Bericht door: marcelmaas op ma 21 06 2010, 09:34:29
We hebben wel altijd gegevens voor GKW, maar niet altijd voor CV.
Dus dan zouden we een groter block moeten invoegen waarin voor CV niks staat ingevuld, dat is dan niet nodig toch?

Nu doen we het met bijgevoegde lisp waarmee wel een CV block wordt ingevoegd.

Misschien kunnen we deze 2 combineren?

Titel: Re:routine aanpassen
Bericht door: roy_043 op ma 21 06 2010, 21:50:52
Bijgevoegd: SumTable_v2f.LSP

Wijzigingen:
Titel: Re:routine aanpassen
Bericht door: marcelmaas op ma 21 06 2010, 23:15:31
Hi Roy,

Zo werkt het opzich goed, alleen moet er een GKW_Totaal block en een CV_Totaal block in de tekening staan die je aanwijst om daarin de waardes weg te schrijven.

Zou het mogelijk zijn om de waardes in de bijgevoegde blocken te zetten en dat je die dan ergens in de tekening kunt inserten op een plaats waar je zelf kunt aangeven?
Zo werkt het op onze huidige manier namelijk ook, en dat is voor ons een stuk makkelijker.

De aanpassingen tot zover zijn al wel heel goed.  :vreegoe:

Titel: Re:routine aanpassen
Bericht door: roy_043 op di 22 06 2010, 15:53:49
Bijgevoegd: SumTable_v2g.LSP
Titel: Re:routine aanpassen
Bericht door: marcelmaas op di 22 06 2010, 16:59:27
Ja dit is gaaaaaaf....

Zo werkt het super, de gkw en cv_totaal blocken moeten alleen wel in de tekening aanwezig zijn.
zouden we dit niet kunnen ondervangen door de lisp te laten zoeken in een bepaalde map naar die blocken?
Zo werkt het nu bij ons namelijk ook.

Ik ben misschien een beetje vervelend, maar dan zou het helemaal super zijn.

groeten Marcel..
Titel: Re:routine aanpassen
Bericht door: roy_043 op di 22 06 2010, 17:02:15
Citaat van: marcelmaas op di 22 06 2010, 16:59:27zoeken in een bepaalde map naar die blocken?
Het gemakkelijkste is om de betreffende map op te nemen in het zoekpad.
Titel: Re:routine aanpassen
Bericht door: marcelmaas op di 22 06 2010, 19:02:34
Hi Roy,

Ik krijg deze foutmelding als ik de blocken wil plaatsen.

Specify insertion point for table insert "GKW_totaal" or [Enter] to select
existing: ; error: AutoCAD.Application: Filer error

Ik heb de blocken in de map M:\ gezet en dat pad ook toegevoegd, maar krijg die foutmelding.
Als ik de blocken GKW_totaal en CV_totaal even in de tekening insert en daarna sumtable gebruik, werkt het wel.
Dus het zit ergens niet helemaal goed.

Doe ik iets fout..?

Titel: Re:routine aanpassen
Bericht door: roy_043 op di 22 06 2010, 21:40:32
Met SumTable_v2h.LSP moet het goed gaan.
Titel: Re:routine aanpassen
Bericht door: marcelmaas op di 22 06 2010, 22:31:46
Hi Roy,

Nu werkt het inderdaad wel met het invoegen van de blocken, superrrr.

In een eerdere post zei jij.

Citeermax wil zeggen: gebruik het maximum van een lijst met getallen.

De kpa's worden nu weer opgeteld, waarom heb je dat gewijzigd, in een eerdere versie van Sumtable pakte hij toch de hoogste kpa en telde ze dus niet op.

Is dat hier nog terug in te bouwen?

Titel: Re:routine aanpassen
Bericht door: roy_043 op wo 23 06 2010, 09:56:04
Citaat van: marcelmaas op di 22 06 2010, 22:31:46Is dat hier nog terug in te bouwen?
Niet zonder meer. Uitleg: versie 2h is gebaseerd op een versie 2e die ik puur voor mijzelf heb gemaakt. Ik wilde een versie waarin blocknamen en tags NIET waren vastgelegd. Om de optie MAX terug in te voeren moeten de tags WEL worden vastgelegd.
En zoals je zelf zei: voor KPA is een complexe berekening nodig. Zowel de som van alle waardes als de maximale waarde zijn fout.
Titel: Re:routine aanpassen
Bericht door: marcelmaas op wo 23 06 2010, 10:06:46
Okay ik snap het.

Als het makkelijk te doen is om de tags toch vast te leggen is dat voor ons een oplossing.
De tags liggen wat ons betreft vast, dus daarin ligt het niet.

Ik laat het aan jou over, wij zijn zo natuurlijk al heel blij.   :D

groeten Marcel..
Titel: Re:routine aanpassen
Bericht door: Joop op wo 23 06 2010, 10:55:10
Waarom niet de gevonden waarden in Acad via VisualLisp naar Excel schrijven en dan de berekende waarden uitlezen en schrijven in Acad?
Titel: Re:routine aanpassen
Bericht door: roy_043 op wo 23 06 2010, 11:41:48
Citaat van: Joop op wo 23 06 2010, 10:55:10Waarom niet de gevonden waarden in Acad via VisualLisp naar Excel schrijven en dan de berekende waarden uitlezen en schrijven in Acad?
Voor de max. van KPA heb ik Excel niet nodig, dat kan met lisp. Maar zowel de som als de max. van KPA zijn fout. Dus deze berekening is zinloos.

Maar dat het volledig automatisch uitvullen van het rekenblad dat Marcel heeft gepost een interessante mogelijkheid is, dat is mij duidelijk. Dus, inderdaad, waarom niet? :mrgreen:
Titel: Re:routine aanpassen
Bericht door: marcelmaas op wo 23 06 2010, 11:42:12
Hi Joop,

Ik weet dat het zou kunnen, al weet ik niet hoe.
Maar gaat dat niet heel traag?

groetn Marcel..
Titel: Re:routine aanpassen
Bericht door: Joop op do 24 06 2010, 10:24:48
Nee hoor, helemaal niet.
Men moet echter wel exact weten wat en hoe Excel wordt ingevuld en de locatie van de uitleescellen.
Titel: Re:routine aanpassen
Bericht door: marcelmaas op do 24 06 2010, 10:41:32
Hi Joop,

Laten we hopen dat het snel vakantie is zodat ik daar eens wat tijd in kan gaan steken.
Ben er nog nooit mee bezig geweest, maar ga zeker kijken wat voor ons daar uit te halen valt.

Bedankt voor de tip.

groeten Marcel..