Index: vg-test.scm ================================================================== --- vg-test.scm +++ vg-test.scm @@ -11,14 +11,16 @@ (define d1 (vg:drawing-new)) (define l1 (vg:lib-new)) (define c1 (vg:comp-new)) (define c2 (vg:comp-new)) +(define bt1 (vg:make-rect 10 40 20 50 text: "A long piece of text" font: "Helvetica, -10")) + (let ((r1 (vg:make-rect 20 20 30 30 text: "r1" font: "Helvetica, -20")) (r2 (vg:make-rect 30 30 60 60 text: "r2" font: "Helvetica, -10")) (t1 (vg:make-text 60 60 "The middle" font: "Helvetica, -10"))) - (vg:add-objs-to-comp c1 r1 r2 t1)) + (vg:add-objs-to-comp c1 r1 r2 t1 bt1)) ;; 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) @@ -39,10 +41,14 @@ ;; get extents of c1 and put a rectange around it ;; (define xtnts (apply vg:grow-rect 10 10 (vg:components-get-extents d1 c1))) (vg:add-objs-to-comp c1 (apply vg:make-rect xtnts)) +(define bt1xt (vg:obj-get-extents d1 bt1)) +(print "bt1xt: " bt1xt) +(vg:add-objs-to-comp c1 (apply vg:make-rect bt1xt)) + ;; 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) Index: vg.scm ================================================================== --- vg.scm +++ vg.scm @@ -17,11 +17,11 @@ (import canvas-draw-iup) ;; structs ;; (defstruct vg:lib comps) (defstruct vg:comp objs name file) -(defstruct vg:obj type pts fill-color text line-color call-back angle font attrib) +(defstruct vg:obj type pts fill-color text line-color call-back angle font attrib extents) (defstruct vg:inst libname compname theta xoff yoff scalex scaley mirrx mirry call-back cache) (defstruct vg:drawing libs insts scalex scaley xoff yoff cnv cache) ;; libs: hash of name->lib, insts: hash of instname->inst ;; inits ;; @@ -100,11 +100,11 @@ ;; (vg:drawing-apply-scale drawing lstxy))) ;; make a rectangle obj ;; (define (vg:make-rect x1 y1 x2 y2 #!key (line-color #f)(fill-color #f)(text #f)(font #f)) - (make-vg:obj type: 'r pts: (list x1 y1 x2 y2) text: text font: font line-color: line-color fill-color: fill-color)) + (make-vg:obj type: 'r pts: (list x1 y1 x2 y2) text: text font: font line-color: line-color fill-color: fill-color extents: #f)) ;; make a text obj ;; (define (vg:make-text x1 y1 text #!key (line-color #f)(fill-color #f) (angle #f)(scale-with-zoom #f)(font #f) @@ -330,11 +330,13 @@ (llx (car pts)) (lly (cadr pts)) (ulx (caddr pts)) (uly (cadddr pts)) (w (- ulx llx)) - (h (- uly lly))) + (h (- uly lly)) + (text-xmax #f) + (text-ymax #f)) (if draw (let ((prev-background-color (canvas-background cnv)) (prev-foreground-color (canvas-foreground cnv))) (if fill-color (begin @@ -349,19 +351,32 @@ (if text (let* ((prev-font (canvas-font cnv)) (font-changed (and font (not (equal? font prev-font))))) (if font-changed (canvas-font-set! cnv font)) (canvas-text! cnv (+ 2 llx)(+ 2 lly) text) + (let-values (((xmax ymax)(canvas-text-size cnv text))) + (set! text-xmax xmax)(set! text-ymax ymax)) (if font-changed (canvas-font-set! cnv prev-font)))))) - (if (not text) - pts - (if cnv - (let-values (((xmax ymax)(canvas-text-size cnv text))) - (list llx lly - (max ulx (+ llx xmax)) - (max uly (+ lly ymax)))) - pts)))) ;; return extents + (print "text-xmax: " text-xmax " text-ymax: " text-ymax) + (if (vg:obj-extents obj) + (vg:obj-extents obj) + (if (not text) + pts + (if (and text-xmax text-ymax) + (let ((xt (list llx lly + (max ulx (+ llx text-xmax)) + (max uly (+ lly text-ymax))))) + (vg:obj-extents-set! obj xt) + xt) + (if cnv + (let-values (((xmax ymax)(canvas-text-size cnv text))) + (let ((xt (list llx lly + (max ulx (+ llx xmax)) + (max uly (+ lly ymax))))) + (vg:obj-extents-set! obj xt) + xt)) + pts)))))) ;; return extents ;; given a rect obj draw it on the canvas applying first the drawing ;; scale and offset ;; (define (vg:draw-text drawing obj #!key (draw #t))