Zobrazit plnou verzi příspěvku: Zlé vykreslenie!

michaelflyer
17.04.2008, 21:13
Dobrý deň.

Začal som jednoduchšie a chcel som len nakresliť priamku nad bodmi St.A a St.Z. Samozrejme, že mi priamku nakreslí od bodu St.AV po bod St.ZV, ale dĺžka priamky je =0. St.AV bod je na bodom St.Z :-( neviem ako je to možné) . To čo je označené zelenou, tak mi len zisťuje ako je otočená priamka a zapamätá si uhol, ktorý potrebujem na ďalšie programovanie.

(defun c:zabr ()
(setq Vyška_zabradlia (getdist "\nZadaj výšku zábradlia: "))

(prompt "\nOznač priamku!:")
(setq UHOL (ssget))
(setq entita (ssname UHOL 0))
(setq zoznam_ent (entget entita))
(setq Bod_A (cdr (assoc 10 zoznam_ent)))
(setq Bod_B (cdr (assoc 11 zoznam_ent)))
(setq ay (nth 1 Bod_A))
(setq by (nth 1 Bod_B))
(if (< ay by)          ;;;;
    (progn (setq am Bod_A)
    (setq bm Bod_B)
    (setq uhol0 (angle am bm))
    (setq uhol1 (* uhol0 (/ 180 pi)))
    (if (> uhol1 90)
      (progn
      (setq ALFA (abs (- 180.0 uhol1)))))
    (if (< uhol1 90)
      (progn (setq ALFA uhol1)))
      (princ (float ALFA))
      (princ am)
      (princ bm)
      (princ uhol1)))
(if (> ay by)           ;;;;
    (progn (setq am Bod_B)
    (setq bm Bod_A)
    (setq uhol0 (angle am bm))
    (setq uhol1 (* uhol0 (/ 180 pi)))
    (if (> uhol1 90)
      (progn (setq ALFA (abs (- 180.0 uhol1)))))
    (if (< uhol1 90)
      (progn (setq ALFA uhol1)))
      (princ (float ALFA))
      (princ am)
      (princ bm)
      (princ uhol1)))
   (if(= ay by)           ;;;;
    (progn
    (setq uhol1 360.0)
    (setq ALFA uhol1)
    (princ uhol1)
    (princ (float ALFA))))
(ssdel entita UHOL)

(setq St.A (trans (getpoint "\nZadaj bod, os PRVÉHO stlpiku na stupni: ") 1 0))
(setq St.Z (trans (getpoint "\nZadaj bod, os POSLEDNÉHO stlpiku na stupni: ") 1 0))
;;;BODY
(setq St.AV (trans (list (car St.A) (+ (cadr St.A) 1500.0)) 1 0))
(setq St.ZV (trans (list (car St.Z) (+ (cadr St.Z) 1500.0)) 1 0))
;;;Vykreslenie
(setq     kresli1 (entmakex (list
               (cons 0 "line")
               (cons 6 "DASHDOT")
               (cons 8 "koty")
               (cons 10 St.AV)
               (cons 11 St.VZ))))
)
Vopred ďakujem za pomoc...

michaelflyer
18.04.2008, 08:06
Asi nie som jediný, kto to nechápe. Trošku to zjednoduším. Má to iba nakresliť priamku nad dvomi bodmi. Problém ostáva:
(defun c:zabr ()

(setq St.A (trans (getpoint "\nZadaj bod, os PRVÉHO stlpiku na stupni: ") 1 0))
(princ St.A)

(setq St.Z (trans (getpoint "\nZadaj bod, os POSLEDNÉHO stlpiku na stupni: ") 1 0))
(princ St.Z)

;;;BODY
(setq St.AV (trans (list (car St.A) (+ (cadr St.A) 1500.0)) 1 0))
(setq St.ZV (trans (list (car St.Z) (+ (cadr St.Z) 1500.0)) 1 0))
;;;Vykreslenie
(setq     kresli1 (entmakex (list
               (cons 0 "line")
               (cons 6 "DASHDOT")
               (cons 8 "koty")
               (cons 10 St.AV)
               (cons 11 St.VZ))))
)

Vladimír Michl
18.04.2008, 08:26
Dotaz je poněkud nesrozumitelný - v čem spočívá problém?

