Zobrazit plnou verzi příspěvku: natočení atributu

Kackac
23.08.2007, 16:58
Dobrý den,mám velmi jednoduchoučký lisp na vložení bloku a jeho natočení podle ukázání. Problém je ale v tom, že ten blok obsahuje atribut a když je blok natočen vzhůru nohama, je vzhůru nohama i text. Jaký příkaz to ovládá, abych nemusela ručně u každého již vloženého bloku poklepat a volit natočení textu? Je nějaká obdoba EATREDIT pro příkazový řádek nebo to řešit úplně jinak?

PepaR
23.08.2007, 17:08
Já s tím problémy nemám, viz funkce VlozBlok a příkazy:
 
POPISD          Vloží popis dveříPOPISDPO     Vloží popis požárních dveří
 
uploads/20070823_170839_VlozBlok.zip

Kackac
23.08.2007, 17:26
Jestli tomu dobře rozumím, tak vy máte zvlášť dveře a zvlášť popis. Já bych ale chtěla zachovat to, že je to jeden blok, který obsahuje jak kresbu toho prvku tak i jeho popis.

PepaR
23.08.2007, 17:34
Aha, Vám jde asi o dynamický blok, že ano? Tak tam bývá problém, zkoušel jsem to ve 2006, ale někdy se text otočil správně někdy ne, měl jsem taky zadány u dvěří rozměry jako atribut.
 
Je na zváženou zda nevyužít proměnné MIRRTEXT při používání bloku dvěří a dza yb to vůbec pomohlo.
 
Co se týče natočení atributů, tak na Autodesku v diskusním fóru o dynamických blocích bylo vlákno týkající se podobného problému.

Kackac
23.08.2007, 17:42
Právě že to není dynamický blok, v práci je maximálně cad2005. Je to úplně obyčejný blok s jedním atributem. A pokud já natvrdo nepřepíšu u vloženého bloku otočení textu, tak se ten text/atribut otáčí s blokem. A to je hrozná otrava vždycky po vložení to natočení přepsat, zvlášť, když ještě musím nejdřív překliknout na druhou záložku

PepaR
23.08.2007, 17:54
Poslete mi emailem blok, podívám se jak to máte děláno.

zisoun
23.08.2007, 22:19
Asi to nebude to ideální pro vás, ale já mám pro otáčení atributů
vytvořené jednoduché makro, které urychlí použití příkazu ATREDIT.
Stačí kliknout na atribut a zadat úhel natočení.
^C^C-ATREDIT;;;;;\;_ang;\;

PepaR
23.08.2007, 23:06
Nejsem programátor, ale řešil bych to následovně:
1) Zapracoval bych proměnnou, která si bude pamatovat úhel natočení

2) Zapracoval bych proměnnou, která bude obsahovat výběr naposled vloženého bloku
3) A aplikoval bych na tento výběr zisounovo makro.
 
Ovšem, jak jsme již psal, nejsem programátor, takže pánové zkušenější Vám jistě poradí, zda by to šlo.
 
 
Pokud by vám šlo jen o ozrcadlení bloku, a zachování směru textu, tak zkuste nastavit MIRRTEXT na 0.PepaR2007-08-24 11:31:20

chlebovsky
24.08.2007, 08:40
Jo přesně jak píše PepaR, pokud máte vytvořený lisp který Vám ten blok vkládá, tak není nic jednoduššího než za příkaz vložení, dát výběr poslední entity, v ní dohledat atribut, a nastavit vše dle daných hodnot, ty hodnoty však předem definovat do nějaké proměnné globální v rámci výkresu. A pak mít ještě funkci na znovuzadání těchto hodnot.
Když ten blok a lisp pošlete tak na to mrknu. A něco Vám vytvořím.

chlebovsky
24.08.2007, 10:00
výběr posledního bloku :
(setq blk (entlast))
 
získání atributu
(setq atr (entnext blk))
 
kdyz je víc atributu tak

(setq atr1 (entnext blk))

(setq atr2 (entnext atr1))

(setq atr3 (entnext atr2))
dobré to dát do ciklu dokud nenalezena entita SEQEND
 
a pak už jen měnit vlastnosti pomoci
entget  ->  subst  -> entmod

