Zobrazit plnou verzi příspěvku: Nefunkční úchopové body

BenaCZ
09.10.2006, 13:19
Napsal jsem lisp na tvorbu křivky, která změní své koncové body o nějakou vzdálenost a nastaví se určitá šířka křivky. Všechno funguje supr, jen mám problém s nastavením správných úchopových bodů:
Když mám puštené všechny úchopové body, tak se to chytá správně. Pokud ale chci vybrat jen určitý úchopový bod (např přes nabídku pravého tlačítka nebo přes klávesovou zkratku), tak se to chytá špatně. vůbec nevím čím to je...
Nevíte někdo? Díky Bena

Zde je lisp:
;;; Vykreslí křivku o tloušťce určené globálním měřítkem mezi 2 body a odsune ji o 1 mm na výkrese
(defun C:schema_auto (/           myline         startpt    endpt
                new_startpt         new_endpt tloustka
                odpal      uhel         delta_x    delta_y
                width
               )
(terpri)
;;; Definuje úsečku
(setq odpal (+ (/ (getvar "ltscale") 2) (getvar "ltscale")))
(terpri)
(setq startpt (getpoint "Z bodu: "))
(terpri)
(terpri)
(setq endpt (getpoint "Do bodu: "))
(command "_line" startpt endpt "")

;;; definice úhlu úsečky
(setq myline (entget (entlast)))
(setq startpt (assoc 10 myline))
(setq endpt (assoc 11 myline))
(setq delta_x (- (nth 1 endpt) (nth 1 startpt)))
(setq delta_y (- (nth 2 endpt) (nth 2 startpt)))
(setq uhel (atan delta_y delta_x))

;;; posun počátečního bodu o "odpal" ve směru úsečky
(setq     new_startpt
      (list 10
            (+ (nth 1 startpt) (* odpal (cos uhel)))
            (+ (nth 2 startpt) (* odpal (sin uhel)))
            (nth 3 startpt)
      )
)
(setq myline (subst new_startpt startpt myline))

;;; posun koncového bodu o "odpal" ve směru úsečky
(setq     new_endpt (list     11
               (- (nth 1 endpt) (* odpal (cos uhel)))
               (- (nth 2 endpt) (* odpal (sin uhel)))
               (nth 3 endpt)
           )
)
(setq myline (subst new_endpt endpt myline))

;;; aktualizuje databázi Autocadu
(entmod myline)

;;; Převede úsečku na křivku o zadané tloušťce
(setq width (* (getvar "ltscale") 1))
(if (= (getvar "peditaccept") 0)
    (command "_pedit" "_last" "A" "")
)                         ;převede na křivku pokud musím potvrdit otázku zda to chci převést na křivku
(if (= (getvar "peditaccept") 1)
    (command "_pedit" "_last")
)                         ;převede na křivku bez otázky na převod na křivku
(setq mojekrivka (entget (entlast)))
(setq     mojekrivka
      (subst (cons 43 width) (assoc 43 mojekrivka) mojekrivka)
)                         ; tzv tečkový pár tvoří to cons

;;; aktualizuje databázi Autocadu
(entmod mojekrivka)
;;; tichý odchod
(princ)
)

Ferdinand
10.10.2006, 19:43
(terpri)neznám... co to je?

Vladimír Michl
10.10.2006, 20:04
(terpri) jen odřádkuje na displeji...

BenaCZ
10.10.2006, 22:15
Ono to nefunguje správně ani u tohoto jednoduchého příkladu:

(defun C:test (/
            myline
           )
(terpri)
;;; Definuje úsečku
(setq startpt (getpoint "Z bodu: "))
(terpri)
(setq endpt (getpoint "Do bodu: "))
(command "_line" startpt endpt "")
;;; tichý odchod
(princ)
)


Zkuste si schválně nakreslit pár čar a pak kreslit novou pomocí funkce "test" a pustit si úchopový bod polovina a kolmo. Tato kombinace hodně zlobí a chytá se to prostě úplně jiných bodů... Vůbec nevím proč :( Bena

Ferdinand
11.10.2006, 10:27
A čím se liší od  \n  ?

Ferdinand
11.10.2006, 10:34
Podíval jsem se - klasická tvorba křivky se děje takhle (například):Command:PLINESpecify start point:Current line-width is 0.00Specify next point or [Arc/Halfwidth/Length/Undo/Width]: WSpecify starting width <0.00>: 10Specify ending width <10.00>:Specify next point or [Arc/Halfwidth/Length/Undo/Width]:Specify next point or [Arc/Close/Halfwidth/Length/Undo/Width]:Specify next point or [Arc/Close/Halfwidth/Length/Undo/Width]:Specify next point or [Arc/Close/Halfwidth/Length/Undo/Width]: ASpecify endpoint of arc or[Angle/CEnter/CLose/Direction/Halfwidth/Line/Radius/Second pt/Undo/Width]:Specify endpoint of arc or[Angle/CEnter/CLose/Direction/Halfwidth/Line/Radius/Second pt/Undo/Width]: DSpecify the tangent direction for the start point of arc:Specify endpoint of the arc:Specify endpoint of arc or[Angle/CEnter/CLose/Direction/Halfwidth/Line/Radius/Second pt/Undo/Width]: LSpecify next point or [Arc/Close/Halfwidth/Length/Undo/Width]:Specify next point or [Arc/Close/Halfwidth/Length/Undo/Width]:Úchopové body pak mohu posouvat jak je libo...Asi jsem málo chápavej, ale u tohoto Vašeho lispu mi také uniká smysl počínání...

BenaCZ
11.10.2006, 10:36
Neliší se v ničem (aspoň myslím).

Už jsem vymyslel jak to vyřešit s těmi úchopovými body. Udělám to tak, že se zadám příkaz _line a kliknu na 2 body a ty se mi pak načtou jakou startpt a endpt , které budu pak upravovat. Rozdíl je v tom, že před tím se mi úsečka vytvářela automaticky z dříve zadaných bodů, zatímco teď to bude naopak. Pak to bude fungovat...

BenaCZ
11.10.2006, 10:43
Tato funkce se mi hodí na kreslení statických schemat, kde kreslím nosníky jako tlusté čáry a potřebuji,aby nebyli nebyli spojené s kolmými čarami. Ještě jsem si to upravil tak aby se mi ten "odpal" a šířka čáry automaticky volila podle aktuálního globálního měřítka. Tzn. zadávám jen 1. a koncový bod a zbytek se dělá automaticky.

Vladimír Michl
11.10.2006, 11:26
[QUOTE=Ferdinand]A čím se liší od  \n  ? [/QUOTE]
(terpri) je historická funkce - lišila se od jiných v tom zda se odřádkovávalo na textové obrazovce (DOS) nebo v příkazovém řádku nebo v obojím (už nevím to pravidlo přesně)