using System.Windows.Forms;
using CAD_DBS = Autodesk.AutoCAD.DatabaseServices;
using CAD_GEO = Autodesk.AutoCAD.Geometry;
using CAD_APS = Autodesk.AutoCAD.ApplicationServices;
using CAD_RTM = Autodesk.AutoCAD.Runtime;
using CAD_EDI = Autodesk.AutoCAD.EditorInput;
using CAD_PLS = Autodesk.AutoCAD.PlottingServices;
using CIV_APS = Autodesk.Civil.ApplicationServices;
using CIV_DBS = Autodesk.Civil.DatabaseServices;
[assembly: CAD_RTM.CommandClass(typeof(ideasoft_civ.acad_commands))]
class acad_commands
{
// Команда подмены профилей земли в проекте Цивил
[CAD_RTM.CommandMethod("PSM_CIVIL_PROF_REPLACE")]
public static void PSM_COMM_CIVIL_TRASSA_REPLACE()
{
// Выбираем нужную поверхность, по которой будем обновлять профили
CAD_DBS.Entity pov;
bool ret = false;
CAD_DBS.ObjectId idpov = acad_Func.get_ent("Укажите поверхность-tin", out ret, out pov);
if (pov == null) return;
if (!(pov is CIV_DBS.Surface))
return;
CIV_DBS.Surface sur = (CIV_DBS.Surface)pov;
bool delProf = DialogResult.Yes == MessageBox.Show("Удалять старую версию линии земли на профиле?", "Цивил",
MessageBoxButtons.YesNo);
CAD_DBS.Entity ent;
bool ret1 = false;
CAD_DBS.ObjectId idprof = acad_Func.get_ent("Укажите профиль для подмены", out ret1, out ent);
if (ent == null) return;
if (!(ent is CIV_DBS.Profile))
return;
CIV_DBS.Profile prof = (CIV_DBS.Profile)ent;
string ProfName = prof.Name;
DialogResult res = InputBox("Идея-Софт ПС Профиль", "Имя профиля проекта Civil", ref ProfName);
if (res != DialogResult.OK) return;
if (ProfName.Trim() == "") return;
CAD_APS.Document doc = CAD_APS.Application.DocumentManager.MdiActiveDocument;
CAD_DBS.Database db = doc.Database;
CIV_APS.CivilDocument civ_doc = CIV_APS.CivilDocument.GetCivilDocument(db);
List<CAD_DBS.Entity> Ents = new List<CAD_DBS.Entity>();
string StartRep = "Были заменены профили:" + '\n';
if (!delProf)
StartRep = "Были добавлены профили:" + '\n';
int k = 0; // Счетчик для отчета работы команды
// Список имен замененных профилей
string ListRep = "";
using (doc.LockDocument())
{
using (CAD_DBS.Transaction tr = db.TransactionManager.StartTransaction())
{
// Цикл по трассам
foreach (CAD_DBS.ObjectId id in civ_doc.GetAlignmentIds())
{
// Получаем объект трассы
CIV_DBS.Alignment trs = ( CIV_DBS.Alignment)tr.GetObject(id, CAD_DBS.OpenMode.ForRead);
// Получаем нужные профили (Профиль проектируемой земли и профиль лотка трубы)
CAD_DBS.ObjectId idREDold = new CAD_DBS.ObjectId();
CAD_DBS.ObjectId idLOTold = new CAD_DBS.ObjectId();
CIV_DBS.Profile profLOTold = null;
CIV_DBS.Profile profREDold = null;
if (getProfil_fragment_Name("лоток", trs, tr, ref idLOTold, ref profLOTold) &&
getProfil_fragment_Name(ProfName, trs, tr, ref idREDold, ref profREDold))
{
// Создаем объект нового профиля
CIV_DBS.Styles.ProfileLabelSetStyleCollection coll = civ_doc.Styles.LabelSetStyles.ProfileLabelSetStyles;
CAD_DBS.ObjectId idSetLS = coll[1];
// Придумаем имя новому профилю
DateTime dt = DateTime.Now;
string SDate = dt.Year + "_" + String.Format("{0:00}", dt.Month) + "_" +
String.Format("{0:00}", dt.Day) + "_" +
String.Format("{0:00}", dt.Hour) + "_" +
String.Format("{0:00}", dt.Minute) + "_" +
String.Format("{0:00}", dt.Second) + "_" +
String.Format("{0:000}", dt.Millisecond);
string NewNameProf = "_PSM_" + trs.Name + "_SPOZU_" + SDate;
CAD_DBS.ObjectId NewID_RED = Profile.CreateFromSurface(
NewNameProf, trs.ObjectId,
sur.ObjectId, profREDold.LayerId,
profREDold.StyleId, idSetLS);
// Получаем вид профиля
CAD_DBS.ObjectId idView = GetViewID(trs);
CIV_DBS.ProfileView pv = (CIV_DBS.ProfileView)tr.GetObject(idView, CAD_DBS.OpenMode.ForWrite);
// У вида профиля получаем набор установок полос данных
CIV_DBS.ProfileViewBandSet bs = pv.Bands;
// Получаем коллекцию нижних строк (профильная таблица)
CIV_DBS.ProfileViewBandItemCollection RecordsTabl = bs.GetBottomBandItems();
// Цикл по записям профильной таблицы
for (int i = 0; i < RecordsTabl.Count; i++)
// Подмена id профилей в таблице
foreach (CIV_DBS.ProfileViewBandItem itm in RecordsTabl)
{
if (RecordsTabl[i].Profile1Id == idREDold)
RecordsTabl[i].Profile1Id = NewID_RED;
if (RecordsTabl[i].Profile2Id == idREDold)
RecordsTabl[i].Profile2Id = NewID_RED;
}
bs.SetBottomBandItems(RecordsTabl);
k++;
if (delProf)
{
// Удаление старого профиля
acad_Func.ent_delete(idREDold);
ListRep += k.ToString() + ") " + profREDold.Name + " на " + NewNameProf + '\n';
}
else
{
ListRep += k.ToString() + ") " + NewNameProf + '\n';
}
}
} // Конец цикла по трассам
tr.Commit();
}
}
// Выводим краткий отчет по работе команды (не обязательно)
if (ListRep != "")
MessageBox.Show(StartRep + ListRep);
}
// ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ДЛЯ РАБОТЫ КОМАНДЫ
// Функция вывода диалога ввода строки
public static DialogResult InputBox(string title,
string promptText,
ref string value)
{
Form form = new Form();
System.Windows.Forms.Label label = new System.Windows.Forms.Label();
TextBox textBox = new TextBox();
Button buttonOk = new Button();
Button buttonCancel = new Button();
form.Text = title;
label.Text = promptText;
textBox.Text = value;
buttonOk.Text = "OK";
buttonCancel.Text = "Отмена";
buttonOk.DialogResult = DialogResult.OK;
buttonCancel.DialogResult = DialogResult.Cancel;
label.SetBounds(9, 18, 372, 13);
textBox.SetBounds(12, 36, 372, 20);
buttonOk.SetBounds(228, 72, 75, 23);
buttonCancel.SetBounds(309, 72, 75, 23);
label.AutoSize = true;
textBox.Anchor = textBox.Anchor | AnchorStyles.Right;
buttonOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
form.ClientSize = new System.Drawing.Size(396, 107);
form.Controls.AddRange(new Control[] { label, textBox, buttonOk, buttonCancel });
form.ClientSize = new System.Drawing.Size(Math.Max(300, label.Right + 10), form.ClientSize.Height);
form.FormBorderStyle = FormBorderStyle.FixedDialog;
form.StartPosition = FormStartPosition.CenterScreen;
form.MinimizeBox = false;
form.MaximizeBox = false;
form.AcceptButton = buttonOk;
form.CancelButton = buttonCancel;
DialogResult dialogResult = form.ShowDialog();
value = textBox.Text;
return dialogResult;
}
// Получаем id для первого вида профиля трассы trs
public static CAD_DBS.ObjectId GetViewID(CIV_DBS.Alignment trs) {
foreach (CAD_DBS.ObjectId id in trs.GetProfileViewIds())
return id;
CAD_DBS.ObjectId retid = new CAD_DBS.ObjectId();
return retid;
}
// Получаем нужный профиль трассы про ключевому фрагменту имени профиля
public static bool getProfil_fragment_Name(string fragment_Name,
CIV_DBS.Alignment trs,
CAD_DBS.Transaction tr,
ref CAD_DBS.ObjectId retID,
ref CIV_DBS.Profile ProfObj)
{
foreach (CAD_DBS.ObjectId curr in trs.GetProfileIds())
{
CIV_DBS.Profile CurrPr = (CIV_DBS.Profile)tr.GetObject(curr, CAD_DBS.OpenMode.ForRead);
if (CurrPr != null)
if (CurrPr.Name.IndexOf(fragment_Name) != -1)
{
ProfObj = CurrPr;
retID = curr;
return true;
}
}
return false;
}
public static class acad_Func
{
public static CAD_DBS.ObjectId get_ent(string msg, out bool ret, out CAD_DBS.Entity ent)
{
ret = false;
CAD_DBS.ObjectId id = new CAD_DBS.ObjectId();
CAD_DBS.Database db = CAD_APS.Application.DocumentManager.MdiActiveDocument.Database;
ent = null;
using (CAD_DBS.Transaction trans = db.TransactionManager.StartTransaction())
{
try
{
CAD_EDI.PromptEntityOptions entityOpts = new CAD_EDI.PromptEntityOptions("\n" + msg);
CAD_EDI.PromptEntityResult entityRes = CAD_APS.Application.DocumentManager.MdiActiveDocument.Editor.GetEntity(entityOpts);
CAD_DBS.Entity entObject = (trans.GetObject(entityRes.ObjectId, CAD_DBS.OpenMode.ForRead) as CAD_DBS.Entity);
id = entObject.ObjectId;
ent = entObject;
trans.Commit();
ret = true;
}
catch
{
trans.Commit();
}
}
return id;
}
}
}