Showing posts with label tutorial. Show all posts
Showing posts with label tutorial. Show all posts

Friday, April 25, 2014

Revit Tricks - Schedule Detail Component


In some cases I found I need to schedule length for something not modelled as 3d. The best way is to schedule detail component. So it won't interference with other schedules. And can stay in the file for later references. But by default, in revit, you can not direct schedule detail component. There is a way around it by suing annotation symbols to pass the parameters from detail component into Note Block schedule. Refer to below for simple instructions.

1. create a line based detail component.
2. create a fill region to represent the length
3. create an annotation symbol family, make it shared for appering in schedule. create a instance parameter inside it called symLength.
4. load the annotation symbo into detail component family.
5. link length parameter to the symbol symLength parameter.
6. load detail component family into a test project
7. draw several instance of detail family
8. create a note block schedule pick the annotation family crated before. pick symLength to schedule.
9. Now you can have the length from detail component scheduled.

You can do the similar thing for scheduling rectangular area. It may be useful to calculate things in a hurry. Just need to do a formula inside detail component to calculate it first. Then passes it to symbol family for scheduling in note block schedule.

Saturday, March 9, 2013

Revit Python Script Code Example - automatic rename view number in a sheet

hi, I rewrote the code in python script for revit 2012/2013, see how it works in video



the code is below, copy and save the code in a file named "sortSheetViews.py" or whatever. then follow the video to add this script to revit ribbon

import clr
import math
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Architecture import *
from Autodesk.Revit.DB.Analysis import *
from Autodesk.Revit.UI.Selection import *
from Autodesk.Revit.UI import *

uidoc = __revit__.ActiveUIDocument
doc = __revit__.ActiveUIDocument.Document
#selection = list(__revit__.ActiveUIDocument.Selection.Elements)
uidoc = __revit__.ActiveUIDocument
#selection = __revit__.ActiveUIDocument.Selection.Elements
selelementsid=[]
#############################method###################################
#get views in a list
def viewSelectInList():
    sel = uidoc.Selection
    sel.Elements.Clear()
    loopSwitch = 1
    while loopSwitch==1:

        pickedOne = sel.PickObject(ObjectType.Element,"Pick view one by one, pick title block to finish")
        if pickedOne!= None :
            #revit 2013 use the statement below
            e = doc.GetElement(pickedOne.ElementId)
            #revit 2012 use the statement below
            #e = doc.GetElement(pickedOne)
#            TaskDialog.Show("Revit", e.Category.Name)
            if e.Category.Name.Equals("Title Blocks"):
#                TaskDialog.Show("Revit", e.Category.Name)
                loopSwitch = 0
            else:
                selelementsid.append(e.Id)
#                TaskDialog.Show("Revit", e.Category.Name)
        else:
            break
def reNumber (startInt):
    currentNo = startInt
    for eId in selelementsid:
        setViewPortNumber(eId,currentNo)
        currentNo += 1
def getViewByDetailNumber (vs,i):
    for v in vs.Views:
        if v.get_Parameter(BuiltInParameter.VIEWPORT_DETAIL_NUMBER).AsString() != None:
            if i == int(v.get_Parameter(BuiltInParameter.VIEWPORT_DETAIL_NUMBER).AsString()):
                return v
       
def setViewPortNumber (id, number):
    vs = doc.ActiveView
    stringOldNumber=doc.get_Element(id).get_Parameter(BuiltInParameter.VIEWPORT_DETAIL_NUMBER).AsString()
#    print "viewport detail number: ",stringOldNumber
    if int(stringOldNumber) != number:
        if getViewByDetailNumber(vs, number) != None:
            #*****************to be finished here *****************
            getViewByDetailNumber(vs, number).get_Parameter(BuiltInParameter.VIEWPORT_DETAIL_NUMBER).Set("999")
            doc.get_Element(id).get_Parameter(BuiltInParameter.VIEWPORT_DETAIL_NUMBER).Set(str(number))
            getViewByDetailNumber(vs, 999).get_Parameter(BuiltInParameter.VIEWPORT_DETAIL_NUMBER).Set(stringOldNumber)
        else:
            doc.get_Element(id).get_Parameter(BuiltInParameter.VIEWPORT_DETAIL_NUMBER).Set(str(number))
#define a transaction variable and describe the transaction
t = Transaction(doc,'Sort Views in Sheet')

#start a transaction in the Revit database
t.Start()

#************ ADD YOUR OWN CODES HERE.******************
x = int(raw_input ("number start from: "))
viewSelectInList()
reNumber ( x )


#print "finished"
   
#************** END OF YOUR MAJOR CODES HERE.*********************
#commit the transaction to the Revit database
t.Commit()

#close the script window
__window__.Close()

the above video teachs how to add such scripts to revit ribbon

Sunday, December 16, 2012

revit 2012 Application macro set up tutorials

Revit application macro is easy to develop using vsta. And easy to debug. If you are not aiming to sell your program, and not care about sharing the source code, it is a good and time saving tool. To deploy it is as easy as copying you module file under your revit.
The main tricks for setting up revit application Macro is reference passing. In ThisApplication.cs , the module class, you need to pass 'this',which is the running application itself to your macro class.

In your macro class, you need to define 3 variables,
1. m_app point to running application
2. m_uidoc point to active uidocument , you can use it to get user selection, etc.
3. m_doc point to current active document, the opening revit file you want to modify.

now is the form class, the user interface to take user input if necessary. it is created as an object inside your macro class. just make the controls (elements) public for easy access from macro class. for example:
mainFrame.Textbox1.Text will return you the text input from textbox1(a text field)
also when create this form in macro class, you need to pass macro class itself to it using 'this' key word. the corresponding variable in form class is m_dataBuffer. if you want to access macro class, you can call m_dataBuffer.methodYouWant().

overall, you need 3 files, ThisApplication.cs is created for you by macro manager. ClassMacro.cs for put your business logic(thing to do, to interactive with revit file), Form.cs to interactive with user. put classmacro and form file in a folder for easy management in future.

 below are video tutorials: