I see... thx
Offset: we have it localized as Ekvid... which is an artificial shortcut for Ekvidistanta (or Equidistant in eng)... none of it is really a local word, but I guess it is more understandable than offset. But still, I would like to hear some explanation why it's not "parallel".
@capuano3d
If you need a lisp to automate the process, here you go. Not sure whether Dynamo is an option for you.
(vl-load-com)
(defun c:OffsetAtOrigin ( / *error* osm sel psel pside psideon ang oside cop off)
(defun *error* (errmsg)
(if (not (wcmatch errmsg "Function cancelled,quit / exit abort,console break,end"))
(princ (strcat "\nError: " errmsg)))
(if osm (setvar 'osmode osm))
(princ))
(or *off0-dst* (setq *off0-dst* (abs (getvar 'offsetdist))))
(setq *off0-dst* (cond ((getdist (strcat "\nSpecify offset distance <" (rtos *off0-dst*) ">: "))) (*off0-dst*)))
(setq osm (getvar 'osmode))
(while (and (setq sel (entsel "\nSelect object to offset: "))
(or (= "LWPOLYLINE" (cdr (assoc 0 (entget (car sel)))))
(prompt "\nError: Selected object is not polyline."))
(setq org (vlax-ename->vla-object (car sel)))
(setq psel (trans (cadr sel) 1 0))
(setvar 'osmode 0)
(setq pside (getpoint "\nSpecify point on side to offset: "))
(setq pside (trans pside 1 0))
)
(setq psideon (vlax-curve-getclosestpointto org pside))
(setq ang (- (angle (vlax-curve-getfirstderiv org (vlax-curve-getParamAtPoint org psideon)) '(0 0 0))
(angle psideon pside)))
(setq oside (if (or (equal ang (* pi 0.5) 1e-6)
(equal ang (* pi -1.5) 1e-6)
)
-1
+1))
(setq cop (vla-copy org))
(vla-move cop (vlax-3d-point psel) (vlax-3d-point '(0 0 0)))
(setq off (vlax-invoke cop 'Offset (* *off0-dst* oside)))
(foreach obj off
(vla-move obj (vlax-3d-point '(0 0 0)) (vlax-3d-point psel)))
(vla-erase cop)
)
(*error* "end")
)