Message 1 of 4
Problem with Civil 3D generated toposurfaces from TIN surfaces
Not applicable
08-22-2019
06:02 AM
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Hi!
I've been working on an add-in that will let you pick tin surfaces from an open Civil 3D-model and then create toposurfaces of those in Revit. The problem I have is when I pick two tin surfaces at a time, Revit creates one toposurface of the first tin surface I picked and another toposurface conisting of both tin surfaces. My goal is to create two separate toposurfaces. I can't figure out where I've messed up, can someone help me? I'll attatch a screencast and my code.
public partial class Import_form : System.Windows.Forms.Form
{
public IAeccSurfaces surfs;
public List<List<XYZ>> topos = new List<List<XYZ>>();
private Autodesk.AutoCAD.Interop.IAcadApplication m_oAcadApp = null;
private Autodesk.AECC.Interop.UiLand.IAeccApplication m_oAeccApp = null;
private Autodesk.AECC.Interop.UiLand.IAeccDocument m_oAeccDoc = null;
private IAeccDocuments m_oAeccDocs = null;
private Autodesk.AECC.Interop.Land.IAeccDatabase m_oAeccDb = null;
string m_sAcadProdID = "AutoCAD.Application";
string m_sAeccAppProgId = "AeccXUiLand.AeccApplication.13.0";
double[] triangles;
List<double> nummer = new List<double>();
public Import_form()
{
InitializeComponent();
m_oAcadApp = (IAcadApplication)Marshal.GetActiveObject(m_sAcadProdID);
if (m_oAcadApp != null)
{
m_oAeccApp = (Autodesk.AECC.Interop.UiLand.IAeccApplication)m_oAcadApp.GetInterfaceObject(m_sAeccAppProgId);
m_oAeccDoc = (Autodesk.AECC.Interop.UiLand.IAeccDocument)m_oAeccApp.ActiveDocument;
m_oAeccDocs = (Autodesk.AECC.Interop.UiLand.IAeccDocuments)m_oAeccApp.Documents;
m_oAeccDb = (Autodesk.AECC.Interop.Land.IAeccDatabase)m_oAeccApp.ActiveDocument.Database;
comboBox1.Items.Add(m_oAeccDoc);
comboBox1.SelectedIndex = 0;
comboBox1.DisplayMember = "Name";
comboBox1.SelectedItem = m_oAeccDoc;
surfs = m_oAeccDb.Surfaces;
foreach (IAeccTinSurface surf in surfs)
{
checkedListBox1.Items.Add(surf);
}
((ListBox)checkedListBox1).DisplayMember = "Name";
}
}
private void Import_form_Load(object sender, EventArgs e)
{
}
private void button1_Click_1(object sender, EventArgs e)
{
/*int antal = tjo.Count();
MessageBox.Show(antal.ToString());*/
}
public static List<List<double>> splitlist(List<double> nummer, int antal = 3)
{
var list = new List<List<double>>();
for (int i = 0; i < nummer.Count; i += antal)
{
list.Add(nummer.GetRange(i, Math.Min(antal, nummer.Count - i)));
}
return list;
}
private void checkedListBox1_Click(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
foreach (IAeccTinSurface valdsurface in checkedListBox1.CheckedItems)
{
triangles = valdsurface.OutputTriangles;
List<XYZ> punkter = new List<XYZ>();
List<XYZ> utpunkter = new List<XYZ>();
double x = 0, y = 0, z = 0;
foreach (double d in triangles)
{
nummer.Add(d);
}
List<List<double>> uppdelning = splitlist(nummer, 3);
foreach (List<double> uppdelat in uppdelning)
{
for (int k = 0; k < uppdelat.Count; ++k)
{
int j = 1;
foreach (double d in uppdelat)
{
switch (j)
{
case 1:
x = d;
break;
case 2:
y = d;
break;
case 3:
z = d;
break;
default:
break;
}
j++;
}
punkter.Add(new XYZ(x, y, z));
}
}
topos.Add(punkter);
}
}
} public class Civil_import : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiapp = commandData.Application;
Autodesk.Revit.ApplicationServices.Application app = uiapp.Application;
Autodesk.Revit.Creation.Application appcrea = uiapp.Application.Create;
Autodesk.Revit.DB.Document doc = uiapp.ActiveUIDocument.Document;
Autodesk.Revit.DB.View currentview = uiapp.ActiveUIDocument.ActiveView;
List<List<XYZ>> lists_out = new List<List<XYZ>>();
Import_form f = new Import_form();
var result = f.ShowDialog();
if(result==DialogResult.OK)
{
using (Transaction t = new Transaction(doc))
{
t.Start("ett");
foreach (List<XYZ> punkter in f.topos)
{
List<XYZ> ut = new List<XYZ>();
GetVertices(ut, punkter);
lists_out.Add(ut);
}
foreach(List<XYZ> tops in lists_out)
{
TopographySurface.Create(doc, tops);
}
t.Commit();
}
}
if (result==DialogResult.Cancel)
{
return Result.Cancelled;
}
return Result.Succeeded;
}
const double _eps = 1.0e-9;
public static bool IsZero(double a)
{
return _eps > Math.Abs(a);
}
public static bool IsEqual(double a, double b)
{
return IsZero(b - a);
}
public static int Compare(double a, double b)
{
return IsEqual(a, b) ? 0 : (a < b ? -1 : 1);
}
public static int Compare(XYZ p, XYZ q)
{
int diff = Compare(p.X, q.X);
if (0 == diff)
{
diff = Compare(p.Y, q.Y);
if (0 == diff)
{
diff = Compare(p.Z, q.Z);
}
}
return diff;
}
static void GetVertices(List<XYZ> listut, List<XYZ> listin)
{
Dictionary<XYZ, int> a
= new Dictionary<XYZ, int>(
new XyzComparer());
foreach (XYZ p in listin)
{
if (!a.ContainsKey(p))
{
a.Add(p, 1);
}
else
{
++a[p];
}
}
List<XYZ> keys = new List<XYZ>(a.Keys);
keys.Sort(Compare);
foreach (XYZ p in keys)
{
listut.Add(p);
}
}
}
public class XyzComparer : IEqualityComparer<XYZ>
{
public bool Equals(XYZ p, XYZ q)
{
return p.IsAlmostEqualTo(q);
}
public int GetHashCode(XYZ p)
{
return p.ToString().GetHashCode();
}
}