root / trunk / web / dojo / dojox / drawing / tools / custom / Axes.js
History | View | Annotate | Download (9.43 KB)
| 1 | 9 | andrej.cim | /*
|
|---|---|---|---|
| 2 | Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
||
| 3 | Available via Academic Free License >= 2.1 OR the modified BSD license.
|
||
| 4 | see: http://dojotoolkit.org/license for details
|
||
| 5 | */
|
||
| 6 | |||
| 7 | |||
| 8 | if(!dojo._hasResource["dojox.drawing.tools.custom.Axes"]){ |
||
| 9 | dojo._hasResource["dojox.drawing.tools.custom.Axes"]=true; |
||
| 10 | dojo.provide("dojox.drawing.tools.custom.Axes");
|
||
| 11 | dojo.require("dojox.drawing.stencil.Path");
|
||
| 12 | dojox.drawing.tools.custom.Axes=dojox.drawing.util.oo.declare(dojox.drawing.stencil.Path,function(_1){
|
||
| 13 | this.closePath=false; |
||
| 14 | this.xArrow=new dojox.drawing.annotations.Arrow({stencil:this,idx1:0,idx2:1}); |
||
| 15 | this.yArrow=new dojox.drawing.annotations.Arrow({stencil:this,idx1:2,idx2:1}); |
||
| 16 | if(_1.data){
|
||
| 17 | this.style.zAxisEnabled=_1.data.cosphi==1?true:false; |
||
| 18 | this.setData(_1.data);
|
||
| 19 | } |
||
| 20 | if(this.style.zAxisEnabled){ |
||
| 21 | this.data.cosphi=1; |
||
| 22 | var _2={};
|
||
| 23 | dojo.mixin(_2,_1); |
||
| 24 | dojo.mixin(_2,{container:this.container.createGroup(),style:this.style,showAngle:false,label:null});
|
||
| 25 | if(_1.data&&(!_2.data.radius||!_2.data.angle)){
|
||
| 26 | _2.data.x2=_2.data.x4; |
||
| 27 | _2.data.y2=_2.data.y4; |
||
| 28 | } |
||
| 29 | _2.style.zAxis=true;
|
||
| 30 | this.zAxis=new dojox.drawing.tools.custom.Vector(_2); |
||
| 31 | this.zAxis.minimumSize=5; |
||
| 32 | this.connectMult([[this,"onChangeStyle",this.zAxis,"onChangeStyle"],[this,"select",this.zAxis,"select"],[this,"deselect",this.zAxis,"deselect"],[this,"onDelete",this.zAxis,"destroy"],[this,"onDrag",this,"zSet"],[this,"onTransform",this,"zSet"],[this.zAxis,"onBeforeRender",this,"zSet"],[this,"_onPostRender",this.zAxis,"render"]]); |
||
| 33 | } |
||
| 34 | if(this.points&&this.points.length){ |
||
| 35 | this.setPoints=this._postSetPoints; |
||
| 36 | this.render();
|
||
| 37 | _1.label&&this.setLabel(_1.label);
|
||
| 38 | _1.shadow&&this.addShadow(_1.shadow);
|
||
| 39 | } |
||
| 40 | },{draws:true,type:"dojox.drawing.tools.custom.Axes",minimumSize:30,showAngle:true,closePath:false,baseRender:false,zScale:0.5,zPoint:function(_3){
|
||
| 41 | _3.radius=this.util.length(_3);
|
||
| 42 | var pt=this.util.pointOnCircle(_3.start.x,_3.start.y,_3.radius*this.zScale,this.style.zAngle); |
||
| 43 | return {x:pt.x,y:pt.y,skip:true,noAnchor:true}; |
||
| 44 | },zSet:function(){ |
||
| 45 | if(!this.zAxis){ |
||
| 46 | return;
|
||
| 47 | } |
||
| 48 | var c=this.points[1]; |
||
| 49 | var z=this.points[3]; |
||
| 50 | var p=[{x:c.x,y:c.y},{x:z.x,y:z.y}]; |
||
| 51 | var _4=this.util.length({start:{x:c.x,y:c.y},x:z.x,y:z.y}); |
||
| 52 | _4>this.zAxis.minimumSize?this.zAxis.setPoints(p):false; |
||
| 53 | this.zAxis.cosphi=1; |
||
| 54 | },createLabels:function(){ |
||
| 55 | var _5={align:"middle",valign:"middle",util:this.util,annotation:true,container:this.container,mouse:this.mouse,stencil:this}; |
||
| 56 | this.labelX=new dojox.drawing.annotations.Label(dojo.mixin(_5,{labelPosition:this.setLabelX})); |
||
| 57 | this.labelY=new dojox.drawing.annotations.Label(dojo.mixin(_5,{labelPosition:this.setLabelY})); |
||
| 58 | if(this.style.zAxisEnabled){ |
||
| 59 | this.labelZ=new dojox.drawing.annotations.Label(dojo.mixin(_5,{labelPosition:this.setLabelZ})); |
||
| 60 | } |
||
| 61 | },setLabelX:function(){ |
||
| 62 | var ax=this.points[0]; |
||
| 63 | var c=this.points[1]; |
||
| 64 | var _6=40; |
||
| 65 | var _7=20; |
||
| 66 | var pt,px,py,_8;
|
||
| 67 | pt=this.util.lineSub(c.x,c.y,ax.x,ax.y,_6);
|
||
| 68 | px=pt.x+(pt.y-ax.y); |
||
| 69 | py=pt.y+(ax.x-pt.x); |
||
| 70 | _8=this.util.lineSub(pt.x,pt.y,px,py,(_6-_7));
|
||
| 71 | return {x:_8.x,y:_8.y,width:20}; |
||
| 72 | },setLabelY:function(){ |
||
| 73 | var c=this.points[1]; |
||
| 74 | var ay=this.points[2]; |
||
| 75 | var _9=40; |
||
| 76 | var _a=20; |
||
| 77 | var pt,px,py,_b;
|
||
| 78 | pt=this.util.lineSub(c.x,c.y,ay.x,ay.y,_9);
|
||
| 79 | px=pt.x+(ay.y-pt.y); |
||
| 80 | py=pt.y+(pt.x-ay.x); |
||
| 81 | _b=this.util.lineSub(pt.x,pt.y,px,py,(_9-_a));
|
||
| 82 | return {x:_b.x,y:_b.y,width:20}; |
||
| 83 | },setLabelZ:function(){ |
||
| 84 | var c=this.points[1]; |
||
| 85 | var z=this.points[3]; |
||
| 86 | var _c=40; |
||
| 87 | var _d=20; |
||
| 88 | var pt,px,py,_e;
|
||
| 89 | pt=this.util.lineSub(c.x,c.y,z.x,z.y,_c);
|
||
| 90 | px=pt.x+(pt.y-z.y); |
||
| 91 | py=pt.y+(z.x-pt.x); |
||
| 92 | _e=this.util.lineSub(pt.x,pt.y,px,py,(_c-_d));
|
||
| 93 | return {x:_e.x,y:_e.y,width:20}; |
||
| 94 | },setLabel:function(_f){ |
||
| 95 | if(this._labelsCreated){ |
||
| 96 | return;
|
||
| 97 | } |
||
| 98 | !this.labelX&&this.createLabels(); |
||
| 99 | var x="x"; |
||
| 100 | var y="y"; |
||
| 101 | var z="z"; |
||
| 102 | if(_f){
|
||
| 103 | if(this.labelZ){ |
||
| 104 | var _10=_f.match(/(.*?)(and|&)(.*?)(and|&)(.*)/i); |
||
| 105 | if(_10.length>4){ |
||
| 106 | x=_10[1].replace(/^\s+/,"").replace(/\s+$/,""); |
||
| 107 | y=_10[3].replace(/^\s+/,"").replace(/\s+$/,""); |
||
| 108 | z=_10[5].replace(/^\s+/,"").replace(/\s+$/,""); |
||
| 109 | } |
||
| 110 | }else{
|
||
| 111 | var _10=_f.match(/(.*?)(and|&)(.*)/i); |
||
| 112 | if(_10.length>2){ |
||
| 113 | x=_10[1].replace(/^\s+/,"").replace(/\s+$/,""); |
||
| 114 | y=_10[3].replace(/^\s+/,"").replace(/\s+$/,""); |
||
| 115 | } |
||
| 116 | } |
||
| 117 | } |
||
| 118 | this.labelX.setLabel(x);
|
||
| 119 | this.labelY.setLabel(y);
|
||
| 120 | if(this.labelZ){ |
||
| 121 | this.labelZ.setLabel(z);
|
||
| 122 | } |
||
| 123 | this._labelsCreated=true; |
||
| 124 | },getLabel:function(){ |
||
| 125 | if(!this.labelX){ |
||
| 126 | return null; |
||
| 127 | } |
||
| 128 | return {x:this.labelX.getText(),y:this.labelY.getText(),z:this.labelZ?this.labelZ.getText():null}; |
||
| 129 | },anchorPositionCheck:function(x,y,_11){ |
||
| 130 | var pm=this.container.getParent().getTransform(); |
||
| 131 | var am=_11.shape.getTransform();
|
||
| 132 | var p=this.points; |
||
| 133 | var o={x:am.dx+_11.org.x+pm.dx,y:am.dy+_11.org.y+pm.dy}; |
||
| 134 | var c={x:p[1].x+pm.dx,y:p[1].y+pm.dy}; |
||
| 135 | var ox=c.x-(c.y-o.y);
|
||
| 136 | var oy=c.y-(o.x-c.x);
|
||
| 137 | return {x:ox,y:oy}; |
||
| 138 | },onTransformBegin:function(_12){ |
||
| 139 | this._isBeingModified=true; |
||
| 140 | },onTransformEnd:function(_13){ |
||
| 141 | if(!_13){
|
||
| 142 | return;
|
||
| 143 | } |
||
| 144 | this._isBeingModified=false; |
||
| 145 | this._toggleSelected();
|
||
| 146 | var o=this.points[0]; |
||
| 147 | var c=this.points[1]; |
||
| 148 | var obj={start:{x:c.x,y:c.y},x:o.x,y:o.y}; |
||
| 149 | var pt=this.util.constrainAngle(obj,0,89); |
||
| 150 | var zpt=this.style.zAxisEnabled?this.zPoint(obj):null; |
||
| 151 | if(pt.x==o.x&&pt.y==o.y){
|
||
| 152 | pt=this.util.snapAngle(obj,this.angleSnap/180); |
||
| 153 | obj.x=pt.x; |
||
| 154 | obj.y=pt.y; |
||
| 155 | var ox=obj.start.x-(obj.start.y-obj.y);
|
||
| 156 | var oy=obj.start.y-(obj.x-obj.start.x);
|
||
| 157 | if(ox<0||oy<0){ |
||
| 158 | console.warn("AXES ERROR LESS THAN ZERO - ABORT");
|
||
| 159 | return;
|
||
| 160 | } |
||
| 161 | this.points=[{x:obj.x,y:obj.y},{x:obj.start.x,y:obj.start.y,noAnchor:true}]; |
||
| 162 | this.points.push({x:ox,y:oy,noAnchor:true}); |
||
| 163 | if(zpt){
|
||
| 164 | this.points.push(zpt);
|
||
| 165 | } |
||
| 166 | this.setPoints(this.points); |
||
| 167 | this.onModify(this); |
||
| 168 | return;
|
||
| 169 | } |
||
| 170 | this.points[0].x=pt.x; |
||
| 171 | this.points[0].y=pt.y; |
||
| 172 | o=this.points[0]; |
||
| 173 | var ox=c.x-(c.y-o.y);
|
||
| 174 | var oy=c.y-(o.x-c.x);
|
||
| 175 | this.points[2]={x:ox,y:oy,noAnchor:true}; |
||
| 176 | if(zpt){
|
||
| 177 | this.points.push(zpt);
|
||
| 178 | } |
||
| 179 | this.setPoints(this.points); |
||
| 180 | this.labelX.setLabel();
|
||
| 181 | this.labelY.setLabel();
|
||
| 182 | if(this.labelZ){ |
||
| 183 | this.labelZ.setLabel();
|
||
| 184 | } |
||
| 185 | this.onModify(this); |
||
| 186 | },getBounds:function(_14){ |
||
| 187 | var px=this.points[0],pc=this.points[1],py=this.points[2]; |
||
| 188 | if(this.style.zAxisEnabled){ |
||
| 189 | var pz=this.points[3]; |
||
| 190 | } |
||
| 191 | if(_14){
|
||
| 192 | var _15={x:pc.x,y:pc.y,x1:pc.x,y1:pc.y,x2:px.x,y2:px.y,x3:py.x,y3:py.y}; |
||
| 193 | if(this.style.zAxisEnabled){ |
||
| 194 | _15.x4=pz.x; |
||
| 195 | _15.y4=pz.y; |
||
| 196 | } |
||
| 197 | return _15;
|
||
| 198 | } |
||
| 199 | var x1=this.style.zAxisEnabled?(py.x<pz.x?py.x:pz.x):py.x; |
||
| 200 | y1=py.y<px.y?py.y:px.y,x2=px.x,y2=this.style.zAxisEnabled?pz.y:pc.y;
|
||
| 201 | return {x1:x1,y1:y1,x2:x2,y2:y2,x:x1,y:y1,w:x2-x1,h:y2-y1}; |
||
| 202 | },_postSetPoints:function(pts){ |
||
| 203 | this.points[0]=pts[0]; |
||
| 204 | if(this.pointsToData){ |
||
| 205 | this.data=this.pointsToData(); |
||
| 206 | } |
||
| 207 | },onTransform:function(_16){ |
||
| 208 | var o=this.points[0]; |
||
| 209 | var c=this.points[1]; |
||
| 210 | var ox=c.x-(c.y-o.y);
|
||
| 211 | var oy=c.y-(o.x-c.x);
|
||
| 212 | this.points[2]={x:ox,y:oy,noAnchor:true}; |
||
| 213 | if(this.style.zAxisEnabled){ |
||
| 214 | this.points[3]=this.zPoint({start:{x:c.x,y:c.y},x:o.x,y:o.y}); |
||
| 215 | } |
||
| 216 | this.setPoints(this.points); |
||
| 217 | if(!this._isBeingModified){ |
||
| 218 | this.onTransformBegin();
|
||
| 219 | } |
||
| 220 | this.render();
|
||
| 221 | },pointsToData:function(){ |
||
| 222 | var p=this.points; |
||
| 223 | var d={x1:p[1].x,y1:p[1].y,x2:p[0].x,y2:p[0].y,x3:p[2].x,y3:p[2].y}; |
||
| 224 | if(this.style.zAxisEnabled){ |
||
| 225 | d.x4=p[3].x;
|
||
| 226 | d.y4=p[3].y;
|
||
| 227 | d.cosphi=1;
|
||
| 228 | } |
||
| 229 | return d;
|
||
| 230 | },getRadius:function(){ |
||
| 231 | var p=this.points; |
||
| 232 | var _17={start:{x:p[1].x,y:p[1].y},x:p[0].x,y:p[0].y}; |
||
| 233 | return this.util.length(_17); |
||
| 234 | },dataToPoints:function(o){ |
||
| 235 | o=o||this.data;
|
||
| 236 | if(o.radius||o.angle){
|
||
| 237 | var pt=this.util.pointOnCircle(o.x,o.y,o.radius,o.angle),zpt; |
||
| 238 | var ox=o.x-(o.y-pt.y);
|
||
| 239 | var oy=o.y-(pt.x-o.x);
|
||
| 240 | if((o.cosphi&&o.cosphi==1)||this.style.zAxisEnabled){ |
||
| 241 | this.style.zAxisEnabled=true; |
||
| 242 | zpt=this.util.pointOnCircle(o.x,o.y,o.radius*this.zScale,this.style.zAngle); |
||
| 243 | } |
||
| 244 | this.data=o={x1:o.x,y1:o.y,x2:pt.x,y2:pt.y,x3:ox,y3:oy}; |
||
| 245 | if(this.style.zAxisEnabled){ |
||
| 246 | this.data.x4=o.x4=zpt.x;
|
||
| 247 | this.data.y4=o.y4=zpt.y;
|
||
| 248 | this.data.cosphi=1; |
||
| 249 | } |
||
| 250 | } |
||
| 251 | this.points=[{x:o.x2,y:o.y2},{x:o.x1,y:o.y1,noAnchor:true},{x:o.x3,y:o.y3,noAnchor:true}]; |
||
| 252 | if(this.style.zAxisEnabled){ |
||
| 253 | this.points.push({x:o.x4,y:o.y4,skip:true,noAnchor:true}); |
||
| 254 | } |
||
| 255 | return this.points; |
||
| 256 | },onDrag:function(obj){ |
||
| 257 | var pt=this.util.constrainAngle(obj,0,89); |
||
| 258 | obj.x=pt.x; |
||
| 259 | obj.y=pt.y; |
||
| 260 | var ox=obj.start.x-(obj.start.y-obj.y);
|
||
| 261 | var oy=obj.start.y-(obj.x-obj.start.x);
|
||
| 262 | if(ox<0||oy<0){ |
||
| 263 | return;
|
||
| 264 | } |
||
| 265 | this.points=[{x:obj.x,y:obj.y},{x:obj.start.x,y:obj.start.y,noAnchor:true}]; |
||
| 266 | this.points.push({x:ox,y:oy,noAnchor:true}); |
||
| 267 | if(this.style.zAxisEnabled){ |
||
| 268 | var zpt=this.zPoint(obj); |
||
| 269 | this.points.push(zpt);
|
||
| 270 | } |
||
| 271 | this.render();
|
||
| 272 | },onUp:function(obj){ |
||
| 273 | if(!this._downOnCanvas){ |
||
| 274 | return;
|
||
| 275 | } |
||
| 276 | this._downOnCanvas=false; |
||
| 277 | var p=this.points; |
||
| 278 | if(!p.length){
|
||
| 279 | var s=obj.start,d=100; |
||
| 280 | this.points=[{x:s.x+d,y:s.y+d},{x:s.x,y:s.y+d,noAnchor:true},{x:s.x,y:s.y,noAnchor:true}]; |
||
| 281 | if(this.style.zAxisEnabled){ |
||
| 282 | var zpt=this.zPoint({start:{x:s.x,y:s.y+d},x:s.x+d,y:s.y+d}); |
||
| 283 | this.points.push(zpt);
|
||
| 284 | } |
||
| 285 | this.setPoints=this._postSetPoints; |
||
| 286 | this.pointsToData();
|
||
| 287 | this.render();
|
||
| 288 | this.onRender(this); |
||
| 289 | return;
|
||
| 290 | } |
||
| 291 | var len=this.util.distance(p[1].x,p[1].y,p[0].x,p[0].y); |
||
| 292 | if(!p||!p.length){
|
||
| 293 | return;
|
||
| 294 | }else{
|
||
| 295 | if(len<this.minimumSize){ |
||
| 296 | this.remove(this.shape,this.hit); |
||
| 297 | this.xArrow.remove(this.xArrow.shape,this.xArrow.hit); |
||
| 298 | this.yArrow.remove(this.yArrow.shape,this.yArrow.hit); |
||
| 299 | if(this.zArrow){ |
||
| 300 | this.zArrow.remove(this.zArrow.shape,this.zArrow.hit); |
||
| 301 | } |
||
| 302 | return;
|
||
| 303 | } |
||
| 304 | } |
||
| 305 | var o=p[0]; |
||
| 306 | var c=p[1]; |
||
| 307 | obj={start:{x:c.x,y:c.y},x:o.x,y:o.y};
|
||
| 308 | var pt=this.util.snapAngle(obj,this.angleSnap/180); |
||
| 309 | obj.x=pt.x; |
||
| 310 | obj.y=pt.y; |
||
| 311 | var ox=obj.start.x-(obj.start.y-obj.y);
|
||
| 312 | var oy=obj.start.y-(obj.x-obj.start.x);
|
||
| 313 | if(ox<0||oy<0){ |
||
| 314 | return;
|
||
| 315 | } |
||
| 316 | this.points=[{x:obj.x,y:obj.y},{x:obj.start.x,y:obj.start.y,noAnchor:true}]; |
||
| 317 | this.points.push({x:ox,y:oy,noAnchor:true}); |
||
| 318 | if(this.style.zAxisEnabled){ |
||
| 319 | this.points.push(this.zPoint(obj)); |
||
| 320 | } |
||
| 321 | this.onRender(this); |
||
| 322 | this.setPoints=this._postSetPoints; |
||
| 323 | }}); |
||
| 324 | dojox.drawing.tools.custom.Axes.setup={name:"dojox.drawing.tools.custom.Axes",tooltip:"Axes Tool",iconClass:"iconAxes"};
|
||
| 325 | dojox.drawing.register(dojox.drawing.tools.custom.Axes.setup,"tool");
|
||
| 326 | } |