Jump to content

Recommended Posts

Posted

Hi,

 

I am having the following vc++ code which will read the input from Layertable assign to variable of user-defined class cLayerInfo.

 

AcDbLayerTableRecord *pLay;
CStringArray asLayers;
CLayerInfo info;
info.color = pLay->color();
info.linetypeObjectId = pLay->linetypeObjectId();
info.lineWeight = pLay->lineWeight();
CMapLayerInfo m_mapLayerInfo;
m_mapLayerInfo.SetAt( asLayers.GetAt(i), info );
pLay->close();

The user defined class file in vc++ is

class CLayerInfo
{
public:
CLayerInfo() : lineWeight(AcDb::kLnWt000) {}
virtual ~CLayerInfo() {}

AcCmColor color;
AcDb::LineWeight lineWeight;
AcDbObjectId linetypeObjectId;
};

 

In c# I have created the class file as follows

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

using System.Runtime.InteropServices;

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Colors;

[assembly: CommandClass(typeof(SBK.CLayerInfo))]
namespace SBK
{
   class CLayerInfo
   {
       
       private Color color;
       private LineWeight lineweight;
       private ObjectId linetypeObjectId=new ObjectId();
       public static void CLayerInfo(Color color, LineWeight lineweight, ObjectId linetypeObjectId)
       {
           this.color=color;
           this.lineweight=lineweight;
           this.linetypeObjectId=linetypeObjectId;
       }                 
   }
}

 

and I have called the class file in another class file as follows

 

LayerTableRecord pLay = (LayerTableRecord)trans.GetObject(obj, OpenMode.ForRead);
CLayerInfo info = new CLayerInfo(pLay.Color, pLay.LineWeight, pLay.LinetypeObjectId);

But how to implement the below lines

CMapLayerInfo m_mapLayerInfo;

m_mapLayerInfo.SetAt( asLayers.GetAt(i), info ). If I go for deinition of CMapLayerInfo it is taking me to the another afxtempl.h file.

 

Can anyone tell me how to convert the above code in c#.

Please it is urgent.

Posted

There is not typically a lot of C++ conversation on this forum. This may be a good question for the crew over at http://www.theswamp.org.

 

That being said, however, let me take a stab at it:

 

It appears that the C# code would require another class comparable to “CMapLayerInfo”.

 

Presumably, that class has a method setup to iterate through all the layers named in asLayers and transfer to them the information stored info.

 

If that actually is the case then I imagine your C# class CLayerInfo should make public the variables color, lineweight, and (perhaps) objecteId. Or, if validation is an issue, provide the appropriate Get/Set procedures.

Posted

Whatever you have mentioned is absolutely correct.When I go for the definition for cMapLayerInfo it takes me into another header file which contains the following code

 

typedef CMap CMapLayerInfo;

 

If I go for CMap definition it takes me into afxtempl.h which is predefined header file.

 

So I cannot create class for cMapLayerInfo. Is there any other way to make use of afxtempl.h in c#

Posted

It is possible to access some of the UnManaged objects and functions from Managed code using Platform Invoke. It is bit of an arcane art so you may have some luck at the Swamp, Autodesk’s Discussions ObjectARX forum, or even on the Through the Interface blog (http://through-the-interface.typepad.com/through_the_interface/2006/07/calling_objecta.html and

http://through-the-interface.typepad.com/through_the_interface/2008/08/using-the-pinvo.html). I even have a query (towards the bottom) on that second blog listing.

 

Unfortunately, the return advise may not come in a timely fashion.

Posted

This is a bit of a coincidental thread don't ya think Sean... :P

Posted

There are a lot of us all headed in a similar direction. :wink:

Posted

Thank you for the guidance Seant. Also I want to convert the follwoing vc++ to c#. Can you help me in this.

 

removeSSgetFilterInputContextReactor( curDoc(), pAcSSGetFilterSBKMirror );

addSSgetFilterInputContextReactor( curDoc(), pAcSSGetFilterSBKMirror );

 

here pAcSSGetFilterSBKMirror is pointer

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...