Kackac
25.08.2007, 11:41
Vřelý dík, zejména p. Chlebovskému, jeho příkazy to vyřešily. Byla to sice fuška, programovat neumím, zatím mám jen pár primitivních lispů, ale s helpem a půjčenou knížečkou se to povedlo. Jen do toho neumím zapracovat ten cyklus, prosím poraďte ještě s tímto.uploads/20070825_113914_EL_ROZV.zipZdrojový kód(defun c:ER()  (setq oldla (getvar "CLAYER"))  (setq osold (getvar "OSMODE"))  (command "_layer" "_t" "TZB_ZARPREDMETY" "_M" "TZB_ZARPREDMETY" "_l" "continuous" "" "")  (command "_-osnap" "_end,_int,_mid")  (command "_ucs" "");(while  (setq rf (getpoint "\nzadej stred na stene: "))  (command "_-osnap" "")  (setq ang (* (/ (getangle "\nzadej směr: " rf) pi)180 ))  (command "_-insert" "EL_ROZV" rf 1 1 ang "")  (setq blk (entlast))            ;posledni prvek  (setq atr (entnext blk))        ;atribut  (setq edata (entget atr))        ;data atributu  (setq oldrot (assoc 50 edata))    ;podseznam obsahujici klic 50 (natoceni)  (setq newrot (cons 50 0.0))        ;zkonstruovani noveho podseznamu klice 50  (setq edata (subst newrot oldrot edata))    ;nahrazeni stareho podseznamu novym (natoceni 0)  (entmod edata)            ;modifikace seznamu  (entupd blk)                ;regenerace slozene entity (bloku, krivky...)  (command "_-osnap" "_end,_int,_mid");) ;konec while  (setvar "OSMODE" osold)  (command "_LAYER" "_M" OLDLA ""))

chlebovsky
26.08.2007, 21:19
No podle mně ten cyklus máte naprosto v pořádku.... stačí jen vyhodit ty středníky...
Teda pokud máte na mysli to že cyklus má probíhat tak dlouho dokud zadáváte bod RF jako střed na stěně
vlastně ty první závorky tvoří u cyklu podmínku, a ta zní... probíhej tak dlouho dokud platí podmínka, takže když zadáte bod tak proběhne cyklus, a když bod odkliknete pravým takže nezadáte, tak cyklus okamžitě končí.

Kackac
27.08.2007, 02:21

[QUOTE=chlebovsky]kdyz je víc atributu tak

(setq atr1 (entnext blk))

(setq atr2 (entnext atr1))

(setq atr3 (entnext atr2))
dobré to dát do ciklu dokud nenalezena entita SEQEND[/QUOTE]ne ne, já jsem myslela tenhle cyklus, o kterém jste psal minule, je-li v bloku víc atributů.

