![使用 MetaUML 绘制自定义形状](https://linux22.com/image/278104/%E4%BD%BF%E7%94%A8%20MetaUML%20%E7%BB%98%E5%88%B6%E8%87%AA%E5%AE%9A%E4%B9%89%E5%BD%A2%E7%8A%B6.png)
如何绘制这样的图像:
我使用 MetaUML 包来绘制 Uml。
它可以用来绘制这幅图像吗?我想保持图像样式统一,不想只为一幅图像使用其他绘图包。
我可以像这样绘制它:
但是我怎样才能去掉组件图标?以及如何使框具有相同的尺寸?
这是我使用的代码
input metauml;
beginfig(1);
Class.A("Entity")()();
A.info.iAttributeStack.top := 0;
A.info.iAttributeStack.bottom := 0;
A.info.iMethodStack.top := 0;
A.info.iMethodStack.bottom := 0;
Class.B("Render")()();
B.info.iAttributeStack.top := 0;
B.info.iAttributeStack.bottom := 0;
B.info.iMethodStack.top := 0;
B.info.iMethodStack.bottom := 0;
Class.C("Collectable")()();
C.info.iAttributeStack.top := 0;
C.info.iAttributeStack.bottom := 0;
C.info.iMethodStack.top := 0;
C.info.iMethodStack.bottom := 0;
Component.BigC("Spoon")(A, B, C);
leftToRight(10)(A, B, C);
drawObject(BigC);
endfig;
end
编辑Package
我可以通过使用而不是来 摆脱组件符号Component
,但结果看起来与原始图像有很大不同
答案1
MetaUML 不提供任何简单的方法来控制类的宽度,但您可以使用内置的“ClassName”函数使它们看起来接近您想要的。并且您可以通过重新定义绘制它的宏来摆脱组件中的构造型,使其不执行任何操作。像这样:
prologues:=3;
outputtemplate:="uml%c.eps";
input metauml;
vardef drawComponentVisualStereotype(text ne)= relax enddef;
beginfig(1);
ClassName.A("Entity");
ClassName.B("Render");
ClassName.C("Collectable");
Component.BigC("Spoon")(A, B, C);
leftToRight(10)(A, B, C);
drawObject(BigC);
endfig;
结果是:
如果您只想抑制这一个图中的视觉刻板印象,那么请将重新定义移到beginfig
/endfig
范围内。
如果您尚未使用 MetaUML,您可以考虑使用boxes.mp
Metapost 附带的旧版标准。以下是您可以使用它做什么的示例(旨在继续上述文件)。
input boxes;
verbatimtex \font\sf=phvr8r\sf etex
beginfig(2);
boxit.bA(btex \strut Entity etex);
boxit.bB(btex \strut Render etex);
boxit.bC(btex \strut Collectable etex);
boxit.bS(btex \vrule width 0pt depth 40pt Spoon etex);
% make the class boxes the same size
forsuffixes $=bA,bB,bC:$.ne-$.sw = (60,30); endfor
bA.c = bB.c + 80 left;
bC.c = bB.c + 80 right;
bS.c = bB.n;
bS.sw = bA.sw - (10,10);
forsuffixes $=bA,bB,bC: fill bpath.$ withcolor .88white; endfor
drawboxed(bA,bB,bC,bS);
endfig;
end.
结果如下:
请注意,boxit
尽量使文本内容水平和垂直居中,因此偏移文本的一种方法是使用向下粘贴的隐形规则,就像我在“Spoon”框中所做的那样。