Index: vg-test.scm ================================================================== --- vg-test.scm +++ vg-test.scm @@ -1,35 +1,51 @@ (use canvas-draw iup) (import canvas-draw-iup) (load "vg.scm") +(use trace) +(trace vg:draw-rect) (define d1 (vg:drawing-new)) (define l1 (vg:lib-new)) (define c1 (vg:comp-new)) +(define c2 (vg:comp-new)) (let ((r1 (vg:make-rect 20 20 40 40)) (r2 (vg:make-rect 40 40 80 80))) (vg:add-objs-to-comp c1 r1 r2)) ;; add the c1 component to lib l1 with name firstcomp (vg:add-comp-to-lib l1 "firstcomp" c1) +(vg:add-comp-to-lib l1 "secondcomp" c2) ;; add the l1 lib to drawing with name firstlib (vg:add-lib d1 "firstlib" l1) ;; instantiate firstlib/firstcomp as inst1 in drawing d1 at 0,0 (vg:instantiate d1 "firstlib" "firstcomp" "inst1" 0 0) (vg:instantiate d1 "firstlib" "firstcomp" "inst2" 200 200) -(vg:drawing-scalex-set! d1 1.1) -(vg:drawing-scaley-set! d1 0.5) + +;; (vg:drawing-scalex-set! d1 1.1) +;; (vg:drawing-scaley-set! d1 0.5) ;; (define xtnts (vg:scale-offset-xy ;; (vg:component-get-extents c1) ;; 1.1 1.1 -2 -2)) +;; get extents of c1 and put a rectange around it +;; (define xtnts (apply vg:grow-rect 10 10 (vg:components-get-extents c1))) (vg:add-objs-to-comp c1 (apply vg:make-rect xtnts)) + +;; get extents of all objects and put rectangle around it +;; +(define big-xtnts (vg:instances-get-extents d1)) +(vg:add-objs-to-comp c2 (apply vg:make-rect big-xtnts)) +(vg:instantiate d1 "firstlib" "secondcomp" "inst3" 0 0) + +(vg:drawing-scalex-set! d1 1.8) +(vg:drawing-scaley-set! d1 1.1) (define cnv #f) (define the-cnv (canvas #:size "500x400" #:expand "YES" @@ -44,10 +60,10 @@ (dialog (vbox the-cnv))) (vg:drawing-cnv-set! d1 cnv) -(vg:draw d1) +(vg:draw d1 #t) ;; (canvas-rectangle! cnv 10 100 10 80) (main-loop) Index: vg.scm ================================================================== --- vg.scm +++ vg.scm @@ -8,11 +8,11 @@ ;; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ;; PURPOSE. ;; strftime('%m/%d/%Y %H:%M:%S','now','localtime') -(use defstruct) +(use defstruct srfi-1) (declare (unit vg)) (use canvas-draw iup) (import canvas-draw-iup) ;; structs @@ -213,44 +213,76 @@ font: (vg:obj-font obj))) (pts (vg:obj-pts obj))) (vg:obj-pts-set! res (vg:drawing-inst-apply-scale-offset drawing inst pts)) (vg:drawing-cache-set! drawing (cons res (vg:drawing-cache drawing) )) res)) + +;;====================================================================== +;; instances +;;====================================================================== + +(define (vg:instances-get-extents drawing . instance-names) + (let ((xtnt-lst (vg:draw drawing #f)) + (llx #f) + (lly #f) + (ulx #f) + (uly #f)) + (for-each + (lambda (extents) + (let* ((ollx (list-ref extents 0)) + (olly (list-ref extents 1)) + (oulx (list-ref extents 2)) + (ouly (list-ref extents 3))) + (if (or (not llx)(< ollx llx))(set! llx ollx)) + (if (or (not lly)(< olly lly))(set! lly olly)) + (if (or (not ulx)(> oulx ulx))(set! ulx oulx)) + (if (or (not uly)(> ouly uly))(set! uly ouly)))) + xtnt-lst) + (list llx lly ulx uly))) + ;;====================================================================== ;; Unravel and draw the objects ;;====================================================================== -(define (vg:draw-obj drawing obj) +;; with get-extents = #t return the extents +;; with draw = #f don't actually draw the object +;; +(define (vg:draw-obj drawing obj #!key (draw #t)) (print "obj type: " (vg:obj-type obj)) (case (vg:obj-type obj) - ((r)(vg:draw-rect drawing obj)))) + ((r)(vg:draw-rect drawing obj draw: draw)))) ;; given a rect obj draw it on the canvas applying first the drawing ;; scale and offset ;; -(define (vg:draw-rect drawing obj) +(define (vg:draw-rect drawing obj #!key (draw #t)) (let* ((cnv (vg:drawing-cnv drawing)) (pts (vg:drawing-apply-scale drawing (vg:obj-pts obj))) (llx (car pts)) (lly (cadr pts)) (ulx (caddr pts)) (uly (cadddr pts))) - (print "pts: " pts) - (canvas-rectangle! cnv llx ulx lly uly))) - -(define (vg:draw drawing) - (let ((insts (vg:drawing-insts drawing))) - (for-each - (lambda (inst) - (let* ((libname (vg:inst-libname inst)) + (if draw (canvas-rectangle! cnv llx ulx lly uly)) + pts)) ;; return extents + +(define (vg:draw drawing draw-mode . instnames) + (let ((insts (vg:drawing-insts drawing)) + (res '())) + (for-each + (lambda (instname) + (let* ((inst (hash-table-ref insts instname)) + (libname (vg:inst-libname inst)) (compname (vg:inst-compname inst)) (comp (vg:get-component drawing libname compname))) (print "comp: " comp) (for-each (lambda (obj) (print "obj: " (vg:obj-pts obj)) (let ((obj-xfrmd (vg:map-obj drawing inst obj))) (print "obj-xfrmd: " (vg:obj-pts obj-xfrmd)) - (vg:draw-obj drawing obj-xfrmd))) ;; + (set! res (cons (vg:draw-obj drawing obj-xfrmd draw: draw-mode) res)))) ;; (vg:comp-objs comp)))) - (hash-table-values insts)))) + (if (null? instnames) + (hash-table-keys insts) + instnames)) + res)) ;; (hash-table-values insts))))