FastFiber

Arc on (p)line, hoe selecteren met OSNAP

Gestart door Reimer, vr 17 04 2015, 08:40:03

Vorige topic - Volgende topic

Reimer

Beste lispers,

op verzoek van collega's probeer ik een routine te maken waarmee ik een boog kan tekenen vanaf een (p)line, met een opgegeven radius. Ik vond op internet een stukje code waarmee ik de richting van de lijn kan bepalen op de opgegeven locatie. De functie werkt al wel, ik zou allen graag bij het selecteren van de lijn gebruik willen maken van de actieve OSNAP. Wat nu gebeurd is dat PT wordt bepaald door NEA op het geselecteerde object. Ik wil meestal uitgaan van END, maar het liefste van de OSMODE die door de gebruiker is ingesteld.

PS. Wat is de beste manier om er voor te zorgen dat alleen lijn-objecten worden geselecteerd? Ik heb wel verschillende mogelijkheden gezien, maar vraag me af wat de beste (kortste) is.

;Arc on (p)line
(defun c:AOL ( / RADIUS ESEL POL PT ANG PT2 ANG2 PCEN OLDSNAP)
  (prompt (strcat "Geef de radius <" (rtos (getvar "filletrad") 2 (getvar "luprec")) ">"))
  (setq RADIUS (getreal))
  (if (= RADIUS nil)
    (setq RADIUS (getvar "filletrad"))
    (setvar "filletrad" RADIUS)
  )

; \/ code van internet
  (vl-load-com)
  (setq
    ESEL (entsel "\nSelect een (poly)line: ")
    POL (car ESEL)
    PT (osnap (cadr ESEL) "nea"); use Osnap to ensure it's really ON the Polyline
    ANG
      (angle
        '(0 0 0)
        (vlax-curve-getFirstDeriv
          POL
          (vlax-curve-getParamAtPoint POL PT)
        ); end 1st deriv
      ); end angle & ang
  )
; /\ code van internet

  (setq PT2 (getpoint pt "\nGeef een zijde aan: "))
  (setq ANG2 (angle PT PT2))
  (if (minusp (sin (- (angle pt pt2) ang)))
    (setq PCEN (polar PT (- ANG (* 0.5 PI)) RADIUS))
    (setq PCEN (polar PT (+ ANG (* 0.5 PI)) RADIUS))
   )
  (setq OLDSNAP (getvar "osmode"))
  (setvar "osmode" 0)
  (command "_arc" PT "c" PCEN)
  (setvar "osmode" OLDSNAP)
)

roy_043

2 links met oplossingen voor jouw probleem:
http://www.theswamp.org/index.php?topic=12786.0
http://www.theswamp.org/index.php?topic=44737.0

Het kan zijn dat je de functie (vlax-curve-getclosestpointto) moet gebruiken om er zeker van te zijn dat het punt op de (poly)lijn ligt. Bijvoorbeeld bij osmode=0.

Er is verder een interessant probleem bij polylijnen. Welke raaklijn moet gebruikt worden bij een knikpunt in de polylijn?


Nog twee opmerkingen:

De functie (getreal) accepteert een prompt argument. Je hoeft dus niet gebruik te maken van de (prompt) functie.