chlebovsky
28.08.2007, 07:59
podle mne je ten cyklus v tomto případě naprosto zbytečný, při vkládání bloku víte naprosto přesně kolik má atributů a všechny je musíte uvést v příkazu insert "" uvozovkama...
proto přesně víte kolikrát ten (entnext   má být.
 
ale jinak by se zkoumalo
(while (/= typ_ent "SEQEND")
 
)
kde typ_ent je (cdr (assoc 0 (entget ...)
 
ale tady bych to nepoužil....
víte že blok má 1 atribut proto jednou entnext
 

Kackac
29.08.2007, 23:42
Je pravda, že tady to asi nepoužiju. Ale když je čas, snažím se trochu zpříjemnit středověký způsob kreslení v práci a píšu si takovéhle drobnosti, takže se domnívám, že časem se dostanu k něčemu podobnému s jiným typem bloku, kde by se to mohlo hodit. Navíc to, že hodnota atributu není přednastavená a tudíž se ptá na potvrzení, je trochu pozůstatek z dob dřívějších a nejspíš to časem změním, takže bude po uvozovkách u příkazu insert a cyklus už by bylo možné použít pro zobecnění prográmku.Zatím jsem se k tomu nedostala, takže ještě nevím, jestli to rozchodím, ale děkuji za pomoc Vám i ostatním.

chlebovsky
30.08.2007, 08:21
Já bych si vytvořil na to funkci :
(defun vrat_atributy (blok / blk att at vraci);;; kontrola že je to blok (if (and blok (= "INSERT" (cdr (assoc 0 (setq blok (entget blok))))))  (progn    ;;; ano je to blok    (setq blk (cdr (assoc -1 blok))) ;;; získám jméno entity bloku    (setq att nil)                      (setq at blk)    (setq vraci nil)    (while (= "ATTRIB" (cdr (assoc 0 (setq at (entget (entnext at))))))  ;;; cyklus který vyhledá atributy lze použít i podmínka (/= "SEQEND"...)      (setq att (append att (list (cdr (assoc -1 at))))) ;;; připojí atribut jmeno entity do seznamu      (setq at (cdr (assoc -1 at)))    )    (setq vraci att)  )  (alert "Byl proveden neplatný výběr") ) vraci)
 
A celé bych to ovládal takto :

;;; vyberu blok(setq blok (car (entsel "Vyber blok :")));;; seznam atributu je uložen v seznamu atributy(setq atributy (vrat_atributy blok))

Kackac
29.09.2007, 02:54

Tak jsem si na to po dlouhé době zase sedla a nějak se mi to nedaří doladit.Udělala jsem si 4 funkce:F1. podle vašeho posledního příspěvku, tudíž chodí jak má:)F4. malá modifikace té původní funkce, která vkládala blok s 1 atributem a otočila ho - teď otáčí všechny atributy bloku, ať jich má kolik chce, to kupodivu taky chodí:)F2. pomocná funkce, která má jen přidělit všem atributům natočení 0. Tu jsem vytvářela proto, abych ji mohla použít ve funkci 3 a 4 a nemusela ji v obou funkcích psát. Jenže ji neumím zavolat aby to chodilo, to je tedy dotaz 1 - jak ji zavolat z F3 a F4?F3. funkce, jež má všechny atributy vybraného bloku (již dříve vloženého se špatně natočenými atributy) natočit na 0°. A tady je kámen úrazu (a dotaz 2) - nemůžu přijít na chybu. Otáčí to totiž sice všechny atributy vybraného bloku, ale zároveň i všechny bloky! vložené později než vybraný blok, a to úplně všechny, nejen rozvaděče s atributy:( Určitě tam mám někde do proměnné uloženo něco co tam nemá být, ale já na to nemůžu přijít. - vyřešeno - viz můj příspěvek z 04:12Je pravda, že už jsem se do těch všech proměnných zamotala, že nedokážu sjednotit (nebo naopak zcela oddělit?) proměnné všech 4 funkcí, což je ostuda, protože kdo jiný by se v tom měl vyznat než já, ale mám pocit, že čim dýl se v tom hrabu, tím je to horší.dotaz 3 se týka toho osamoceného "vraci" před poslední závorkou vaší fukce vrat_atributy (tedy u mě F1)
[QUOTE=chlebovsky]...........  ) vraci)[/QUOTE] jak to, že takhle může něco stát samo o sobě, bez závorek? Co to vykonává?Omlouvám se, že pořád otravuju s tím samým, ale nedaří se mi tím prokousat samotné, potřebuju zase nakopnout:)
Kackac2007-09-29 04:20:14

Kackac
29.09.2007, 03:00
A samozřejmě jsem zapomněla přiložit ty soubory:)V zipu je lisp a blok se 4mi atributy, který F4 vkládáuploads/20070929_025820_EL_ROZV_pokus.zip
Kackac2007-09-29 03:02:41

Kackac
29.09.2007, 04:12
Dyť já sem přece tele! Zapomněla jsem tam dát cyklus a proto jel (entsel) donekonečna, otázku 2 mám tedy z krku a F3 vypadá teď takhle...jen by mě zajímalo,  jestli (/= blka "SEQEND"...) je to samé jako (= "ATTRIB"...) a jestli ano, platí to pouze pro tento případ nebo je SEQEND univerzální a platí i pro jiné entity než atributy?;____FUNKCE-3____natoci vsechny atributy vybraneho bloku (jiz drive vlozeneho s blbe natocenymi atributy nebo po battman) na 0°(defun c:el_rozv_natoc ()  (setq blok (car (entsel "Vyber blok: "))) ;vyber bloku a ulozeni jeho jm.entity do prom. "blok"  (setq att (vrat_atributy blok)) ;vytvori seznam atributu vybraneho bloku podle predchozi fce "vrat_atributy" a ulozi ho do seznamu "att"  (setq blk blok) ;ulozeni jmena vybraneho bloku do prom blk  (while (/= blka "SEQEND" (cdr (assoc 0 (setq blka (entget (entnext blk))))))    ;cyklus while probiha dokud mu nedojdou atributy vybraneho bloku     (setq atr (entnext blk)) ;postupne atributy vybraneho bloku    (setq edata (entget atr)) ;data atributu    (setq oldrot (assoc 50 edata)) ;podseznam obsahujici klic 50 (natoceni)    (setq newrot (cons 50 0.0)) ;zkonstruovani noveho podseznamu klice 50    (setq edata (subst newrot oldrot edata)) ;nahrazeni stareho podseznamu novym (natoceni 0)    (entmod edata) ;modifikace seznamu    (entupd blk) ;regenerace slozene entity (bloku, krivky...)    (setq blk atr)  ))