michaelflyer
18.04.2008, 08:53
Nakreslí to primku od bodu St.AV po bod St.ZV, ale bod St.AV nie je nad bodom St.A a nechápem prečo je nad bodom St.Z – vtom istom mieste kde je aj St.ZV.
Hádam som to neskomolil...

predcis
18.04.2008, 09:23
Chyba bude v názve premenných, skúste premenovať St.A na St_A.

michaelflyer
18.04.2008, 10:15
Ďakujem.... Je to tak!!! Ale nechápem prečo mu vadí "."????   

Ferdinand
22.04.2008, 10:39
Takhle to proběhne, když to zadám do příkazového řádku (ve "startovacím" prázdném výkresu):
 
Command: (setq St.A (trans (getpoint "\nZadaj bod, os PRVÉHO stlpiku na stupni: ") 1 0))
Zadaj bod, os PRVÉHO stlpiku na stupni: (kliknul jsem někam=>158.0 139.0 0.0)
Command: (setq St.Z (trans (getpoint "\nZadaj bod, os POSLEDNÉHO stlpiku na stupni: ") 1 0))
Zadaj bod, os POSLEDNÉHO stlpiku na stupni: (kliknul jsem někam jinam=>405.0 71.0 0.0)
 
Pokud chci zkontrolovat, zda je vše OK, tak:
 
Command: !st.a(405.0 71.0 0.0)
Command: !st.z(405.0 71.0 0.0)
 
Osobně tečkované proměnné nepoužívám, jenom číslované (např. B1, B2, ...atd.)
Při psaní nového lispu si ho prvně zkuste "odkrokovat" postupně na příkazovém řádku...Ferdinand2008-04-22 10:42:09

Jan Liska
25.04.2008, 11:16
Tečku nelze použít v názvu proměnné, viz:
AutoLISP uses symbols to refer to data. Symbol names are not case sensitive and may consist of any sequence of alphanumeric and notation characters, except the following:Characters restricted from symbol names  (   Open Parenthesis  )   Close Parenthesis  .   Period  '   Apostrophe  "   Quote Symbol  ;   Semicolon
A symbol name cannot consist only of numeric characters.
 

michaelflyer
04.05.2008, 21:12
Dobrý deň.
1) Mňa to zvláštne premiestňovanie bodov z jedného na druhý neprestane prenasledovať!
Program mi fungoval bezchybne (pokiaľ som zachoval ideálne podmienky)...
Ako náhle som pridal podmienky do programu, začalo to robiť, teda nerobiť nič! A to som si dával pozor aby sa mi vo funkciach neobjavovali: "-" "."
Bod L2_uprav má presne tie isté súradnice ako L1_uprav! Je tam dosť podmienok, ale hádam tam chybu nemám. Aj som si to skontroloval, ale človek nikdy nevie...

