Get Revit model as Autodesk.Revit.DB Document class using Desktop Connector - revit-api

I'm looking for a way (may not be possible) to get a Revit file from the Autodesk
Desktop Connector to a Document class so I won't have to use the cloud API's.
The code below doesn't compile but does represented the genral idea, any thoughts ?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Autodesk.Connectivity.WebServices;
using Autodesk.Connectivity.WebServicesTools;
using Autodesk.Revit.DB;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
// Set up connection to the Autodesk Desktop Connector
WebServiceManager serviceManager = WebServiceManager.GetServiceManager();
string ticket = serviceManager.SecurityService.Authenticate();
// Get the list of files in the Autodesk Desktop Connector
File[] files = serviceManager.DocumentService.FindFiles(ticket, "*.rvt");
// Open the first Revit file in the list
Document doc = Autodesk.Revit.ApplicationServices.Application.OpenDocumentFile(files[0].path);
}
}
}

No, you cannot access the Revit Document class from such an external context. To access it, you need to be in a valid Revit API context:
Use of the Revit API Requires a Valid Context
Valid Revit API Context and External Events
Such a context is either provided by running Revit.exe on your Windows desktop and installing an add-in implementing the requisite Revit API event handlers, or by making use of the Autodesk Platform Services APS (formerly Forge) Design Automation API.

Related

Programmatically open an Excel document with connection to a Tabular Model

I would like to create a spreadsheet programmatically with a connection to my Tabular Model that exists in an Azure Analysis Server when the user clicks on some button. Similar to the option available in Azure to View Tabular Model which creates an odc file which you can open in Excel. My application is hosted on Azure and I am using .NET Core 2.2 as back-end.
I am quite clueless how can I achieve this. Has anyone managed to implement such functionality?
The simplest thing is to just generate and deliver an odc file, which will open with Excel.
First create an .odc file pointing to your AAS server, per docs: Create an Office Data Connection file.
Then add that .odc file to your web app, and serve it through a controller like this:
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using System.IO;
using System.Text;
namespace WebApplication4.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class OdcController : ControllerBase
{
private IHostingEnvironment hostingEnvironment;
public OdcController(IHostingEnvironment env)
{
hostingEnvironment = env;
}
// GET api/values
[HttpGet]
public ActionResult Get()
{
var fp = Path.Combine(_env.ContentRootPath, "model.odc");
var odcText = System.IO.File.ReadAllText(fp);
//optionally modify odcText
return File(Encoding.ASCII.GetBytes(odcText), "application/octet-stream", "model.odc");
}
}
}

Xamarin.Android Cannot pull table from Azure database in Android 10 Q

I did read that because lack of support for Netcore 2.1 the
myItemsList = await App.MobileServiceAndroid.GetTable<MyTable>().ToListAsync();
does not currently work on Android, and there is a workaround to pass an HttpClientHandler() in the constructor of the MobileServiceClient, and so I did like this:
public static MobileServiceClient MobileServiceAndroid =
new MobileServiceClient(AppConstants.AZURE_PRODUCTION_WEB_API_URL, new HttpClientHandler());
But this is incomplete,its still not working, what exactly do I have to do to make this work, any guidance is much appreciated.
From my understanding, you are using a Forms/PCL project whereas the other solution was implementing this code inside their Android project.
For you, once you add using Xamarin.Android.Net; to the class, you should be able to just do this:
public static MobileServiceClient MobileServiceAndroid =
new MobileServiceClient(AppConstants.AZURE_PRODUCTION_WEB_API_URL, new AndroidClientHandler());
Most likely you might have issues getting that using statement, for that you will have to follow steps shown here, or customized for you in the following steps:
Add the Xamarin Forms project to all your projects.
Create an interface ICustomClientHandler in the Core project
using System;
using System.Net.Http;
namespace Test
{
public interface ICustomClientHandler
{
HttpClientHandler GetHandler();
}
}
Then create a CustomClientHandler in the Droid project, which will be the Android part of the dependency service that will help you retrieve the native AndroidClientHandler
using System.Net.Http;
using Xamarin.Android.Net;
using System.Runtime.CompilerServices;
using Xamarin.Forms;
using Test;
[assembly: Xamarin.Forms.Dependency(typeof(Test.Droid.CustomClientHandler))]
namespace Test.Droid
{
public class CustomClientHandler : ICustomClientHandler
{
public HttpClientHandler GetHandler()
{
return new AndroidClientHandler();
}
}
}
Implement an iOS version as well in a similar way, but it will instead return new HttpClientHandler();
Finally, use the code as shown, in your Core project:
var clientHandler = DependencyService.Get<ICustomClientHandler>().GetHandler();
public static MobileServiceClient MobileServiceAndroid =
new MobileServiceClient(AppConstants.AZURE_PRODUCTION_WEB_API_URL, clientHandler);

