AutoCAD 2010 contouren opschonen

svn path=/Slnkdwf/trunk/; revision=12494
This commit is contained in:
Jos Groot Lipman
2010-08-12 21:53:28 +00:00
parent a51a02f07e
commit ee2f8c1158
3 changed files with 303 additions and 0 deletions

211
SlnkDWFCom/WhipCleaner.cpp Normal file
View File

@@ -0,0 +1,211 @@
// WhipCleaner.cpp : Implementation of CWhipCleaner
#include "stdafx.h"
#include "WhipCleaner.h"
// CWhipCleaner
STDMETHODIMP CWhipCleaner::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_IWhipCleaner
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
STDMETHODIMP CWhipCleaner::LoadStream(VARIANT EPlotStream)
{
myDoTRACE("\nCWhipCleaner::LoadStream()");
if (EPlotStream.vt!=VT_ERROR)
{
VARIANT *var2 = &EPlotStream;
if (var2->vt==(VT_VARIANT|VT_BYREF)) // ByRef
var2 = (VARIANT *)var2->pvarVal;
if (var2->vt==VT_DISPATCH)
{
CComQIPtr<IEPlotSection> EPlotSection;
EPlotSection = var2->pdispVal;
if (!EPlotSection)
return E_INVALIDARG;
else
{
m_iEPlotSection = EPlotSection;
CEPlotSectionImpl *epli;
m_iEPlotSection->get_EPlotSectionImpl((BYTE **)&epli);
m_W2DFile.set_eplotsection(epli);
}
}
else
return E_INVALIDARG;
}
return S_OK;
}
STDMETHODIMP CWhipCleaner::SaveAs(BSTR WhipPath)
{
myWT_File my_file;
my_file.set_filename(WhipPath);
return GenerateClean(my_file);
}
// We hebben de contouren bepaald. Genereer daarvoor nu nieuwe DWF-primitieven
// In het bijzonder kennen we er een kleurtje aan toe en plaatsen wel de labels (opnieuw)
STDMETHODIMP CWhipCleaner::GenerateClean(myWT_File &my_file)
{
WT_Result result;
my_file.set_file_mode(WT_File::File_Write);
#ifdef _DEBUG
my_file.heuristics().set_allow_binary_data(WD_False);
#endif
// Zal niet zo snel meer gebeuren maar we willen het zeker niet
my_file.heuristics().set_allow_drawable_merging(WD_False);
// Let op: De viewer kan 60-file niet zo maar lezen, dat moet naar packed-DWF
// Later: viewer 6.5 kan gewoon een W2D file tonen
// Let op: bij versie 55 worden Node's niet weggeschreven
// my_file.heuristics().set_target_version(55);
if (my_file.open() != WT_Result::Success)
{
return myAtlReportError (GetObjectCLSID(), "ERROR: Unable to open file for writing: %s", my_file.filename().ascii());
ATLASSERT(false);
}
// Nu nog een keer door de DWF om de rest te kopieren naar de output
m_W2DFile.set_file_mode(WT_File::File_Read);
my_file.heuristics().set_apply_transform(WD_False);
myTRACE("\nAbout to open plan");
if (m_W2DFile.open() == WT_Result::Success)
{
#ifdef _DEBUG
WT_Comments cmt;
cmt.set("Cleaned up by SLNKDWF.Whipcleaner");
cmt.serialize(my_file);
#endif
int keep=my_file.heuristics().target_version();
// Even background ondersteunen
my_file.heuristics().set_target_version(55);
WT_Background bg(WT_Color(0,0,0));
bg.serialize(my_file);
my_file.heuristics().set_target_version(keep);
{
CmyTimer tm("Serializing plan");
SerializeClean(m_W2DFile, my_file); // Heeft eventueel een GenerateContouren in zich!
}
#ifdef _DEBUG
cmt.set("Plan is serialized");
cmt.serialize(my_file);
#endif
myTRACE("\nPlan is serialized");
m_W2DFile.close();
}
else
{
myTRACE("\nKon plan niet openen");
return myAtlReportError (GetObjectCLSID(), "ERROR: Unable to open plan file");
}
myTRACE("\nAbout to close");
//Restore the saved object node.
my_file.desired_rendition().fill() = WD_False;
my_file.close();
myTRACE("\nDone saving");
return S_OK;
}
// 'Herschrijf' de plan DWF naar de output
// Doe eerst de 'header' van de DWF (viewport en zo) en zodra
// we de eerste drawable tegenkomen doen we de contouren tussendoor
// zodat die (als ze ingekleurd worden) altijd onderaan liggen
HRESULT CWhipCleaner::SerializeClean(WT_File & my_plan_file, myWT_File & my_file)
{
WT_Result result;
WT_Integer32 last_num = -1;
CString last_name("");
// Do the actual reading.
while ((result = my_plan_file.process_next_object()) == WT_Result::Success)
{
switch(my_plan_file.current_object()->object_type())
{
case WT_Object::Drawable:
#ifdef _DEBUG
if (my_plan_file.current_object()->object_id() == WT_Object::Origin_ID
&& !my_file.heuristics().allow_binary_data()
)
{ // I do not understand why but it will assert otherwise
break;
}
#endif
my_plan_file.current_object()->serialize(my_file);
break;
case WT_Object::Attribute:
{ // TODO: Als !CurrentLayerOn dan zouden we ook nog fors kunnen schrappen in de WT_Attributes
// die vaak niet meer van toepassing zijn. Dan moeten we echter met desireded rendition gaan werken
// en dat is me nog even te veel werk.
const WT_Attribute *obj = (WT_Attribute *)my_plan_file.current_object();
switch(obj->object_id())
{
case WT_Object::Layer_ID:
{ // Sla de oorspronkelijke contour lagen over
// En ook de lagen die we niet willen
WT_Layer *layer = (WT_Layer *)obj;
WT_Integer32 layer_num = layer->layer_num();
CString layer_name(layer->layer_name().ascii());
if (layer_num==0)
{ // ARKEY heeft lagen met nummer 0. Dat mag niet volgens de
// Whip-spec en gaat ook mis (alleen) bij binaire DWF's
if (my_file.heuristics().allow_binary_data())
{
myDoTRACE("\nSkipping layer with invalid number 0");
break;
}
}
WT_Layer *ll = my_plan_file.layer_list().find_layer_from_index(layer_num);
// hier gaat het om:
if (last_num != layer_num && layer_name != last_name)
layer->serialize(my_file);
last_num = layer_num;
last_name = layer_name;
break;
}
default:
{
#ifdef _DEBUG
CString s(my_plan_file.file_stats()->descriptions());
// myTRACE("Attribute '%s'\n", s);
#endif
// Hoewel een Attibute gaat hij toch niet via desired_rendition
// Omdat we weten dat we net uit uit een DWF komen kunnen we best
// wel rechtstreeks serializen
// Let wel: desired_rendition is dan niet meer te vertrouwen. Zie @@@
obj->serialize(my_file);
}
}
}
break;
default:
#ifdef _DEBUG
CString s(my_plan_file.file_stats()->descriptions());
//myTRACE("Skipping '%s'\n", s);
#endif
break;
}
}
return S_OK;
}

