Tạo Form nhập số liệu khảo sát từ File .txt vào Civil3D với ứng dụng API

Yuri Boyka July 25, 2015 0

Mình xin chia sẻ 1 đoạn code cách lấy dữ liệu khảo sát từ File .txt vào Civil3D với các chức năng đơn giản theo các bước sau:

Bước 1: Tạo một WindownForm với tên đọc số liệu khảo sát

Bước 2: Tạo một DataGridView để lấy tên đường dẫn dữ liệu khi nhập vào, một DataGridView dừng để xem trước cấu trúc dữ liệu khi nhập vào.

Bước 3: Tạo một ListBox chứa các kiểu dữ liệu định dạng điểm mà Civil hỗ trợ

Bước 4: Tạo nút Button chọn File, nút xóa File, một checkbox để mở chức năng thêm nhóm, 1 Combobox để chọn nhóm, một nút button để thêm tên nhóm vào.

1

 

1/ Với chức năng chọn File ta thêm dòng code sau:

this.Hide();
OpenFileDialog _file = new OpenFileDialog();
string path = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable(“DWGPREFIX”).ToString();
_file.Title = “Choose a *.txt”;
_file.Filter = “File *.txt | *.txt”;
_file.InitialDirectory = path;
if(_file.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
_name = _file.FileName.ToString();
StreamReader _r = new StreamReader(_name);
if (File.Exists(_name))
{
dgv_file.Rows.Add();
dgv_file.Rows[0].Cells[0].Value = _name;
dgv_file.Rows[0].Cells[1].Value = “File_File”;

dgv_xemtruoc.ColumnCount = 5;
dgv_xemtruoc.Columns[0].Name = “Point Number”;
dgv_xemtruoc.Columns[0].Width = 100;
dgv_xemtruoc.Columns[1].Name = “Easting”;
dgv_xemtruoc.Columns[1].Width = 150;
dgv_xemtruoc.Columns[2].Name = “Northing”;
dgv_xemtruoc.Columns[2].Width = 150;
dgv_xemtruoc.Columns[3].Name = “Point Elevation”;
dgv_xemtruoc.Columns[3].Width = 150;
dgv_xemtruoc.Columns[4].Name = “Raw Description”;
dgv_xemtruoc.Columns[4].Width = 150;
while (!_r.EndOfStream)
{
string _line = _r.ReadLine();
string[] _arr = _line.Split(‘ ‘);
dgv_xemtruoc.Rows.Add();
int _index = dgv_xemtruoc.RowCount – 1;
dgv_xemtruoc.Rows[_index].Cells[0].Value = _arr[0];
dgv_xemtruoc.Rows[_index].Cells[1].Value = _arr[1];
dgv_xemtruoc.Rows[_index].Cells[2].Value = _arr[2];
dgv_xemtruoc.Rows[_index].Cells[3].Value = _arr[3];
dgv_xemtruoc.Rows[_index].Cells[4].Value = _arr[4];
}
_r.Close();
}
}

2/ Với chức năng xóa File ta thêm dòng code sau:

{
int index = dgv_file.SelectedRows.Count – 1;
for(int i = dgv_file.SelectedRows.Count – 1; i >= 0 ; i — )
{
int _selec = dgv_file.SelectedRows[i].Index;
dgv_file.Rows.RemoveAt(_selec);
}
}

3/Để hiển thị định dạng tệp điểm trong ListBox ta thêm dòng code sau:

using(acad.DocumentLock acLock = doc.LockDocument())
{
using(Transaction tr = db.TransactionManager.StartTransaction())
{
ListBox _f = new ListBox();
foreach(PointFileFormat _po in _pt)
{
list_data.Items.Add(_po.Name);
}

// Load du lieu len group
PointGroupCollection _ids = _Civil.PointGroups;
foreach(ObjectId _id in _ids)
{
PointGroup _pointgroup = tr.GetObject(_id, OpenMode.ForRead) as PointGroup;
cmb_group.Items.Add(_pointgroup.Name);
}
if(cmb_group.Items.Count > 0)
{
cmb_group.SelectedIndex = 0;
}
tr.Commit();
}
}

4/ Thêm tên nhóm điểm vào ta cần thêm 1 Windownform để hỗ trợ nhập tên nhóm và mô tả cho nhóm mới:

1

Khởi tạo một PointGroup mới với tên và mô tả cần thêm đoạn code sau:

acad.Document doc = acad.Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database db = doc.Database;
using(acad.DocumentLock acLock = doc.LockDocument())
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
string _name = txt_nhomdiem.Text;
string _mota = txt_mota.Text;
createPointGroup(_name, _mota);
Gvar._names = _name;
tr.Commit();
}
this.Close();
}

private void createPointGroup(string name, string IncludeDescription)
{
if(_pointGroups.Contains(name))
{
return;
}
ObjectId groupId = _pointGroups.Add(name);
StandardPointGroupQuery query = new StandardPointGroupQuery();
query.IncludeRawDescriptions = IncludeDescription;
PointGroup group = groupId.GetObject(OpenMode.ForWrite) as PointGroup;
group.SetQuery(query);
Gvar._name = group.Name;
}
private PointGroupCollection _pointGroups
{
get
{
return _civil.PointGroups;
}
}

5/ Nhập dữ liệu điểm vào Civil với nút OK ta cần thêm 1 đoạn code sau:

using (Transaction tr = db.TransactionManager.StartTransaction())
{
PointGroupCollection _ids = _Civil.PointGroups;
foreach(ObjectId _id in _ids)
{
PointGroup _pointgroup = tr.GetObject(_id, OpenMode.ForRead) as PointGroup;
if(Gvar._names == _pointgroup.Name)
{
Gvar._ib = _pointgroup.ObjectId;
}
}

PointGroup _poitGr = tr.GetObject(Gvar._ib, OpenMode.ForRead) as PointGroup;
CogoPointCollection _cogo = _Civil.CogoPoints;
for (int i = 0; i < dgv_xemtruoc.Rows.Count; i++ )
{
string _name = dgv_xemtruoc.Rows[i].Cells[0].Value.ToString();
Double _x = Double.Parse(dgv_xemtruoc.Rows[i].Cells[1].Value.ToString());
Double _y = Double.Parse(dgv_xemtruoc.Rows[i].Cells[2].Value.ToString());
Double _z = Double.Parse(dgv_xemtruoc.Rows[i].Cells[3].Value.ToString());
string _descrip = dgv_xemtruoc.Rows[i].Cells[4].Value.ToString();
Point3d _location = new Point3d(_x, _y, _z);
ObjectId _pointID = _cogo.Add(_location, true);
CogoPoint _cogopoint = _pointID.GetObject(OpenMode.ForWrite) as CogoPoint;
// Thiết lập thuộc tính cho Point
_cogopoint.PointName = _name;
_cogopoint.RawDescription = _descrip;
}
tr.Commit();

}

F5 hoặc Start để khởi động Civil3D, sau đó vào chương trình NETLOAD file .DLL lên và gõ lệnh gọi hộp thoại đọc dữ liệu khảo sát:

1

Chọn File, hoặc xóa File đã chọn, chọn định dạng điểm để xem nội dung hiển thị:

1

Chọn thêm tên nhóm mới và mô tả cho nhóm mới:

1

Dữ liệu điểm đã được nhập vào Civil3D

1

 

Chúc các bạn thành công!

 

Leave A Response »

You must be logged in to post a comment.