chlebovsky
29.09.2007, 10:24
Co se týče toho samotného vrací na konci funkce : tak to se používá právě když potřebujeme zavolat nějakou funkci, a potřebujeme aby ta funkce něco vrátila. Uvedu na příkladu.
Řekněme že si chceme vytvořit funkci na součet dvou čísel. Tudíž vstupní parametry budou CIS1 a CIS2, funkce se bude jmenovat SOUCET a funkce nám vrátí VYSLEDEK
 
funkce by pak vypadala takto :
 
(defun SOUCET (CIS1 CIS2 / VYSLEDEK) ;;; vstup je CIS1 a CIS2
  (setq VYSLEDK (+ CIS1 CIS2))
  VYSLEDEK
)
 
pak můžeme tuto funkci volat takto
 
(setq X (SOUCET 10.0 20.0))
právě ta poslední proměnná zaručí aby funkce vrátila nějakou hodnotu a proto ji můžeme hned něčemu přiřadit. Takže přiřadíme X.
 
Pakmáte v dalším dotazu (while.....  červený, to asi myslíte tím že tam je něco nezdravého že ?
Pokud to dobře chápu ja bych to upravil na :
 
(while (/= "SEQEND" (cdr (assoc 0 (setq blka (entget (entnext blk))))))
 
proste to první blka vymazal
 
dále se ptáte co to je SEQEND....
Pro pochopení doporučuju vzít prázdný výkres nakreslit třeba jednoduchou úsečku a uložit ho jako DXF... ten soubor pak přejmenujte třeba na ***.TXT a otevřte v poznámkovém bloku.... tím se vám zobrazí strašně obsáhlý ale čitelný zápis jak je vlastně tvořen jakoby vnitřní zápis všech prvků v Cadu. Dle toho můžete poznat která entita má jaké vlatnosti......
Dále celé DXF je děleno na hlavičku kde jsou systémovky, dále různé tabulky, hladit, stylů, typů čar...... atd... a v poslední části jsou entity.
 
Každá část začíná nějakým kodem a končí nějakým kodem
 
Třeba blok....
Blok začíná INSERT..... pak následují ATTRIBUT ATTRIBUT.... a vše je ukončeno SEQEND (jako zkratka SEKVENCE KONEC)
Něco podobného je i u křívky.... napřed je křivka s parametrama, a pak jednotlivé body s tloustkama a nakonec SEQEND..... je to jako by ukončení nějakého oddílu.... vše je velice dobře popsáno v helpu.... DXF reference....
 
Zapoměl jsem na něco ?

Kackac
30.09.2007, 00:00
Nezapomněl jste na nic, naprosto vyčerpávající odpověď, moc děkuju.Pochopila jsem i význam té samostatně stojící proměnné, ale nepochopila jsem, proč to tedy funguje i bez ní... funce mi vrací stejný výsledek se zakomentovanou i nezakomentovanou proměnnou vysledek a ctx, asi mi přecejen něco uniklo:)(defun soucett (cis1 cis2 / vysledek)  (setq vysledek (+ cis1 cis2))  ;vysledek)(defun prnatx (csl / ctx)  (setq ctx (rtos csl 2 2))  ;ctx)(defun c:souct ()  (setq c1 (getreal "zadej prvni cislo: ")          c2 (getreal "zadej druhe cislo: ")  )  (setq souc (soucett c1 c2))  (prompt (strcat "vysledek " (prnatx c1) " + " (prnatx c2) " = " (prnatx souc)" ")))

chlebovsky
01.10.2007, 11:22
Každá funkce vrací svůj provedený poslední úkon, to znamená ze v pripade soucett je sice poslední řádek ;vysledek ten ale není příkaz, proto funkce vrátí celý řádek (setq vysledek (+.....)) což vlastně je hodnota kterou potřebujete vrátit.
 
v případě třetím vrátí (prompt (strcat "vysledek " (prnatx c1) " + " (prnatx c2) " = " (prnatx souc)" "))
někdy se ale může stát že poslední výraz není zrovna to co by měla funkce vrátit.
 
proto spočítám poslední příkaz a pod tím bude to mé vraci....
teď mě sice nenapadá příklad, ale někdy na to určitě natrefíte.

Kackac
01.10.2007, 16:03
Dobrá, budu vám tedy věřit i bez příkladu :)Děkuju moc za ochotu a trpělivostKatka