Where to store ODP.NET Managed Driver Connection Strings?

Finally got ODP.NET configured and the Oracle.ManagedDataAccess DLL referenced in the project.
I was testing with a TNS connection in the code behind in a WPF project (see below).
This question is probably elementary, but I can't find any good information on this, as all examples/jump-starts show embedding the connection string like this.
Is there a better (more common) way to store the connection string for ODP.NET to make it easier to maintain (i.e. it should be a configuration change that doesn't require completely rebuilding the code if it should change)? For example, similar to storing in app.config for SQL Server and IIS?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;
namespace TEST
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private OracleConnection con;
public MainWindow()
{
InitializeComponent();
try
{
con = new OracleConnection("User Id=*****; Password=******; Data Source=******");
con.Open();
}
catch (OracleException oracleErr)
{
MessageBox.Show(oracleErr.Message);
}
finally
{
con.Close();
}
}
}
}
In case you used the tnsnames.ora from the Oracle Client for the unmanaged version then for the managed version you just have to copy the tnsnames to your project directory.

error while de serializing object

i am working on network application, and im sending this object from client to server..
at rcving i get an error.. this is my class of which object im sending
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
namespace DrawingClient
{
[Serializable]
class myClass
{
public List<Point> points = new List<Point>();
}
}
and at rcving exactly where im de serializing the object.. im getting this exception..
Unable To Find Assembly drawing client, version=1.0.0.0, Culture=neutral PublicKeyToken=nulland i have all the assemblies at both server and at client end.. im testing it on my localhost.. mean both client and server are at localhost.. and same namespaces reffered in both applications.. im using tcpclient and tcplistener..
i made a dll in which i placed this class, and than referenced that dll in my Project at both ends and problem is solved..
actually when working with binary serialization assembly information also travels like my project name was rummykhan and my class name of which object i was serializing was book so the assembly information now include rummykhan.book and at client side assembly information is rummykhanclient.book so it was not deserializing.. when i made a dll and referenced it to both ends now assembly information is same and now its working.
PS
another part of information was also traveling along that was version information.. which we can control from the properties of the project.. and it must be same also..

get main window

I am trying to get the main Window of an application written C#.
Application.MainWindow Property does not work :(
uses:
using System;
using System.Windows;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;
using System.Collections.Generic;
using My;
using MyDialogs;
using System.Xml.Serialization;
using System.Runtime.InteropServices;
using System.Windows.Input;
using System.Windows.Media;
using System.Threading;
using System.Windows.Interop;
Do you have a line of code like this in your application anywhere?
Application.Run(new Form1());
Where Form1 is the type of the form that is created when your application starts. This is code created by default when you create a new Windows Forms application. If you want to remember that instance, you just need to store the result in a variable accessible by other classes. For example:
static class Program
{
public static Form1 MainForm;
// ...
static void Main()
{
// ...
MainForm = new Form1();
Application.Run(MainForm);
}
}
I think your application type is Windows Forms application. That follows from you post:
I have this
private static void Main(string[] args) {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
So, you can't use MainWindow object (type of System.Windows.Window), because it's using in WPF. Create new WPF project, and you can acces Application.MainWindow property.

Resources