什么是IllegalArgumentException: kabeja中负宽度的原因?

3

请问有人可以解释使用Kabeja包时为什么会抛出IllegalArgumentException: negative width异常吗?

这是我得到的错误堆栈:

    java.lang.IllegalArgumentException: negative width
    at java.awt.BasicStroke.<init>(BasicStroke.java:181)
    at org.apache.batik.bridge.PaintServer.convertStroke(Unknown Source)
    at org.apache.batik.bridge.PaintServer.convertStrokePainter(Unknown Source)
    at org.apache.batik.bridge.SVGLineElementBridge.createFillStrokePainter(Unknown Source)
    at org.apache.batik.bridge.SVGDecoratedShapeElementBridge.createShapePainter(Unknown Source)
    at org.apache.batik.bridge.SVGShapeElementBridge.buildGraphicsNode(Unknown Source)
    at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(Unknown Source)
    at org.apache.batik.bridge.GVTBuilder.buildComposite(Unknown Source)
    at org.apache.batik.bridge.GVTBuilder.build(Unknown Source)
    at org.apache.batik.bridge.SVGUseElementBridge.buildCompositeGraphicsNode(Unknown Source)
    at org.apache.batik.bridge.SVGUseElementBridge.createGraphicsNode(Unknown Source)
    at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(Unknown Source)
    at org.apache.batik.bridge.GVTBuilder.buildComposite(Unknown Source)
    at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(Unknown Source)
    at org.apache.batik.bridge.GVTBuilder.buildComposite(Unknown Source)
    at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(Unknown Source)
    at org.apache.batik.bridge.GVTBuilder.buildComposite(Unknown Source)
    at org.apache.batik.bridge.GVTBuilder.build(Unknown Source)
    at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(Unknown Source)
    at org.apache.batik.transcoder.image.ImageTranscoder.transcode(Unknown Source)
    at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(Unknown Source)
    at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(Unknown Source)
    at org.kabeja.batik.tools.AbstractSAXSerializer.transcode(AbstractSAXSerializer.java:214)
    at org.kabeja.batik.tools.AbstractSAXSerializer.endDocument(AbstractSAXSerializer.java:156)
    at org.kabeja.svg.SVGGenerator.generateSAX(SVGGenerator.java:361)
    at org.kabeja.svg.SVGGenerator.generate(SVGGenerator.java:88)
    at org.kabeja.xml.AbstractSAXGenerator.generate(AbstractSAXGenerator.java:37)
    at BasicFunc.DXFFileLoad.parseFile(DXFFileLoad.java:54)
    at desktopapplication3.Foundation_details.jButton1ActionPerformed(Foundation_details.java:450)
    at desktopapplication3.Foundation_details.access$200(Foundation_details.java:12)
    at desktopapplication3.Foundation_details$3.actionPerformed(Foundation_details.java:147)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6263)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:6028)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4630)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2475)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

请问有人能解释一下这个异常的原因吗?


2
根据您的看法,负宽度的预期行为是什么? - Vikdor
我正在尝试从DXF文件生成SVG,我已经将SVG文件生成为一组DXF文件,但不幸的是,有一个DXF文件出现了异常。但它与其他文件并没有太大的区别。 - LkDev
3个回答

1

从堆栈跟踪来看,似乎在尝试使用负宽度绘制形状的描边时触发了错误。当然,这是不正确的,因为不能有负宽度的描边。SVG规范甚至提到负宽度是一个错误

我会说DXF输入文件是错误的。在Autodesk中是否可以正常渲染?您能否找到具有错误描边的元素,并查看其显示方式?

解决方案是向Kabeja项目提交错误报告,要求修复。根据该元素在Autodesk中的显示方式,负描边宽度可能是:

  1. 如果不应显示描边,则将其设置为0
  2. 如果应忽略符号,则将其设置为absolute值,并且-1mm的宽度应与1mm相同。

0

如果您使用kapeja-0.4,您可以通过org.kabeja.svg.generators.SVGInsertGenerator查找此类。 详细信息

                AttributesImpl attr = new AttributesImpl();
            SVGUtils.addAttribute(attr, "transform", buf.toString());
            super.setCommonAttributes(attr, svgContext, insert);
            if (scale_x + scale_y != 0.0D && svgContext.containsKey(SVGContext.LAYER_STROKE_WIDTH)) {
                Double lw = (Double)svgContext.get(SVGContext.LAYER_STROKE_WIDTH);
                double width = lw * 2.0D / (scale_x + scale_y);
                SVGUtils.addAttribute(attr, "stroke-width", SVGUtils.formatNumberAttribute(width));
            }

现在你可以通过这个来进行修改: detail

                AttributesImpl attr = new AttributesImpl();
            SVGUtils.addAttribute(attr, "transform", buf.toString());
            super.setCommonAttributes(attr, svgContext, insert);
            double s = Math.abs(scale_x) + Math.abs(scale_y);
            if (s != 0.0D && svgContext.containsKey(SVGContext.LAYER_STROKE_WIDTH)) {
                Double lw = (Double)svgContext.get(SVGContext.LAYER_STROKE_WIDTH);
                double width = lw * 2.0D / s;
                SVGUtils.addAttribute(attr, "stroke-width", SVGUtils.formatNumberAttribute(width));
            }

如果您使用kapeja-0.5,您无需做任何操作。

0

当在AUTOCAD中保存.dxf文件时,您只需要将数据帐户设置为两个(或三个)小数位数即可。
设置截图


嗨。这并不是非常有帮助,因为答案不够详细。请尽量更清晰地回答问题,并尝试在回答中加入解释,说明为什么会出现这种情况。 - OrdoFlammae

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接