(defun c:N16H ()
;;; VSTUPNE UDAJE
;;;VYBER ENTITY
(prompt "\nOznac vrchnu hranu schodnice!")
(setq UHOL (ssget))
(setq entita (ssname UHOL 0))
(setq zoznam_ent (entget entita))
(setq aaa (cdr (assoc 10 zoznam_ent)))
(setq bbb (cdr (assoc 11 zoznam_ent)))

(setq ay (nth 1 aaa))
(setq by (nth 1 bbb))

(if(= ay by)
    (progn
    (setq uhol1 360.0)
    (setq ALFA uhol1)
    (princ uhol1)
    (princ (float ALFA))
))
(ssdel entita UHOL)

(setq v (getdist "\nZadaj vysku [od vrchnej hrany schodnice po spodnu hranu madla>: "))
(setq n (getreal "\nZadaj počet prutov [3,4,5,6>:"))
;____________________________



;;; VSTUPNE UDAJE
(setq L1_uprav (trans (getpoint "\nZadaj dlzku [od stlpa>: ") 1 0))
(setq L2_uprav (trans (getpoint "\nZadaj dlzku [po stlp>: ") 1 0))
(setq L (abs (distance L1 L2)))
(setq L_poloha_1 (nth 0 L1))
(setq L_poloha_2 (nth 0 L2))

;;; VYPOCTY
(setq vv (+ v 16.0))
(setq xv1 (- (/ vv (+ n 1.0)) 8.0))
(setq xvx (/ vv (+ n 1.0)))


(if (< L_poloha_1 L_poloha_2)
    (progn
    (setq L1_uprav_1 L1_uprav)
    (setq L2_uprav_2 L2_uprav)
))

(if (> L_poloha_1 L_poloha_2)
    (progn
    (setq L1_uprav_1 L2_uprav)
    (setq L2_uprav_2 L1_uprav)
))

(setq L_stred (list (+ (car L1) (/ L 2.0)) (cadr L1)))


(setq orient (getpoint "\nZadaj na ktroej strane bude prút zvvrtany iba 15mm: "))
(setq orient_A (nth 0 orient))
(setq L_stred_A (nth 0 L_stred))


(if (> L_stred_A orient_A)
    (progn
    (setq L1 L1_uprav_1)
    (setq L2 L2_uprav_2)
))


(if (< L_stred_A orient_A)
    (progn
    (setq L1 L2_uprav_2)
    (setq L2 L1_uprav_1)
))

   

;;; SURADNICE BODOV
(setq o1 (trans (list (car L1) (+ (cadr L1) xv1)) 1 0))

(if (< orient_A L_stred_A)
    (progn
    (setq o2 (trans (list (- (car o1) 15.0) (cadr o1)) 1 0))
    ))

(if (> orient_A L_stred_A)
    (progn
    (setq o2 (trans (list (+ (car o1) 15.0) (cadr o1)) 1 0))
    ))

(setq s2 (trans (list (car o2) (- (cadr o1) 8.0)) 1 0))
(setq s3 (trans (list (car o2) (+ (cadr o1) 8.0)) 1 0))


(setq o10 (trans (list (car L2) (+ (cadr L2) xv1)) 1 0))

(if (< orient_A L_stred_A)
    (progn
    (setq s12 (trans (list (+ (car o10) 35.0) (cadr o10)) 1 0))
))

(if (> orient_A L_stred_A)
    (progn
    (setq s12 (trans (list (- (car o10) 35.0) (cadr o10)) 1 0))
))

(setq s11 (trans (list (car s12) (- (cadr s12) 8.0)) 1 0))
(setq s13 (trans (list (car s12) (+ (cadr s12) 8.0)) 1 0))

(if (< orient_A L_stred_A)
    (progn
    (setq v10 (trans (list (- (car s11) 20.0) (cadr s11)) 1 0))
    (setq v11 (trans (list (- (car s13) 20.0) (cadr s13)) 1 0))
    (setq o11 (trans (list (- (car s12) 20.0) (cadr s12)) 1 0))
))

(if (> orient_A L_stred_A)
    (progn
    (setq v10 (trans (list (+ (car s11) 20.0) (cadr s11)) 1 0))
    (setq v11 (trans (list (+ (car s13) 20.0) (cadr s13)) 1 0))
    (setq o11 (trans (list (+ (car s12) 20.0) (cadr s12)) 1 0))
))

;______________________________________________________________

;;; VYKRESLENIE
(setq     ent1 (entmakex (list
               (cons 0 "line")
               (cons 8 "stlp")
               (cons 10 o1)
               (cons 11 o2))))
(setq     ent2 (entmakex (list
               (cons 0 "line")
               (cons 8 "stlp")
               (cons 10 s2)
               (cons 11 s3))))
(setq     ent3 (entmakex (list
               (cons 0 "line")
               (cons 8 "stlp")
               (cons 10 o10)
               (cons 11 s12))))
(setq     ent4 (entmakex (list
               (cons 0 "line")
               (cons 8 "stlp")
               (cons 10 s11)
               (cons 11 s13))))
(setq     ent5 (entmakex (list
               (cons 0 "line")
               (cons 8 "NRZ")
               (cons 10 s3)
               (cons 11 v11))))
(setq     ent6 (entmakex (list
               (cons 0 "line")
               (cons 8 "NRZ")
               (cons 10 s2)
               (cons 11 v10))))
(setq     ent7 (entmakex (list
               (cons 0 "line")
               (cons 8 "NRZ")
               (cons 10 v11)
               (cons 11 v10))))
(setq     ent8 (entmakex (list
               (cons 0 "line")
               (cons 6 "DASHDOT")
               (cons 8 "koty")
               (cons 10 o2)
               (cons 11 o11))))
(setq n (rtos n))
(princ n)

;;; KOPIROVANIE "N" PRUTOV
   (command "_array" ent1 ent2 ent3 ent4 ent5 ent6 ent7 ent8 ent9 ent10 "" "R" n "1" xvx)

);;;KONIEC PROGRAMU

