[Drawkit] SVG / other file format support
Brad Larson
larson at sonoplot.com
Tue May 13 12:56:40 PDT 2008
On May 12, 2008, at 9:04 PM, Graham Cox wrote:
>
>> How, architecturally, would you like this to be added? Personally,
>> I would like to see SVG as a native file format for DrawKit, rather
>> than something you have to do a File | Import and Export for. It
>> is a highly extensible standard that a lot of people are getting
>> behind (including Apple with WebKit). Inkscape uses SVG as its
>> native file format and it seems to keep up well with all of its
>> capabilities. If you'd prefer to have different file formats be
>> handled via import and export instead of the standard load / save
>> functions, I could do that, too.
>
> Bear in mind that your UI (in this case your menus) is up to you -
> DrawKit would neither prevent nor require you to implement this as a
> separate import/export command.
>
I guess I was just asking that to determine where to patch things in.
A File | Open sends an openDocument: message to the first responder,
eventually triggering a readFromURL:ofType:error: message in the
document. Therefore, you'd have your file handling switches there or
below. With a File | Import, you could have a different entry point
into the new document. I would prefer to handle other file formats in
the readFromURL and below.
>> Right now, all loading from disk is handled with a simple
>> unarchiver in DKDrawing's drawingWithData: method that takes only
>> an NSData object. If you were able to pass in the filename or
>> extension, you might be able to have different parsers for
>> different file extensions (svg, svgz, dxf, ai, etc.) within this
>> method. The same could be done in reverse for the
>> writeToFile:atomically: method. This would make it possible to do
>> different file formats during the load / save operation. If so,
>> would you want separate helper classes for each different file
>> type, load / save methods under DKDrawing, or DKDrawing categories
>> for each file type?
>
> At the top level you'd probably just have a category of DKDrawing
> with a class method that accepted NSData in SVG format, returning a
> new DKDrawing instance, and an instance method that returned the
> data in SVG format. My view is that DKDrawing has no business
> interpreting file extensions or other file metadata - it just
> provides the basic I/O methods for converting to and from SVG data.
> The document class (DKDrawingDocument or other NSDocument subclass)
> would figure out which methods of DKDrawing to call based on the
> extension, and that in turn allows you complete freedom to implement
> your UI however you want.
>
> Regarding writeToFile:atomically:, that's more a convenience for
> quick and dirty saving - even DKDrawingDocument doesn't use it, but
> instead currently gets the NSData object. You could have a
> writeToSVGFile:atomically: for orthogonality if you wanted, but I
> see it as being more useful to just return SVG as NSData on request
> and let the document handle it.
>
So, we could use readFromURL:ofType:error: in DKDrawingDocument as the
starting point to figure out how to process the input file and grab
the extension using [[absoluteURL path] pathExtension]. To provide
for categories on the DKDrawing, we could fire off a [drawing
performSelector:NSSelectorFromString[NSString
stringWithFormat:@"process%@:", extension]) withObject:data] message
to the drawing object (I don't know how to do a class-based
convenience constructor with a runtime-determined selector). Then the
categories would provide processSVG:, processDXF:, etc. methods in
DKDrawing for their appropriate file extension. The same would occur
in reverse on writing to disk. Does this make sense or am I going
about things the wrong way?
>> I figure saving would be accomplished by iterating through the
>> internal store of objects and calling an svgRepresentation method,
>> or something corresponding to the file format, on them. This might
>> be where separate categories for the file formats would be useful,
>> so that the drawing objects could each have their own input /
>> output methods.
>
> Again a category for each significant piece of the data model would
> probably be what's needed here. Following the architecture of the
> NSCoder protocol would probably be the most sensible way to go if
> that works with SVG - it may be that this would be overruled by the
> SVG design, since hierarchical archiving may not be a good fit. I'd
> need to look at the SVG spec in detail to be sure. Hopefully you
> wouldn't need any ivars to support SVG, and it can all be done in a
> category. That would be the cleanest and easiest way to add the
> necessary methods, IMO.
>
Even if you did need to add more information to the drawing objects,
can't you do that right now as per-object metadata? Admittedly, I've
not gotten that far into it. Other than that, a simple category
sounds like it would do the job for the formats I can think of. I'll
see if that's true as I get into it.
>> I wanted to check first so that anything I did would not conflict
>> with anything you had in mind or had already started.
>
> Cool ;) well, as I haven't started the field's wide open. It would
> be great if you can add this, it would be a big thing I can cross
> off the "to do" list. Naturally I'll give all and any help I can.
>
You've given us a great start with the framework itself. If I can
make something work, I'll post the patches here.
______________________
Brad Larson
SonoPlot, Inc.
3030 Laura Lane, Suite 120
Middleton, WI 53562
More information about the Drawkit
mailing list