Ferdinand
09.10.2007, 14:17
Na mne je to příliš složitý... Osobně bych to řešil asi ve 2 krocích: prvně bych vložil blok, pak bych pootočil jeho atributy zpátky do nuly. Na p.ř. by to probíhalo takhle:
ř1. Command: _-atteditř2. Edit attributes one at a time? [Yes/No] <Y>: _Yř3. Enter block name specification <*>:
ř4. Enter attribute tag specification <*>:
ř5. Enter attribute value specification <*>:Select Attributes: zde vyberu atributy
...
nnn attributes selected.Enter an option [Value/Position/Height/Angle/Style/Layer/Color/Next] <N>: A
Specify new rotation angle <35.54>: 0
...
Enter an option [Value/Position/Height/Angle/Style/Layer/Color/Next] <N>: enter
Command:
 
ř1. až ř4. mám jako makro na tlačítku
^C^C_-attedit _Y ;;;
a to co je červeně, by bylo třeba nějak (?) tam přifařit.

Ferdinand
15.11.2007, 11:34
Chtěl bych navázat na mou předchozí odpověď. Jak provést, aby se automaticky vybraly všechny atributy různých vložených bloků ve výkresu (tj. aby při výzvě "Select Attributes:" mi to provedlo hromadný výběr - přičemž některé atributy mají třeba i vlastnost Unvisible, Constant,...) ? Potřeboval bych všem atributům jedním příkazem přiřadit stejnou barvu resp. hladinu. V případě příkazu attedit ovšem by to chtělo pro každý zvlášť po mne potvrzení/volby... Pak by to chtělo nějak (?) zakomponovat do cyklu. Anebo na to jít podobně, jako je popsáno výše?

Ferdinand
15.11.2007, 13:19
To Kackac:
volání nadefinované funkce FUNKCE-X (který je v samostatném lispu FUNKCE-X.lsp) z jiného (běžícího) lispu
;;není-li přístupná aplikace FUNKCE-X...(if(not c:FUNKCE-X)
;;...tak ho najde a načte  (load (findfile "FUNKCE-X.lsp")))
Pokud je třeba také aby to hned vykonal, tak ještě přidat
(C:FUNKCE-X)
Jasně že cesta k FUNKCE-X.lsp musí být zpřístupněná v Možnostech.

Kackac
25.11.2007, 02:20

To Ferdinand:z 9. října: zkoušela jsem v rychlosti mrknout na to vámi nabízené řešení "ve dvou krocích", přepsala jsem to do lispu, protože tlačítka nepoužívám, ale nedařilo se mi do toho zakomponovat právě to co je červeně. Teda vlastně mi tam nechodilo ještě něco, ale to si teď nevzpomenu co.15.listopadu 1.: co se týče těch atributů invisible, jejich výběr mi cad2007 nabídl (myslím, že při globální editaci), 2004 nemám u ruky, takže nevím, jak to je tam. Ale určitě by to šlo řešit lispem, něco na způsob jako jsem vypotila na to otáčení, tam by byl bez problémů i ten cyklus.15.listopadu 2.: děkuji, zatím jsem to sice nezkoušela, ale až se k lispu zase dostanu, zkusím si s tím pohrát.Problém je v tom, že při hrabání se v lispu mám neúměrnou spotřebu času, a toho teď jaxi nemám nazbyt, takže se omlouvám, že jsem nereagovala na vaše příspěvky, důvodem bylo to, že jsem se nedostala k tomu, abych to vyzkoušela. Snad na jaře 
Kackac2007-11-25 02:21:04

