Zobrazit plnou verzi příspěvku: chyba v příkazu "PLOCHA"
Používám utilitu ADDLEN pro měření sumy délek. V CIVILU 2010 jsem si všiml nesrovnalosti v naměřené hodnotě a začal jsem pátrat proč a došel jsem k této chybě. Civil mám spuštěný v režimu čistého AutoCadu, tak to možná není jen otázka Civilu, ale i dalších verzí 2010, což ale nemůžu vyzkoušet. V Civilu 2010 mám nainstalovaný SP1 i SP2.Pokud použiji příkaz [CMD]PLOCHA[/CMD] (_AREA) a kliknu na objekt (křivku) tak mi za určitých okolností plochu křivky vypíše a za určitých ne, respektive u určité křivky ano a u určité ne.Přikládám výkres, kde jsou nakresleny dvě křivky.U první ve tvaru neuzavřeného obdélníku příkaz (command "_area" "_e")normálně změří plochu a obvod - vše je v pořádkuU křivky ve tvaru "Z" vypíše hlášku"Selhal výpočet plochy"Přičemž postačí přetáhnout koncový uzel první křivky tak aby z ní byla "klikatice" a příkaz přestane měřit také.V AutoCadu 2006 toto fungovalo bezchybně. Mohl by někdo zkusit zda se jedná skutečně o chybu?Nahraný soubor:uploads/20091009_074530_chyba_ve_mereni.zip
martinfolber
09.10.2009, 09:18
Dobrý den,zkoušel jsem Váš výkres a mohu potvrdit, že záleží, jak ta křivka vypadá. Pokud při výpočtu plochy protíná hranice plochy sebe sama, tak není schopen ji spočítat. Plocha uvedená ve vlastnostech není u takovéto křivky pravdivá.Pokud nemá křivka rozumný tvar, přikazem plocha <objekt> určitě její obsah nezískáme.
V tom případě se jedná o BUG!!Problém ve funkci ADDLEN a i vdalších mých funkcích jsem vyřešil snadno (viz níže), ale to neřeší vlastní příčinu. Bylo by prosím možné sjednat u Autodesku nápravu? Jak je to s jinými verzemi AutoCadu? Nebo je to jen otázka Civilu 2010?Ve funkci ADDLEN se tímto způsobem zjišťuje délka křivky: (command "_area" "_e" en) (setq tot_len (+ tot_len (getvar "perimeter")));kde en je entita a tot_len je délka (real)Toto lze nahradit takto: (vl-load-com) (setq tot_len (+ tot_len (vlax-curve-getDistAtPoint en (vlax-curve-getEndPoint en))))ale to funguje jen na neuzavrene krivky!
alfred2009-10-09 10:02:25
Vladimír Michl
09.10.2009, 10:09
Příkaz [CMD]_AREA[/CMD] se chová asi logicky - obsah jde počítat jen u uzavřených hranic a pokud "náhradní" uzavření (první-poslední) vede k sebeprotínající se ploše, nemá výpočet obsahu smysl. Použití "obvodu" pro výpočet délky byla trochu oklika. Správný výpočet (pro aplikace) je:
(vlax-get object 'Length)
Nicméně tato funkce (je použitá i v okně Vlastnosti) nedává pro tu křivku v ukázce správné údaje - což je chyba. Nahlásíme pro opravu.
Moment, moment - spletla mně ta popiska u "Z" křivky, její skutečná délka nemá být 15. AutoCAD zobrazuje její délku dobře. A vrací ji správně i LISP funkce délky.
Pro AddLen to můžeme opravit přes tu vlastnost Length (je univerzálnější než staničení po křivce).Vladimír Michl2009-10-09 10:21:27
[QUOTE=Vladimír Michl]Příkaz [CMD]_AREA[/CMD] se chová asi logicky - obsah jde počítat jen u uzavřených hranic a pokud "náhradní" uzavření (první-poslední) vede k sebeprotínající se ploše, nemá výpočet obsahu smysl. Použití "obvodu" pro výpočet délky byla trochu oklika. Správný výpočet (pro aplikace) je:
(vlax-get object 'Length)
Nicméně tato funkce (je použitá i v okně Vlastnosti) nedává pro tu křivku v ukázce správné údaje - což je chyba. Nahlásíme pro opravu.
Pro AddLen to můžeme opravit přes to staničení po křivce.[/QUOTE]V tom případě se příkaz choval nelogicky v předchozích verzích!Příkaz na měření délky pro otevřené i uzavřené křivky lze takhle: (vlax-curve-getDistAtParam en (vlax-curve-getEndParam en))kde "en" je entita (křivka)vlax-get v nápovědě nemám (i když nejak fungule)Neměl jste náhodou na mysli toto?(setq vlaobj (vlax-ename->vla-object en))(vlax-get-property vlaobj 'Length)to by také fungovalo
[QUOTE=Vladimír Michl]
Moment, moment - spletla mně ta popiska u "Z" křivky, její skutečná délka nemá být 15. AutoCAD zobrazuje její délku dobře. A vrací ji správně i LISP funkce délky.
[/QUOTE]Ano, moje chyba - v souboru je skutečně napsaná špatná délka - omlouvám se. Původně jsem nakreslil skutečně křivku délky 15, ale mezi napsáním popisku a posláním jsem ještě s křivkou něco zkusil (hýbal jsem s koncovým bodem) a délku jsem zmršil...Otázka je co je chyba - příkaz plocha měřil plochu ve všech verzí AutoCadu a i v C3D 2010 je u křivky ve vlastnostech nějaká plocha. Nicméně najednou se to začalo chovat jinak...
Vladimír Michl
09.10.2009, 10:41
Ano, (vlax-get-property) je tatáž funkce. Vlastnost délka (Length) funguje i na další výkresové objekty odvozené od základních "liniových" objektů.
Zobrazovat číslo u nezjistitelné plochy asi není dobře. Mělo by to být prázdné. Možná se změnil vnitřní algoritmus výpočtu ploch. Ale plocha samoprotínajících se objektů není jednoznačně určitelná.
PS: AddLen byl upraven (stále ke stažení na BBS/VIP)Vladimír Michl2009-10-09 11:45:23
Nevíte od jaké verze se to projevuje?
Vladimír Michl
09.10.2009, 13:34
Poslední změna týkající se ploch byla v AutoCADu dělána v Bonus Packu 1 k verzi 2009 - takže možná od tehdy.
Zkoušel jsem to u kolegyně - AutoCad 2009 s nějakými service packy (1, 2?? ) bez bonus paků měří normálně postaru (a tedy podle mě dobře). Čistý AutoCad 2010 nemohu vyzkoušet...