From 2266dadcba17f3ae90b50a75690b562d0e2bc270 Mon Sep 17 00:00:00 2001 From: Branislav Stojkovic Date: Sun, 13 Jan 2019 18:24:04 +0100 Subject: [PATCH] Added optional arrow to the "Line" component together with configurable thickness --- .../src/org/diylc/core/measures/SizeUnit.java | 4 +- diylc/diylc-library/lib/diylc-core.jar | Bin 251309 -> 251345 bytes .../diylc/components/connectivity/Line.java | 157 +++++++++++++++--- diylc/diylc-swing/lib/diylc-core.jar | Bin 251309 -> 251345 bytes diylc/diylc-swing/library/main.jar | Bin 506706 -> 508308 bytes diylc/diylc-swing/update.xml | 16 ++ 6 files changed, 151 insertions(+), 26 deletions(-) diff --git a/diylc/diylc-core/src/org/diylc/core/measures/SizeUnit.java b/diylc/diylc-core/src/org/diylc/core/measures/SizeUnit.java index 9d094d9b..b9475a71 100644 --- a/diylc/diylc-core/src/org/diylc/core/measures/SizeUnit.java +++ b/diylc/diylc-core/src/org/diylc/core/measures/SizeUnit.java @@ -20,10 +20,12 @@ */ package org.diylc.core.measures; + +import org.diylc.utils.Constants; public enum SizeUnit implements Unit { - mm(1d), cm(10d), m(1e4d), in(25.4d), ft(25.4d * 12), yd(9144d); + px(25.4d / Constants.PIXELS_PER_INCH), mm(1d), cm(10d), m(1e4d), in(25.4d), ft(25.4d * 12), yd(9144d); double factor; diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 6f43ecf657a50b9346bd83c07d6a6e3c46fd5af9..b809eef03dac28372aec9478a45b63978a021471 100644 GIT binary patch delta 8019 zcmZWu30#fY`|mxcRcX;}A*oAf5!t56lC`l%jHMZoWzZCpZS0gtg!WD%l|50nMOTZZ zQj?GtWQ@u3A7+fDWXu?(|MQ%4e~pXJ=Xjp;{XW}S-t(UKb~@dtCf&$j$^@#}PD4Xi zLnAjj%D{o-L`S)Pfd6A$C0i8UQV)_F9TO}KK%tbJQ9PFVqUcBlqnJUQP=pXy6v0yG zm^}{+)dI&f6YeLcy)mYj5W!T$q=V4!6?I3^U(*G}cbdIG$cJ5pn z_xK)V%*LKK40EHMJ$;r8*YJ=uG`=D+^L$LB9kpUodg|qDvG?WH4;(sj`QFi%dv)pc z7L#;xzO0S%QU6*_=MS{tvi1v4F1vpDFPGMXqIeOCA<0~N4GZ8!UKrU-c=nvR+Rd|w zhQ@Bqm{em6mKaY>bDnt2=f;!9F5ohI{BxX_oYW~jxbx*{wp>1)A!Z=S`%9jz{+o^5 ze!7pjA=)qXH{$)xO9Q!mQ(&qA;xU`FIlh037nd)BKbRu^BJOYAf1F^>XZpi|p1j{P zIg!UNO&P%B{Cn7v_f3yFaenx5%B4q|A(zwB^H9dL&uBpLJfjw)7iWrWvTQNBwYfX= z5tlCd@Tk6}_1xR7T$@K9@l!|MpM6rSD4O!?@RUyri1FgN=n`gKcLYT(RZx%V`;d9!CtHD;$0--cUR)V2%l{`8l| z(%23CUR;^AsA=e?^6LE=U%z_1eqLe1z?`^~{_(Sq=XtO8KjyRcMMk{-YfX>%@tWSG z++usb5gDF}b5*vF4g{Q=di0!|cK#OUxH(D6j&HjpAI;8vv_Het~(?iiX^$H%Gc9S6^SXDtmaiU+CYaj=id$_#4OzBl`?qU3nzr z40UL{Wl>S1!<`E$2l-g3~y%%~|c_4nMZ zj^&C&^GV*WD`!h)#yD=#b~!OWETnwI@4kUyD=o`yN4EG+N{w$>R|nl z%nc1q8}GgQ*ANTVD4|L$F=$%w&^_T*nXgBR4F$v)%Dc{_t?$Yg^A~9uCuOa9q1z=J9n?!u{tf zWY$~PwA<{p^U#E*WyO6w>{G|+o-_GZ|BG=Sw7(u~x+LZ2Dov{;XZla2eFt}Qt@c|S zt6lJX;UBLA9v^i@jDXMcb8Gje(j-1>irEq0pkTg*n3rq}^cGC7Z7}KqtMjWLY8Y#?VGO<*S z-6bixv$R)gL7%)RX#xi(#i|(X1j$kO$_H=0JO+G63g7AbC2wx3I4H$&Wy~STLKE}( z9+P%+e# zIu7P4k}wl1V!_-CXglTbI_WU?d~{R#lPfj1Rm*q(7s;JRx4kE==gNVHk~?3myUo%l zJ*-mxUV@Vslt-;n6j#<#a)B#uI>eMKp6$piuAFF3rg5dkm~7(8Mj2Vim4_BY&J`^y z;viu_m(HXQN9NfOU9R|dB`dgcuR9sf6(dJ)Z01VM zAd=6O-R`7`E1O4>!CWcyAelUAz!>7oC!uN_StWLuR++iwcDQ$JlfPaMm zJ7`ZPX*@*MRH8tI!Af>xEu}EEku%5=&b{>}pDTJzTlCl(_Q5|1Kkj_zF|%1rklJ7%eAB_>xm*tiphx zG_D~OuRqGaHj()pnH5Zip)uRHmDC^;5JH0RQlWeiPvks|Ndj@?%FunphAVRtNgY29 z`X`YJjO#RS+eQGbx+o z;}uA$TTB!jDJUV8R)~Z)kPjwYX(G*>THj1`I`Gr#NQD$aU?WGdWCgKOrfE_eo}f~j zD!CG(N3F%{+&eU>aV(hTX|f1CYNxE#r{3Je*^u&kin73%QeM>sQ&p^jw`(_ z=|AHT={cW{#4DN7e;L*0#w(Xocq9O6Tt&<9)~C!{Pk-iKQJd(Gcxh4UZKYGV@@*)c zi$h>VJE$A(k$-m3;V9k0s0&K}F!}}Z?z?Dbb|H+~W9La29g5O^Cmn&(e-E;=Zmfds?N}oMKp4&rbV&8l(oq}?SN*3&;)3I+7A>#T(&`H=o6+tJWd>bJu z9}_9!CP&g`h#N)GB`DWL(Wxk}siZub&cgnNXp!eywBY42BL31CQTMqR5zj1^jz#;q zv2+E>x>))(N{2Y%zadW4aXC)-b&MC%FJAD4@uEImCi2W?!ati)ABd7{Q|F6NtXk3A>#1|=mM1QRMIzz z`eXlEl4{%s>16D$P|4DRqJGn4Ar~Zzy7H3gG_=!Cp?HO4^u9heU5q(0opvVK#?0#!?Zhh5sW}#SAHi8B2+EnwDcZqS?NS7v0}dMh z{W}tDWrn8sh0S)I0@o@FW|B!wSs`}dsrwnF!cGO+NqUA;CP;Aj;kUi61{lasV?ujj zF!eMwwZ)5t(bQD$W;m>#L$muYpT?2k04HG@kwLZD!PB%OX357ODZM{pnpBK_1~5PM z{fN2US2AQ%GAQ2W*c_y52ei@F2xcJoz*T_vGH3@I^@|%^-qcEZ&x|wSI04T=nc(T= zj-E2+<1V#l>oTbUAJL&I6N`oLzMBipQq5g|varw3q#ZEGH4JiessLL7^}9A+Od`_u^9T<5Ja(5FhjCwM_xppb5!X!5MVkq^?~~=7p7s^)C`MAM*qfD0<6xa zmI(fdV8|L3xL(p@b~#jr%%B`#%GS3rCTwGlC}bBhC7aq9J$7r8WZX-A=Q?{nyz@xU zOj|=E8=Cs?76u95AA(?b*1008Q!Yf!4sBy}dIv6B{AtX#8#RnpeU}YoQMqE56=I-{ zdqtpUxwH$8#^4NqmQey6dWLpIa2|r+#R@Pm76!lnj3_1znJx)}xpPKL;7bI@?-yX# zJTXmIO98AnC_ukFI3^%)a2|kj53yh+Y=WFT)qa_vwCg@ZEJzKNT)0{#-)ta%BkpF!)aR;fh+ z%Q{OPaXx;udPsi%Cyf(k^+boBi4 zo>q!f zRpxh)X=xRVei60c)w=4JIfX!_o1xjN&21zbQAGRj!YU>XPWu&3z1yFid|o;%>pZ+{ zX6q0=cB)9sSV0kFTGUQ3PmAFC3x%~i2jIo_0vwDT0KHL~nF!F(1=^PzRR@Ip z$Unwloazs52=lr?UAR%NqMpt&Fff9qzP0{gDHp`nx^e-gbd&>2y#UX_WCx=C>FeI) zA{aFH5(Xc75gj)EqFA?C$W*upW*2r~iB6z=)L(#iE~<_x1pQnE*sWL`Q*OloJ{csY z>w6U#gy0c(0cN@reO6Q~vQ;7zKT2#;w#G2D38=n)>1Wc$~1mT_UP|fk9?Z5+Hm>cf!FA#*?w)fLco>K)X$&GQ-x_xDYZaBN+H9x8Ong40*YtE9@Za&vudCJYiaYiCS}0vVWkZ0p!wwrv6s+ zUm#3-mWdN=SQ(^JED~T~nHa=Q1jl{f25PYjWvb)U%xmQF_ppWk`s^{e&0d!AKi)8T zIk=nrz=oBJ4?I8UQ+Xg^odQWumRSyigsbW~wCcH>O{s*duW<$3B!?|0rp)jsL3jQM z=<-z`(G9DJ3G-Lc>yXx2`w?xk_9O4xNE>W!qr2MR6}sqtPW^Kz-W#^o7i!O8AoHrA z9#~dF1$bs{MNd1H5<=j&^$OS;z`R3dTSyxtW7c(|*14B~(Pqf>WZfCDWP2+GQ;Cd2 zf?$j)shrnge2C5d3GzRKHbkwC>1=YP`1(6g37$VDifj#)@S6gZ(2C%MB$j#|Ua{Uu z#7OPY27@VAz`!h77&Kj_9a#Joiod9^bYvE%e#E>4hJRTs%Rgd&6{aK&c8jxGIcpAo zWIyq$h&1miMB01wBPQc0oFN%k#gL1Tb~@2Ucjq}gpOy#AhK<`r>(d;KC)-RrFr##$ zqjr?zvTavh#}1XUet;tiH?s z$ZA#L$unoLnmE!as-SWC>tV;0s2 zn5~3(P4E=jtHpfCGONX>;2+#wPq+uxP(9Y8Ml9gq8VFpV-^O&t680kKVb})hF&{&! z^XdM2fL67}A6ePd!pVTEG&9FxP8p1I8SEnU_jEn;s-*+?Hs~E>tZfH{7k*}R&+Mb1 zWe^mLx>F13zOrm%beTn+m>j1%V1~^XjBg$7CdV4|23Fp<3gPAOHK6|P2w6tsSHt@- zav9bCbWk-AOA2Q%>S!NKYI6gQE1lJ7Z^L|Uhz0fsP^w~KH{gf^o3q$WV>fTmf!H;; f3DwBAGRK<~|N6~*pf9at>u*wL?b;nMR*nA$a^)r* delta 8155 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 bJ_j?mOSBt~gJCR%ly=KNbNJI92P!0wa diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/Line.java b/diylc/diylc-library/src/org/diylc/components/connectivity/Line.java index 7765d3b6..31cca983 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/Line.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/Line.java @@ -21,38 +21,48 @@ */ package org.diylc.components.connectivity; -import java.awt.Color; -import java.awt.Graphics2D; -import java.awt.Shape; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Polygon; +import java.awt.Shape; import java.awt.Stroke; +import java.awt.geom.AffineTransform; -import org.diylc.common.Display; +import org.diylc.common.Display; import org.diylc.common.LineStyle; -import org.diylc.common.ObjectCache; -import org.diylc.common.SimpleComponentTransformer; -import org.diylc.components.AbstractLeadedComponent; -import org.diylc.core.ComponentState; -import org.diylc.core.CreationMethod; -import org.diylc.core.IDIYComponent; -import org.diylc.core.IDrawingObserver; -import org.diylc.core.Project; -import org.diylc.core.annotations.BomPolicy; -import org.diylc.core.annotations.ComponentDescriptor; -import org.diylc.core.annotations.EditableProperty; -import org.diylc.core.measures.Size; +import org.diylc.common.ObjectCache; +import org.diylc.common.SimpleComponentTransformer; +import org.diylc.components.AbstractLeadedComponent; +import org.diylc.core.ComponentState; +import org.diylc.core.CreationMethod; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IDrawingObserver; +import org.diylc.core.Project; +import org.diylc.core.annotations.BomPolicy; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; @ComponentDescriptor(name = "Line", author = "Branislav Stojkovic", category = "Shapes", - creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "LN", description = "", + creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "LN", description = "Line with optional arrows", zOrder = IDIYComponent.COMPONENT, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, transformer = SimpleComponentTransformer.class) public class Line extends AbstractLeadedComponent { private static final long serialVersionUID = 1L; - public static Color COLOR = Color.black; + public static Color COLOR = Color.black; private Color color = COLOR; - protected LineStyle style = LineStyle.SOLID; + protected LineStyle style = LineStyle.SOLID; + private Size thickness = new Size(1d, SizeUnit.px); + private Size arrowSize = new Size(5d, SizeUnit.px); + private Polygon arrow = null; + private AffineTransform arrowTx = new AffineTransform(); + private boolean arrowStart = false; + private boolean arrowEnd = false; @Override public void drawIcon(Graphics2D g2d, int width, int height) { @@ -64,11 +74,11 @@ public class Line extends AbstractLeadedComponent { @Override public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, IDrawingObserver drawingObserver) { - float thickness = 1f; + float thickness = (float) getThickness().convertToPixels(); Stroke stroke = null; switch (getStyle()) { case SOLID: - stroke = ObjectCache.getInstance().fetchBasicStroke(thickness); + stroke = ObjectCache.getInstance().fetchZoomableStroke(thickness); break; case DASHED: stroke = ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness * 2, thickness * 4}, thickness * 4); @@ -78,14 +88,87 @@ public class Line extends AbstractLeadedComponent { break; } g2d.setStroke(stroke); - g2d.setColor(color); - g2d.drawLine(getControlPoint(0).x, getControlPoint(0).y, getControlPoint(1).x, getControlPoint(1).y); + g2d.setColor(componentState == ComponentState.SELECTED ? SELECTION_COLOR : color); + + Point startPoint = new Point(getControlPoint(0)); + Point endPoint = new Point(getControlPoint(1)); + + if (arrowStart) { + arrowTx.setToIdentity(); + double angle = Math.atan2(getControlPoint(1).y - getControlPoint(0).y, getControlPoint(1).x - getControlPoint(0).x); + arrowTx.translate(getControlPoint(0).x, getControlPoint(0).y); + arrowTx.rotate((angle + Math.PI / 2d)); + AffineTransform oldTx = g2d.getTransform(); + g2d.transform(arrowTx); + g2d.fill(getArrow()); + g2d.setTransform(oldTx); + + double distance = distance(startPoint, endPoint); + interpolate(startPoint, endPoint, getArrowSize().convertToPixels() * 0.9 / distance, startPoint); + } + if (arrowEnd) { + arrowTx.setToIdentity(); + double angle = Math.atan2(getControlPoint(1).y - getControlPoint(0).y, getControlPoint(1).x - getControlPoint(0).x); + arrowTx.translate(getControlPoint(1).x, getControlPoint(1).y); + arrowTx.rotate((angle - Math.PI / 2d)); + AffineTransform oldTx = g2d.getTransform(); + g2d.transform(arrowTx); + g2d.fill(getArrow()); + g2d.setTransform(oldTx); + + double distance = distance(startPoint, endPoint); + interpolate(endPoint, startPoint, getArrowSize().convertToPixels() * 0.9 / distance, endPoint); + } + + g2d.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y); + } + + private void interpolate(Point p1, Point p2, double t, Point p) { + p.setLocation((int)Math.round(p1.x * (1-t) + p2.x * t), (int)Math.round(p1.y * (1-t) + p2.y * t)); + } + + private double distance(Point p1, Point p2) { + return Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); } @Override public Color getLeadColorForPainting(ComponentState componentState) { return componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : color; + } + + public Polygon getArrow() { + if (arrow == null) { + arrow = new Polygon(); + int t = (int) getArrowSize().convertToPixels(); + arrow.addPoint(0, 0); + arrow.addPoint(-t, -t * 2); + arrow.addPoint(t, -t * 2); + } + return arrow; + } + + @EditableProperty + public Size getThickness() { + if (thickness == null) + thickness = new Size(1d, SizeUnit.px); + return thickness; + } + + public void setThickness(Size thickness) { + this.thickness = thickness; + } + + @EditableProperty + public Size getArrowSize() { + if (arrowSize == null) + arrowSize = thickness = new Size(1d, SizeUnit.px); + return arrowSize; + } + + public void setArrowSize(Size arrowSize) { + this.arrowSize = arrowSize; + arrow = null; } @Override @@ -111,8 +194,26 @@ public class Line extends AbstractLeadedComponent { public void setStyle(LineStyle style) { this.style = style; - } - + } + + @EditableProperty(name = "Start Arrow") + public boolean getArrowStart() { + return arrowStart; + } + + public void setArrowStart(boolean arrowStart) { + this.arrowStart = arrowStart; + } + + @EditableProperty(name = "End Arrow") + public boolean getArrowEnd() { + return arrowEnd; + } + + public void setArrowEnd(boolean arrowEnd) { + this.arrowEnd = arrowEnd; + } + public Color getBodyColor() { return super.getBodyColor(); } @@ -176,5 +277,11 @@ public class Line extends AbstractLeadedComponent { @Override public Display getDisplay() { return super.getDisplay(); + } + + @Deprecated + @Override + public org.diylc.components.AbstractLeadedComponent.LabelOriantation getLabelOriantation() { + return super.getLabelOriantation(); } } diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 6f43ecf657a50b9346bd83c07d6a6e3c46fd5af9..b809eef03dac28372aec9478a45b63978a021471 100644 GIT binary patch delta 8019 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 delta 8155 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 bJ_j?mOSBt~gJCR%ly=KNbNJI92P!0wa diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index c9fb5a4ec3c2d80ece364205ade774337d2cc1d8..f17986d55d7c8f6da78b2fd68899873c4aa24a6a 100644 GIT binary patch delta 13195 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 LSz&=N<0$_J3Zslt diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index 3fe7c6a9..4ec68e6c 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -2196,6 +2196,22 @@ https://github.com/bancika/diy-layout-creator/releases + + + + 3 + 49 + 0 + + 2018-12-26 00:00:00.000 CET + + + + NEW_FEATURES + Added optional arrow to the "Line" component together with configurable thickness + + + https://github.com/bancika/diy-layout-creator/releases