Ferdinand
28.11.2007, 11:37
OT: [QUOTE=Kackac] ...teď jaxi nemám nazbyt, ... [/QUOTE]

pozor na pravopis: podle mne správně se píše "yaxy"

Kackac
28.11.2007, 17:28


Ferdinand
03.01.2008, 14:25
[QUOTE=chlebovsky]
(defun vrat_atributy (blok / blk att at vraci)...    (while (= "ATTRIB" (cdr (assoc 0 (setq at (entget (entnext at))))))  ;;; cyklus který vyhledá atributy lze použít i podmínka (/= "SEQEND"...)[/QUOTE]
podle mne tam namísto "ATTRIB" má být "ATTDEF"Ferdinand2008-01-03 14:25:30

Ferdinand
12.05.2008, 11:29
Opět navazuji na staré téma... Chtěl jsem použít ten lispík Kackac na natočení atributů bloku s volbou úhlu natočení (tedy nikoli do nula st.), protože by se mi teď hodil na hromadný "vlevo vbok". Ale - lisp provede natočení všech atributů veškerých (?) bloků + všech samostatních textů (?) na jiný úhel, než zadám. Např. zadám-li požadovaný úhel 90, natočí se mi na 116.62 st.
Dotaz1: Chci natočit atributy pouze u vybraného bloku (i když už je vícekrát vložen do výkresu - to by se měly natočit u všech) a to o zadaný úhel - lze to?
Dotaz2: Proč mi to otáčí i obyč. texty? Kde je chyba?

Rostislav Říha
12.05.2008, 17:51
a nestacilo by ty texty vypnout/skryt/zmrazit?

Ferdinand
14.05.2008, 12:54
Poněvadž texty se nachází ve stejné hladině do které jsou vloženy bloky s atributy, tato možnost v tomto případě není vhodná. Však právě proto cílím k tomu, aby ve výběru byly akceptovány jen a pouze atributy bloku(ů).

Kackac
12.07.2008, 20:47
Po dlouhé době jsem se se zase dostala na cadfórum a s jistou radostí až pýchou jsem zjistila, že toto moje téma má bezkonkurenční návštěvnost No nic, zpátky k tématu, byť je to už celkem dlouhá doba a možná to již není aktuální - k příspěvku Ferdinanda[QUOTE=Ferdinand]Chtěl jsem použít ten
lispík Kackac na natočení atributů bloku s volbou úhlu natočení (tedy
nikoli do nula st.), protože by se mi teď hodil na hromadný "vlevo
vbok". Ale - lisp provede natočení všech atributů veškerých (?) bloků +
všech samostatních textů (?) na jiný úhel, než zadám. Např. zadám-li
požadovaný úhel 90, natočí se mi na 116.62 st.
Dotaz1: Chci natočit atributy pouze u vybraného bloku (i když už
je vícekrát vložen do výkresu - to by se měly natočit u všech) a to o
zadaný úhel - lze to?
Dotaz2: Proč mi to otáčí i obyč. texty? Kde je chyba?[/QUOTE]Problém s jiným natočením než zadáte, pokud to ještě není vyřešeno, napadlo mě, zda to není špatně napsaným převodem mezi stupni a radiány.ad dotaz 1 - určitě to jde, zapsal by se filtr pro výběr bloku daného jména a cyklus, který by aplikoval akci otočení atributů na všechny tyto bloky ve výkresead dotaz 2 - nejspíš tam není filtr, který by do výběru zahrnul pouze entity typu atribut. Nevím, do jaké míry jste ten můj lisp upravoval dle vlastních potřeb, já, když jsem se k němu nedávno po dlouhé době dostala, zjistila jsem, že nefunguje (a to jsem měla za to, že fungoval, když jsem ho naposled opouštěla), a když jsem ho rozchodila, tak jsem odhalila spoustu nedostatků a problémů s jeho použitím, takže je možné, že pokud jste ho převzal, tak jste narazil na další problémy, které nebyly odladěné, protože původně to byl lisp víceméně pro mě na velmi omezenou oblast použití, tedy bez ošetření chyb, nenapadlo mě, že by se někomu hodil, to bych ho samozřejmě napsala líp:)