Jouw functie eindigt halverwege het "_arc" commando. Het is beter om dit als volgt op te lossen:
(defun c:AOL ( / RADIUS ESEL POL PT ANG PT2 ANG2 PCEN OLDSNAP)
  ...
  ...
  (command "_arc" PT "c" PCEN)
  (setvar "osmode" OLDSNAP)
  (while (> (getvar 'cmdactive) 0)
    (command pause)
  )
  (princ)
)




Reimer

Bedankt voor je antwoord.
De links geven een goed idee van hoe je de OSMODE kunt omzetten in een lijst van snap-commando's.
Nu moet ik nog zien uit te vinden of ik (entsel) kan draaien mét objectsnaps actief. Wanneer ik (entsel) gebruik in acad worden de objectsnaps genegeerd. Ik kan echter wel opnieuw een snap activeren en mijn routine werkt dan ook goed.

Ik heb de prompt toegevoegd aan (getreal). Goede tip.

Ik eindig bewust halverwege het "_arc" commando zodat ik in acad CTRL kan gebruiken om de richting van de arc te wijzigen. In jouw voorbeeld (en mijn eigen experimenten) kan dat niet.
Het is geen nette oplossing, maar werkt wel.

HofCAD

Beste Reimer,

Is het niet voldoende, om
PT (osnap (cadr ESEL) "nea");
te vervangen door
PT   (osnap (cadr ESEL) "_END,_MID")

Met vriendelijke groet, HofCAD CSI.
ACADcadabra

Reimer

Nee, helaas niet. Ik moet eerst een object selecteren met (entsel) en kan dan niet zien naar welk punt hij zal snappen.
Ik merk dat ik met (entsel) gewoon gebruik kan maken van 'selection cycling', dit is een groot voordeel.

Reimer

roy_043

#5
Deze variant werkt goed in BricsCAD V14. Door het arc commando te starten met het 'entsel-punt' PT werkt de ingestelde osnap. Vervolgens kan met de variabele 'lastpoint' het gesnapte punt worden gevonden. Het wijzigen van de richting van de arc met Ctrl werkt helaas niet in BricsCAD V14.
;Arc on (p)line
(defun c:AOL ( / RADIUS ESEL POL PT PT2 ANG PCEN oldOSMODE oldOSNAPCOORD)
  (vl-load-com)
  (if (setq RADIUS (getreal (strcat "\nGeef de radius <" (rtos (getvar 'filletrad)) ">: ")))
    (setvar 'filletrad RADIUS)
    (setq RADIUS (getvar 'filletrad))
  )
  (setq ESEL (entsel "\nSelect een (poly)line: "))
  (setq POL (car ESEL))
  (setq PT (cadr ESEL))
  (setq oldOSNAPCOORD (getvar 'osnapcoord))
  (setvar 'osnapcoord 0) ; 2 (=default) werkt ook.
  (command "_arc" PT) ; Start arc commando terwijl osnap actief is.
  (setvar 'osnapcoord oldOSNAPCOORD)
  (setq PT (getvar 'lastpoint))
  (setq PT2 (getpoint PT "\nGeef een zijde aan: "))
  (setq ANG
    (angle
      '(0.0 0.0 0.0)
      (vlax-curve-getfirstderiv
        POL
        (vlax-curve-getparamatpoint POL (vlax-curve-getclosestpointto POL PT))
      )
    )
  )
  (setq PCEN
    (polar
      PT
      (if (minusp (sin (- (angle PT PT2) ANG)))
        (- ANG (* 0.5 pi))
        (+ ANG (* 0.5 pi))
      )
      RADIUS
    )
  )
  (setq oldOSMODE (getvar 'osmode))
  (setvar 'osmode 0)
  (command "_c" PCEN) ; Vervolg arc commando.
  (setvar 'osmode oldOSMODE)
  (while (> (getvar 'cmdactive) 0)
    (command pause)
  )
  (princ)
)

Reimer

Bedankt hiervoor. Hij doet echter nog niet wat ik wens omdat ik tijdens het selecteren van het lijn-object niet kan zien welke van de objectsnaps hij zal toepassen. Ik ken trouwens ook geen (standaard) commando's waarin dit wel gebeurt, echter zou het voor mij nu wel nuttig zijn omdat ik zowel een object als een snap-punt wil hebben.
Misschien moet ik toch mijn werkwijze aanpassen en uitgaan van een punt (met osnap) en hiermee vervolgens een object pakken om de richting te bepalen. Risico hierbij is misschien dat er veel objecten dicht bij elkaar kunnen liggen.

Het wijzigen van de richting werkt in deze lisp ook niet doordat het arc-commando netjes wordt afgerond. Laat ik (while (> (getvar 'cmdactive) 0) (command pause) ) weg dan werkt het wel, maar heb ik geen nette lisp.

Ik stoei nog even verder.

Reimer