public class CaptureAndSendClass:IExternalCommand { UIApplication _revit = null; Document _doc; string _path = @"C:\Windows\Temp\"; string _NomeStudente; string _OggettoMail = "nessun oggetto"; string _TestoMail = ""; string _Sign = "Tecniche Parametriche di Progettazione"; Bitmap _screenshot; public string GetOggettoMail { get { return _OggettoMail; } set { _OggettoMail = value; } } public string GetTestoMail { get { return _TestoMail; } set { _TestoMail = value; } } public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { _revit = commandData.Application; UIDocument uiDoc = _revit.ActiveUIDocument; _doc = uiDoc.Document; if (_doc.IsFamilyDocument) { MessageBox.Show("Questo strumento funziona solo con il template fornito dal corso",_Sign); return Result.Cancelled; } System.Drawing.Rectangle bounds = new System.Drawing.Rectangle(300, 0, 950, 800); Graphics graph; _screenshot = new Bitmap(bounds.Width, bounds.Height); graph = Graphics.FromImage(_screenshot); graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy); CaptureAndSendForm displayForm = new CaptureAndSendForm(this); displayForm.ShowDialog(); return Result.Succeeded; } public void CaptureAndSendMethod() { ProjectInfo info = _doc.ProjectInformation; Parameter param1 = info.get_Parameter("Email"); Parameter param2 = info.get_Parameter("Password"); // leggo le informazioni di progetto indispensabili per l'invio string indirizzo = param1.AsString(); string password = param2.AsString(); _NomeStudente = info.Author; // controllo che i campi necessari all'invio siano stati riempiti. // In caso contrario il codice s'interrompe mostrando un avviso if ("" == indirizzo || "" == password || "" == _NomeStudente) { MessageBox.Show("I campi nelle informazioni di progetto non sono completi", _Sign); } else { //Se i campi sono riempiti inizia la creazione degli allegati. //La funzione EsportaInDXFMethod controlla la presenza della vista stabilita e, //in caso positivo, ne crea un dxf, lo salva e ne restituisce il percorso. //Nell'eventualità di problemi, il codice s'interrompe mostrando un //messaggio di avviso EsportaInDXFClass creaDXF = new EsportaInDXFClass(); string pathDXF = creaDXF.EsportaInDXFMethod(_doc, _NomeStudente,_path); //In caso di successo il codice può procedere //Salvo, dunque, il capture screen precedentemente "scattato" _path += _NomeStudente + "_01.jpg"; _screenshot.Save(_path); //creo una nuova istanza dell'oggetto MailMessage MailMessage oMsg = new MailMessage(); //imposto il mittente con la proprietà From oMsg.From = new MailAddress(indirizzo, _NomeStudente); //imposto uno o più destinatari oMsg.To.Add(new MailAddress("cloud.revit@gmail.com", "BlogTPdP")); //imposto l'oggetto della mail oMsg.Subject = _OggettoMail; //imposto il testo della mail specificandone alcune caratteristiche oMsg.Body = _TestoMail; oMsg.IsBodyHtml = true; //Ho terminato la creazione dei due(in futuro tre) oggetti da allegare //Passo alla procedura di aggancio alla mail in partenza //Allego lo screenshot in formato jpg string file = _path; Attachment data = new Attachment(file); ContentDisposition disposition = data.ContentDisposition; disposition.CreationDate = System.IO.File.GetCreationTime(file); disposition.ModificationDate = System.IO.File.GetLastWriteTime(file); disposition.ReadDate = System.IO.File.GetLastAccessTime(file); oMsg.Attachments.Add(data); //Allego il DXF Attachment dataDXF = new Attachment(pathDXF); ContentDisposition dispositionDXF = dataDXF.ContentDisposition; dispositionDXF.CreationDate = System.IO.File.GetCreationTime(pathDXF); dispositionDXF.ModificationDate = System.IO.File.GetLastWriteTime(pathDXF); dispositionDXF.ReadDate = System.IO.File.GetLastAccessTime(pathDXF); oMsg.Attachments.Add(dataDXF);
//Imposto il Server Smtp //L'Smtp è un protocollo di invio che spesso varia, nei suoi parametri d'istanziazione, // per servizi di posta differenti //Qui utilizzo l'Smtp di gmail SmtpClient oSmtp = new SmtpClient("smtp.gmail.com", 587); oSmtp.DeliveryMethod = SmtpDeliveryMethod.Network; //definisco le credenziali di accesso NetworkCredential oCredential = new NetworkCredential(indirizzo, password); //la riga seguente conferma quanto accennato in precedenza: //l'Smtp di yahoo, ad esempio, non necessita di questa specifica oSmtp.EnableSsl = true; oSmtp.UseDefaultCredentials = false; oSmtp.Credentials = oCredential; //la mail(post) è pronta per l'invio oSmtp.Send(oMsg); } } }
class EsportaInDXFClass
{
Document _doc;
string _NomeStudente;
string _folder;
public string EsportaInDXFMethod(Document Doc, string NomeStudente, string pathOfSaving)
{
_doc = Doc;
_NomeStudente = NomeStudente;
_folder = pathOfSaving;
_NomeStudente += "_PianoTipo";
ElementClassFilter familyInstanceFilter = new ElementClassFilter(typeof(ViewPlan));
ParameterValueProvider pvp = new ParameterValueProvider(new ElementId(BuiltInParameter.VIEW_NAME));
FilterStringRuleEvaluator evaluator = new FilterStringEquals();
FilterRule fRule = new FilterStringRule(pvp, evaluator, "Piano Tipo", false);
ElementParameterFilter nomeVista = new ElementParameterFilter(fRule);
LogicalAndFilter doorInstancesFilter = new LogicalAndFilter(familyInstanceFilter, nomeVista);
FilteredElementCollector collector = new FilteredElementCollector(_doc);
ICollection<ElementId> collection = collector.WherePasses(doorInstancesFilter).ToElementIds();
if (0 == collection.Count)
{
throw new Exception("Impossibile creare il dxf perché la vista Piano Tipo non esiste");
}
else
{
DXFExportOptions options = new DXFExportOptions();
//Salvo in versione 2000
ACADVersion version = ACADVersion.R2000;
options.FileVersion = version;
_doc.Export(_folder, _NomeStudente, collection, options);
_folder += string.Format("{0}.dxf", _NomeStudente);
return _folder;
}
}
}
public partial class CaptureAndSendForm : Form
{
private CaptureAndSendClass _instance;
public CaptureAndSendForm(CaptureAndSendClass Instance)
{
_instance = Instance;
if (null == _instance)
{
MessageBox.Show("Impossibile l'avvio dell'applicazione");
}
InitializeComponent();
}
private void buttonSend_Click(object sender, EventArgs e)
{
_instance.CaptureAndSendMethod();
this.DialogResult = DialogResult.OK;
this.Close();
}
private void buttonClose_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
this.Close();
}
private void ObjMailTextBox_TextChanged(object sender, EventArgs e)
{
_instance.GetOggettoMail = this.ObjMailTextBox.Text;
}
private void TestoMailTextBox_TextChanged(object sender, EventArgs e)
{
_instance.GetTestoMail = this.TestoMailTextBox.Text;
}
}