66
SlnkDWFCom/WhipCleaner.h Normal file
View File

@@ -0,0 +1,66 @@
// WhipCleaner.h : Declaration of the CWhipCleaner
#pragma once
#include "resource.h" // main symbols
#include "whiptk\whip_toolkit.h"
#include "myWT_File.h"
#include "SLNKDWF.h"
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
#endif
// CWhipCleaner
class ATL_NO_VTABLE CWhipCleaner :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CWhipCleaner, &CLSID_WhipCleaner>,
public ISupportErrorInfo,
public IDispatchImpl<IWhipCleaner, &IID_IWhipCleaner, &LIBID_SLNKDWFLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CWhipCleaner()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_WHIPCLEANER)
BEGIN_COM_MAP(CWhipCleaner)
COM_INTERFACE_ENTRY(IWhipCleaner)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
STDMETHOD(LoadStream)(VARIANT EPlotStream);
STDMETHOD(SaveAs)(BSTR WhipPath);
private:
CComQIPtr<IEPlotSection> m_iEPlotSection; // Om scope levend te houden
myWT_File m_W2DFile;
STDMETHOD(GenerateClean)(myWT_File &my_file);
HRESULT SerializeClean(WT_File & my_plan_file, myWT_File & my_file);
};
OBJECT_ENTRY_AUTO(__uuidof(WhipCleaner), CWhipCleaner)

View File

@@ -0,0 +1,26 @@
HKCR
{
SLNKDWF.WhipCleaner.1 = s 'WhipCleaner Class'
{
CLSID = s '{C3A30C3C-E550-4518-8306-9AA057F23AFD}'
}
SLNKDWF.WhipCleaner = s 'WhipCleaner Class'
{
CLSID = s '{C3A30C3C-E550-4518-8306-9AA057F23AFD}'
CurVer = s 'SLNKDWF.WhipCleaner.1'
}
NoRemove CLSID
{
ForceRemove {C3A30C3C-E550-4518-8306-9AA057F23AFD} = s 'WhipCleaner Class'
{
ProgID = s 'SLNKDWF.WhipCleaner.1'
VersionIndependentProgID = s 'SLNKDWF.WhipCleaner'
ForceRemove 'Programmable'
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
'TypeLib' = s '{B6FCDE6E-141C-4601-B3AC-4DF4D5F25DF8}'
}
}
}