2) Ešte mám potom otázku ku kótovaniu uhlu. Urobil som si program, kde mi stačí vybrať obe priamky naraz. Ale ťahá mi to priamky (kót) aj na miestach kde vybrané priamky sú. Je to preto, lebo som musel preskočiť vyberanie objektov a musel som to zadávať bodovo... A tomu sa chcem vyhnúť. Zistil som, že "_dimangular" pri výbere nechce mená entít. Čo potom chce??? A ako to naprogramovať tak aby dostal to čo chce a ja tiež :-)

3) Ako sa dá aby si Autocad zapamätal funkciu. Čo myslím. Napr.: kružnica. Zadáte priemer a pamätá si ho až kým výkres nezavriete.

Vopred ďakujem za pomoc.

Ferdinand
06.05.2008, 10:10
To bude asi v sekci
;;; VSTUPNE UDAJE   (setq L1_uprav (trans (getpoint "\nZadaj dlzku [od stlpa>: ") 1 0))  (setq L2_uprav (trans (getpoint "\nZadaj dlzku [po stlp>: ") 1 0))

zkusit mezi ně vpíchnout "nevinnou" funkci např.
;;; VSTUPNE UDAJE   (setq L1_uprav (trans (getpoint "\nZadaj dlzku [od stlpa>: ") 1 0))
  (command "_redrawall")  (setq L2_uprav (trans (getpoint "\nZadaj dlzku [po stlp>: ") 1 0))
Proč je tam to "trans" a ta čísla "1 0" ? "Obyčejné" zadání nefunguje?
  (setq L1_uprav (getpoint "\nZadaj dlzku [od stlpa>: "))

michaelflyer
06.05.2008, 14:41
Nepoteším vás... Tá nevinná funkcia
(command "_redrawall")
nemá vplyv na ten bod L2_uprav. Stále mi to hádže
"Zadaj dlzku [po stlp>: ; error: bad argument type: 2D/3D point: nil"

"Proč je tam to "trans" a ta čísla "1 0" ? "Obyčejné" zadání nefunguje?"
Funguje, ale istota :-) Ak je vo výkrese nastavený iný systém súradníc tak (trans xyz 1 0) slúži na globálne súradnice.
Nechcem sa vnucovať, ale mám tam aj ďalšie dve otázky... Máte stým nejaké skúsenosti???

svarc.vl
06.05.2008, 15:50
když máte
;;; VSTUPNE UDAJE (setq L1_uprav (trans (getpoint "\nZadaj dlzku [od stlpa>: ") 1 0)) (setq L2_uprav (trans (getpoint "\nZadaj dlzku [po stlp>: ") 1 0)) (setq L (abs (distance L1 L2))) (setq L_poloha_1 (nth 0 L1)) (setq L_poloha_2 (nth 0 L2))
 
Ale délku počítáte z bodů L1 a L2 a načítáte L1_uprav a L2_uprav
Máte ošetřené úchopy a prioritu zadávání souřadnic v nastavení-uživatelské nastavení  (příkaz _options) ??
 

michaelflyer
06.05.2008, 16:30
No super! Ja som to riadne pomotal!!! Už som zistil kde mám chyby!!! Ďakujem za vašu pomoc. No ako sa hovorí: viac očí viac vidí

A ešte jedna vec. Ku koncu programu mám príkaz:
(command "_array" ent1 ent2 ent3 ent4 ent5 ent6 ent7 ent8 ent9 ent10 "" "R" n "1" xvx)
No tu mi to štrajkuje a vypisuje:

Select objects:   1 found, 8 total – tu to vykreslí poslednú entitu
Select objects:
Command:
Command: N16H Unknown command "N16H". Press F1 for help.
Command: R Unknown command "R". Press F1 for help.
Command: 6 Unknown command "6". Press F1 for help.
Command: 1 Unknown command "1". Press F1 for help.
Command: 116.571429

Ako keby nepoznalo príkaz „_ array“ ...
Ešte raz ďakujem za pomoc...

svarc.vl
06.05.2008, 17:13
Zadejte do příkazu _array ....... "_R"  (R s podtrzitkem)

michaelflyer
07.05.2008, 15:32
Ďakujem všetkým za rady, je to funkčné a hlavne robí to, to čo má.