You are on page 1of 248

Machine Translated by Google

API nền tảng Revit 2014

Nguyên tắc dành cho nhà phát triển

Keldar67@gmail.com
Machine Translated by Google

Mục lục

Nhà phát triển

• Giới thiệu

Chào mừng bạn đến với API Nền tảng Revit

Bạn có thể làm gì với API nền tảng Revit Yêu cầu

Cài đặt

Ngôn ngữ lập trình được hỗ trợ

Hướng dẫn sử dụng

Công ước về tài liệu

Có gì mới trong bản phát hành này

o Bắt đầu

Hướng dẫn Hướng

dẫn: Hello World Hướng dẫn: Thêm

bảng điều khiển ruy-băng Hello World Hướng dẫn: Truy

xuất các phần tử đã chọn Hướng dẫn: Truy xuất các phần

tử đã lọc

o Tích hợp bổ trợ

Tổng quan

Lệnh bên ngoài

Ứng dụng bên ngoài Đăng

ký bổ trợ Bản địa hóa

Thuộc tính

Revit Exceptions

Ribbon Panels and Controls

Hộp thoại tác vụ Revit Style

Ứng dụng bên ngoài cấp DB o Ứng dụng

và tài liệu Chức năng ứng dụng • Kiểm soát kỷ

luật • Cách sử dụng thuộc tính Ứng dụng

để thực thi phiên bản chính xác

cho bổ trợ của bạn

Chức năng tài liệu

Quản lý tài liệu và tệp tin Cài đặt

Đơn vị

o Yếu tố cần thiết

Phân loại phần tử

Các phân loại khác

Truy xuất phần tử

Thuộc tính chung

• Tương tác cơ bản với các phần tử Revit

o Lọc

Tạo một FilteredElementCollector

Áp dụng bộ lọc Lấy

các phần tử được lọc hoặc id phần tử

Truy vấn LINQ

Các bộ lọc Bound Box Bộ

lọc Giao nhau Phần tử

o Lựa chọn

Thay đổi lựa chọn

Lựa chọn người dùng

Lựa chọn người dùng được lọc

o Các thông số

Hướng dẫn: Nhận các tham số phần tử đã chọn Định nghĩa

Tham số nội trang

Các kiểu lưu trữ

asValueString () và SetValueString () Mối

quan hệ tham số Thêm tham số vào phần tử


Machine Translated by Google

o Bộ sưu tập

Giao diện

Bộ sưu tập và Trình lặp lại

o Phần tử chỉnh sửa

Phần tử di chuyển

Phần tử sao chép Phần

tử quay Phần tử căn

chỉnh Phần tử phản

chiếu Phần tử nhóm

Tạo mảng của phần tử Xóa

phần tử Phần tử được ghim

o Lượt xem

Về lượt xem

Các kiểu xem

• Tổng quan

• View3D

• ViewPlan

• ViewDrafting

• ViewSelection

• ViewSheet

• ViewSchedule

o Tạo lịch biểu o Làm việc

với ViewSchedule o TableView và

TableData

Xem bộ lọc

Xem phần cắt Các

khung nhìn được sắp xếp

UIView

• Các yếu tố hình học Revit

o Tường, Sàn nhà, Trần nhà, Mái nhà và Khe hở

Tường

Sàn nhà, trần nhà và nền móng Mái nhà

Rèm cửa

Các yếu tố khác

Cấu trúc phức hợp Mở

đầu Thuộc tính nhiệt o

Phiên bản gia đình Phần

tử nhận dạng Gia đình Phiên bản

gia đình Mẫu mã

FamilySymbol o Tài liệu gia

đình Giới thiệu về tài

liệu gia đình Tạo phần tử

trong gia đình

• Tạo một phần tử biểu mẫu

• Tạo chú thích

Khả năng hiển thị của các phần tử

gia đình Quản lý các loại và thông số gia đình

o Thiết kế khái niệm

Đối tượng điểm và đường cong

Biểu mẫu

Hợp lý hóa bề mặt Các

thành phần thích ứng o Datum

và các phần tử thông tin

Các cấp độ

Lưới

Giai đoạn

Tùy chọn thiết kế


Machine Translated by Google

o Phần tử chú thích

Kích thước và ràng buộc

Đường cong chi tiết

Thẻ

Văn bản

Ký hiệu chú thích o

Hình học

Ví dụ: Lấy dữ liệu hình học từ tường Lớp đối tượng

hình học

• Đường cong

o Phân tích đường

cong o Tập hợp đường cong

o Tạo đường cong

o Tham số đường cong

o Các loại đường

cong o Các biểu diễn toán học của các loại đường cong

• GeometryInstances • Meshes

• Điểm

• PolyLines •

Chất rắn, Mặt và Cạnh

o Tham số hóa cạnh và mặt

o Khuôn mặt

o Phân tích khuôn

mặt o Phân tách

khuôn mặt o Các

dạng khuôn mặt o Biểu diễn toán học của các dạng khuôn

mặt o Phân tích đặc

o Tạo khối và tạo mặt

Lớp người trợ giúp hình học

Các lớp thu thập

Ví dụ: Lấy dữ liệu hình học từ chùm tia Phân tích đùn

vật rắn Tìm hình học bằng phép chiếu tia Các lớp tiện

ích hình học Phòng và hình học không gian

o Phác thảo

Lớp phác thảo 2D

Lớp phác thảo 3D

Đường cong mô hình

o Chất liệu

Thông tin vật liệu chung

Quản lý nguyên vật liệu

Nguyên liệu yếu tố

Số lượng vật liệu Vẽ

mặt của một phần tử o Cầu thang và lan

can Tạo và chỉnh sửa cầu thang Lan can Chú

thích cầu thang

Các thành phần bậc

thang • Chức năng cụ thể theo kỷ luật

o Kiến trúc Revit

Phòng

o Cấu trúc Revit

Phần tử mô hình cấu trúc

Mô hình phân tích

Tải trọng

Liên kết phân

tích Liên kết phân tích


Machine Translated by Google

o Revit MEP

Tạo phần tử MEP

• Tạo đường ống và ống dẫn •

Phần giữ chỗ

• Hệ thống

Đầu nối

Tạo gia đình Cài

đặt cơ khí Cài đặt điện

Tùy chọn định tuyến

• Chu đê nâng cao

o Lưu trữ dữ liệu trong mô hình Revit

Các thông số được chia sẻ

Tệp định nghĩa

Truy cập tệp định nghĩa

Ràng buộc

Lưu trữ có thể mở rộng

o Giao dịch

Các lớp giao dịch

Giao dịch trong sự kiện

Các tùy chọn xử lý lỗi Lấy

phần tử Geometry and AnalyticalModel Temporary Transations

o Sự kiện

Sự kiện cơ sở dữ liệu

• Sự kiện DocumentChanged

Sự kiện giao diện người dùng

Đăng ký sự kiện Huỷ

sự kiện

o Sự kiện bên ngoài

o Các ngăn hộp thoại có thể

gắn được o Cập nhật mô hình động

Triển khai IUpdater Phương

thức Execute

Đăng ký cập nhật Tiếp

xúc với người dùng cuối

o Lệnh

o Đăng và xử lý lỗi Đăng không thành

công Xử lý lỗi o Cố vấn

hiệu suất

o Mây điểm

Máy khách đám mây điểm

Công cụ đám mây điểm

o Phân tích Dữ liệu năng lượng

Trực quan hóa phân tích

• Người quản lý kết quả phân tích •

Tạo dữ liệu kết quả phân tích • Hiển thị

kết quả Anlaysis • Cập nhật kết quả phân

tích Phân tích năng lượng khái niệm

Mô hình phân tích năng lượng chi tiết

o Địa điểm và Vị trí

Địa điểm

Thành

phố Vị trí dự án

Vị trí dự án o Chia sẻ

công việc Các phần tử trong tập

hợp

Quyền sở hữu phần tử Mở

tài liệu chia sẻ công việc Khả năng hiển

thị và hiển thị

Trang tính

Quản lý tệp dùng chung


Machine Translated by Google

o Mô hình xây dựng

Tập hợp và khung nhìn

Các bộ phận

o Các tập tin được liên kết

Liên kết Revit

Quản lý các tập tin bên ngoài

o Xuất khẩu Xuất bảng Xuất IFC Xuất

tùy chỉnh

• Phụ lục o Bảng

thuật ngữ

Mảng

BIM

Lớp

Sự kiện

Trình lặp lại

Phương pháp

Không gian tên

Nạp chồng

Thuộc tính

Gia đình Revit

Tham số Revit

Các loại Revit

Bộ

Yếu tố ED

UID phần tử

o Câu hỏi thường gặp

Câu hỏi chung

Câu hỏi về cấu trúc Revit

o Hello World cho VB.Net

Tạo một dự án mới Thêm

tham chiếu và không gian tên Thay đổi

tên lớp Thêm mã

Tạo tệp kê khai * .addin

Xây dựng chương trình

Gỡ lỗi chương trình

o Thuộc tính vật liệu Đơn vị bên trong

o Định nghĩa phần bê tông

Dầm hình chữ nhật bê tông Dầm

hình chữ nhật đúc sẵn Dầm hình chữ

L đúc sẵn Tee đúc sẵn

Tee đúc sẵn

Áo thun đôi đúc sẵn

o Nguyên tắc giao diện người dùng API

Giới thiệu

Nhất quán Nói

ngôn ngữ người dùng Bố cục tốt

Giá trị mặc định tốt

Tiết lộ lũy tiến

Bản địa hóa giao diện người dùng

Nguyên tắc đối thoại

Nguyên tắc về ruy-băng

Các định nghĩa chung

Định nghĩa thuật ngữ

Lưu ý: Nội dung của tài liệu này được sao chép từ http://wikihelp.autodesk.com/Revit/enu/2014/Help/3665-Developers trang web vào ngày 16 & 17/11/2013 và được cập nhật cho đến thời điểm đó. Bản

quyền và quyền sở hữu của thông tin chứa bên trong vẫn theo các thông báo bản quyền ban đầu trên trang web. Tài liệu này đã được tập hợp lại cho mục đích đọc ngoại tuyến và mục đích giáo dục

và chỉ nên được sử dụng cho mục đích này. Bằng cách đọc thêm, bạn đồng ý tôn trọng tất cả luật bản quyền và quyền sở hữu. Cảm ơn bạn

Hầu hết các liên kết được sao chép sẽ trực tiếp quay trở lại vị trí nguồn ban đầu trên internet thay vì nội bộ trong tài liệu, do đó, sự khác biệt có thể xảy ra tùy thuộc vào cập nhật thông tin
Machine Translated by Google

Nhà phát triển

Hướng dẫn dành cho nhà phát triển API này mô tả cách sử dụng giao diện lập trình ứng dụng (API) cho Autodesk Revit 2014.

Các chủ đề trong phần này

• Giới thiệu

• Tương tác cơ bản với các phần tử Revit

• Các yếu tố hình học Revit

• Chức năng cụ thể theo kỷ luật • Chủ đề nâng

cao • Phụ lục


Machine Translated by Google

Giới thiệu

Chào mừng bạn đến với API nền tảng Revit

Tất cả các sản phẩm dựa trên Revit đều là các công cụ Mô hình Thông tin Xây dựng Tham số (BIM). Các công cụ này tương tự như các chương trình Thiết kế có sự hỗ trợ
của Máy tính (CAD) nhưng được sử dụng để xây dựng các mô hình 3D cũng như các bản vẽ 2D. Trong Revit, bạn đặt các yếu tố trong thế giới thực như cột và tường vào
mô hình. Sau khi xây dựng mô hình, bạn có thể tạo các dạng xem mô hình chẳng hạn như các phần và chú thích. Chế độ xem được tạo ra từ mô hình vật lý 3D; do đó, các
thay đổi được thực hiện trong một chế độ xem sẽ tự động lan truyền qua tất cả các chế độ xem. Điều này hầu như loại bỏ nhu cầu cập nhật nhiều bản vẽ và chi tiết khi
bạn thực hiện các thay đổi đối với mô hình.

Giới thiệu về API nền tảng Revit

Revit .NET API cho phép bạn lập trình với bất kỳ ngôn ngữ tuân thủ .NET nào bao gồm Visual Basic.NET, C # và C ++ / CLI.

Revit Architecture 2013, Revit Structure 2013 và Revit MEP 2013 đều chứa API Nền tảng Revit để bạn có thể tích hợp các ứng dụng của mình vào Revit. Ba API
rất giống nhau và được gọi chung là API Nền tảng Revit. Trước khi sử dụng API, hãy tìm hiểu cách sử dụng Revit và các tính năng của nó để bạn có thể hiểu rõ hơn
về các lĩnh vực liên quan liên quan đến lập trình của bạn. Học Revit có thể giúp bạn:

• Duy trì tính nhất quán với giao diện người dùng Revit và các lệnh.

• Thiết kế ứng dụng bổ trợ của bạn một cách liền mạch.

• Làm chủ các lớp API và các thành viên trong lớp một cách hiệu quả và hiệu quả.

Nếu bạn chưa quen với Revit hoặc BIM, hãy tìm hiểu thêm trong trung tâm sản phẩm Revit tại www.autodesk.com/revit.

Bạn có thể làm gì với API nền tảng Revit?

Bạn có thể sử dụng API Nền tảng Revit để:

• Có được quyền truy cập vào dữ liệu đồ họa mô hình.

• Có được quyền truy cập vào dữ liệu tham số mô hình.

• Tạo, chỉnh sửa và xóa các phần tử mô hình như sàn, tường, cột, v.v.

• Tạo phần bổ trợ để tự động hóa các tác vụ lặp đi lặp lại.

• Tích hợp các ứng dụng vào các sản phẩm dọc dựa trên Revit. Các ví dụ bao gồm liên kết cơ sở dữ liệu quan hệ bên ngoài với Revit hoặc gửi
dữ liệu mô hình cho một ứng dụng phân tích.

• Thực hiện phân tích tất cả các loại bằng BIM.

• Tự động tạo tài liệu dự án.

Yêu cầu

Để xem hướng dẫn sử dụng, bạn cần những điều sau:

1. Hiểu biết về Revit Architecture 2013, Revit Structure 2013 hoặc Revit MEP 2013.

2. Quen thuộc với ngôn ngữ tuân thủ Thông số ngôn ngữ chung như C # hoặc VB.NET.

3. Microsoft Visual Studio 2010 hoặc Microsoft Visual Studio 2010 Express Edition. Ngoài ra, bạn có thể sử dụng SharpDevelop cài sẵn
môi trường phát triển trong Revit.

4. Microsoft .NET Framework 4.0.

5. Bộ công cụ dành cho nhà phát triển phần mềm Revit (SDK) mà bạn có thể tải xuống từ Mạng nhà phát triển Autodesk (ADN) hoặc Revit
CD / DVD cài đặt (<DVD_Drive>: \ Utilities \ Common \ Software Development Kit).

Cài đặt

API Nền tảng Revit được cài đặt với Kiến trúc Revit, Cấu trúc Revit và Revit MEP. Mọi ứng dụng dựa trên .NET sẽ tham chiếu đến RevitAPI.dll và RevitAPIUI.dll nằm
trong thư mục Chương trình Revit. RevitAPI.dll chứa các phương thức được sử dụng để truy cập ứng dụng, tài liệu, phần tử và tham số của Revit ở cấp cơ sở dữ
liệu. RevitAPIUI.dll chứa các giao diện liên quan đến thao tác và tùy chỉnh giao diện người dùng Revit.
Machine Translated by Google

Ngôn ngữ lập trình được hỗ trợ

API nền tảng Revit hoàn toàn có thể truy cập được bằng bất kỳ ngôn ngữ nào tương thích với Microsoft .NET Framework 4.0, chẳng hạn như Visual Basic .NET hoặc Visual C #.

Hướng dẫn sử dụng

Tài liệu này là một phần của Revit SDK. Nó cung cấp giới thiệu về việc triển khai các ứng dụng bổ trợ Revit bằng cách sử dụng API Nền tảng Revit.

Trước khi tạo ứng dụng bổ trợ Revit Platform API, hãy đọc kỹ hướng dẫn sử dụng và thử mã mẫu. Nếu bạn đã có một số kinh nghiệm với API Nền tảng Revit, bạn có thể chỉ muốn xem
lại phần Ghi chú và Khắc phục sự cố.

Giới thiệu về API nền tảng Revit

Hai chương đầu tiên giới thiệu về API Nền tảng Revit và cung cấp tổng quan về Hướng dẫn sử dụng.

Chào mừng bạn đến với API nền tảng Revit - Trình bày phần giới thiệu về API Nền tảng Revit và kiến thức tiên quyết cần thiết trước khi bạn tạo phần bổ
trợ đầu tiên của mình.

Bắt đầu - Hướng dẫn từng bước để tạo ứng dụng bổ trợ Hello World đầu tiên của bạn bằng Visual Studio 2010 và bốn hướng dẫn khác bao gồm các chức năng bổ trợ chính.

Chủ đề cơ bản

Các chương này bao gồm các cơ chế và chức năng cơ bản của API Nền tảng Revit.

Tích hợp bổ trợ - Thảo luận về cách một phần bổ trợ được tích hợp vào Revit UI và được gọi bằng lệnh của người dùng hoặc các sự kiện Revit cụ thể như khởi
động chương trình.

Ứng dụng và Tài liệu - Các lớp Ứng dụng và Tài liệu tương ứng đại diện cho ứng dụng Revit và tệp dự án trong API Nền tảng Revit. Chương này giải thích các khái niệm cơ bản và các
liên kết đến các chương và phần thích hợp.

Yếu tố cơ bản - Phần lớn dữ liệu trong một dự án Revit nằm trong tập hợp các Phần tử. Chương này thảo luận về cơ chế, phân loại và các tính năng thiết yếu của Phần tử.

Lọc - Lọc được sử dụng để lấy một tập hợp các phần tử từ tài liệu.

Lựa chọn - Làm việc với tập hợp các phần tử đã chọn trong một tài liệu

Thông số - Hầu hết thông tin Phần tử được lưu trữ dưới dạng Tham số. Chương này thảo luận về chức năng của Tham số.

Bộ sưu tập - Các loại bộ sưu tập tiện ích như Mảng, Bản đồ, Bộ sưu tập và các Bộ lặp có liên quan.

Chủ đề yếu tố

Các phần tử được giới thiệu dựa trên phân loại phần tử. Đảm bảo rằng bạn đã đọc các chương Yếu tố cần thiết và Thông số trước khi đọc về các yếu tố riêng lẻ.

Phần tử chỉnh sửa - Học cách di chuyển, xoay, xóa, nhân bản, nhóm và các phần tử mảng.

Tường, Sàn, Mái và Khe hở - Thảo luận về các Phần tử, các Loại phần tử tương ứng của chúng đại diện cho cấu trúc địa điểm được tích hợp sẵn và các loại Mở khác nhau trong API.

Phiên bản gia đình - Tìm hiểu về mối quan hệ giữa gia đình và bản sao gia đình, các tính năng của bản sao gia đình và gia đình cũng như cách tải hoặc tạo chúng.

Tạo gia đình - Tìm hiểu về việc tạo và sửa đổi các tài liệu Revit Family.

Thiết kế mẫu - Thảo luận về cách tạo các dạng và hình học phức tạp trong tài liệu Revit Conceptual Mass.

Datum và phần tử thông tin - Tìm hiểu cách thiết lập lưới, thêm cấp độ, sử dụng các tùy chọn thiết kế, v.v.

Phần tử chú thích - Thảo luận về chú thích tài liệu bao gồm thêm kích thước, đường cong chi tiết, thẻ và ký hiệu chú thích.

Phác thảo - Các chức năng phác thảo bao gồm các lớp phác thảo 2D và 3D như SketchPlane, ModelCurve, GenericForm, v.v.

Lượt xem - Tìm hiểu về các cách khác nhau để xem các mô hình và thành phần cũng như cách thao tác với chế độ xem trong API.

Vật chất - Dữ liệu vật liệu là một Yếu tố xác định các vật liệu vật lý được sử dụng trong dự án cũng như kết cấu, màu sắc và hơn thế nữa.
Machine Translated by Google

Chu đê nâng cao

Hình học - Thảo luận về các loại liên quan đến đồ họa trong API được sử dụng để mô tả biểu diễn đồ họa của mô hình bao gồm ba lớp mô tả và lưu trữ
thông tin hình học.

Địa điểm và Vị trí - Xác định vị trí dự án bao gồm thành phố, quốc gia, vĩ độ và kinh độ.

Các thông số được chia sẻ - Tham số dùng chung là các tệp văn bản bên ngoài chứa các đặc tả tham số. Chương này giới thiệu cách truy cập vào các tham số được
chia sẻ thông qua API Nền tảng Revit.

Giao dịch - Giới thiệu hai cách sử dụng cho Giao dịch và các giới hạn mà bạn phải xem xét khi sử dụng Giao dịch.

Sự kiện - Thảo luận về cách tận dụng các Sự kiện Revit.

Cập nhật mô hình động - Học cách sử dụng các trình cập nhật để sửa đổi mô hình theo những thay đổi trong tài liệu.

Đăng và xử lý lỗi - Học cách đăng lỗi và tương tác với cơ chế xử lý lỗi của Revit.

Hình ảnh phân tích - Cách hiển thị kết quả phân tích trong một dự án Revit.

Sản phẩm cụ thể

Các sản phẩm Revit bao gồm Revit Architecture, Revit Structure và Revit MEP. Một số API chỉ hoạt động trong các sản phẩm cụ thể.

Kiến trúc Revit - Thảo luận về các API cụ thể cho Revit Architecture.

Cấu trúc Revit - Thảo luận về các API cụ thể cho Revit Structure.

Revit MEP - Thảo luận về các API cụ thể cho Revit MEP.

Khác

ruột thừa - Thông tin bổ sung như Câu hỏi thường gặp, Sử dụng Visual Basic.Net để lập trình, v.v.

Quy ước về Tài liệu

Tài liệu này chứa các tên lớp ở định dạng không gian tên, chẳng hạn như Autodesk.Revit.DB.Element. Trong C ++ / CLI Autodesk.Revit.Element là Autodesk ::
Revit :: DB :: Element. Vì chỉ C # được sử dụng cho mã mẫu trong sách hướng dẫn này, nên không gian tên mặc định là Autodesk.Revit.DB. Nếu bạn muốn xem mã
trong Visual Basic, bạn sẽ tìm thấy một số ứng dụng VB.NET trong thư mục Mẫu SDK.

Thuộc tính được lập chỉ mục

Một số thuộc tính lớp API nền tảng Revit được "lập chỉ mục" hoặc được mô tả là quá tải trong tệp trợ giúp API (RevitAPI.chm). Ví dụ, thuộc tính
Element.Geometry. Trong văn bản của tài liệu này, chúng được gọi là thuộc tính, mặc dù bạn truy cập chúng như thể chúng là các phương thức trong mã C #
bằng cách chờ trước tên thuộc tính bằng "get_" hoặc "set_". Ví dụ, để sử dụng thuộc tính Element.Geometry (Options), bạn sử dụng Element.get_Geometry (Options).

Có gì mới trong bản phát hành này

Vui lòng xem phần "Có gì mới" trong Revit 2012 API.chm để biết thông tin về các thay đổi và tính năng mới.
Machine Translated by Google

Bắt đầu

API nền tảng Revit hoàn toàn có thể truy cập được bằng bất kỳ ngôn ngữ nào tương thích với Microsoft .NET Framework 4.0, chẳng hạn như Visual C # hoặc Visual
Basic .NET (VB.NET). Cả Visual C # và VB.NET đều thường được sử dụng để phát triển các ứng dụng Revit Platform API. Tuy nhiên, trọng tâm của sách hướng dẫn này là
phát triển các ứng dụng bằng Visual C #.

Hướng dẫn

Nếu bạn chưa quen với API Nền tảng Revit, các chủ đề sau là điểm khởi đầu tốt để giúp bạn hiểu sản phẩm. Hướng dẫn cung cấp hướng dẫn từng bước cho các tình
huống phổ biến, giúp bạn tìm hiểu về sản phẩm hoặc một tính năng cụ thể. Các hướng dẫn sau đây sẽ giúp bạn bắt đầu sử dụng API nền tảng Revit:

Hướng dẫn: Hello World - Minh họa cách tạo bổ trợ bằng API Nền tảng Revit.

Hướng dẫn: Thêm Bảng điều khiển ruy-băng Hello World - Minh họa cách thêm bảng điều khiển ruy-băng tùy chỉnh.

Hướng dẫn: Truy xuất các phần tử đã chọn - Minh họa cách lấy các phần tử đã chọn.

Hướng dẫn: Truy xuất các phần tử đã lọc - Minh họa cách lấy các phần tử dựa trên các tiêu chí của bộ lọc.
Machine Translated by Google

Hướng dẫn: Hello World

Sử dụng API nền tảng Revit và C # để tạo chương trình Hello World theo hướng dẫn được cung cấp. Để biết thông tin về cách tạo ứng dụng bổ trợ bằng
VB.NET, hãy tham khảo Hello World dành cho VB.NET.

Hướng dẫn Hello World bao gồm các chủ đề sau:

• Tạo một dự án mới.

• Thêm tài liệu tham khảo.

• Thay đổi tên lớp.

• Viết mã

• Gỡ lỗi bổ trợ.

Tất cả các hoạt động và mã trong phần này được tạo bằng Visual Studio 2010.

Tạo một dự án mới

Bước đầu tiên khi viết một chương trình C # với Visual Studio là chọn một loại dự án và tạo một Thư viện Lớp mới.

1. Từ menu Tệp, chọn Dự án Mới….

2. Trong khung Mẫu đã cài đặt, hãy nhấp vào Visual C #.

3. Trong khung bên phải, nhấp vào Thư viện Lớp (xem Hình 1: Thêm dự án mới bên dưới). Hướng dẫn này giả định rằng dự án
vị trí là: D: \ Mẫu.

4. Trong trường Tên, nhập HelloWorld làm tên dự án.

5. Bấm OK.

Hình 1: Thêm dự án mới


Machine Translated by Google

Thêm tài liệu tham khảo

1. Để thêm tham chiếu RevitAPI:

o Từ menu View, chọn Solution Explorer nếu cửa sổ Solution Explorer không mở.

o Trong Trình khám phá Giải pháp, bấm chuột phải vào Tham chiếu để hiển thị menu ngữ cảnh.

o Từ menu ngữ cảnh, nhấp vào Thêm tài liệu tham khảo. Hộp thoại Thêm tham chiếu xuất hiện.

o Trong hộp thoại Thêm Tham chiếu, nhấp vào tab Duyệt qua. Định vị thư mục nơi Revit được cài đặt và nhấp vào RevitAPI.dll. Ví dụ, vị trí thư mục
được cài đặt thường là C: \ Program Files \ Autodesk \ Revit Architecture 2012 \ Program \ RevitAPI.dll.

o Bấm OK để chọn .dll và đóng hộp thoại. RevitAPI xuất hiện trong cây tham chiếu Solution Explorer.

o Lưu ý: Bạn nên luôn đặt thuộc tính Copy Local của RevitAPI.dll thành false cho các dự án mới. Điều này giúp tiết kiệm dung lượng ổ đĩa và
ngăn trình gỡ lỗi Visual Studio nhầm lẫn về việc sử dụng bản sao DLL nào. Bấm chuột phải vào RevitAPI.dll, chọn Thuộc tính và thay đổi cài đặt
Sao chép cục bộ từ true (mặc định) thành false.

2. Lặp lại các bước trên cho RevitAPIUI.dll.

Thêm mã

Thêm mã sau để tạo bổ trợ:

Vùng mã 2-1: Bắt đầu

sử dụng Hệ thống;

sử dụng Autodesk.Revit.UI;
sử dụng Autodesk.Revit.DB;
không gian tên HelloWorld
[Autodesk.Revit.Attributes.Transaction (Autodesk.Revit.Attributes.TransactionMode.Automatic)]
lớp công khai Class1: IExternalCommand
{
{
public Autodesk.Revit.UI.Result Execute (ExternalCommandData revit,
thông báo chuỗi tham chiếu, các phần tử ElementSet)
{
TaskDialog.Show ("Revit", "Hello World");
trả về Autodesk.Revit.UI.Result.Succeeded;
}
}
}

Mẹo: Tính năng Visual Studio Intellisense có thể tạo ra một giao diện triển khai khung cho bạn, thêm phần sơ khai cho tất cả các phương thức được yêu cầu.
Sau khi bạn thêm ": IExternaCommand" sau Class1 trong ví dụ trên, bạn có thể chọn "Triển khai IExternalCommand" từ menu Intellisense để lấy mã:

Hình 2: Sử dụng Intellisense để triển khai giao diện

Mọi ứng dụng bổ trợ Revit phải có một lớp điểm đầu vào triển khai giao diện IExternalCommand và bạn phải triển khai phương thức Execute (). Phương thức
Execute () là điểm vào của ứng dụng bổ trợ tương tự như phương thức Main () trong các chương trình khác.
Định nghĩa lớp điểm nhập bổ trợ được chứa trong một hợp ngữ. Để biết thêm chi tiết, hãy tham khảo Tích hợp bổ trợ.

Xây dựng chương trình

Sau khi hoàn thành mã, bạn phải xây dựng tệp. Từ menu Xây dựng, nhấp vào Giải pháp Xây dựng. Đầu ra từ bản dựng xuất hiện trong cửa sổ Đầu ra cho biết rằng dự
án được biên dịch không có lỗi.

Tạo tệp kê khai .addin

Tệp HelloWorld.dll xuất hiện trong thư mục đầu ra của dự án. Nếu bạn muốn gọi ứng dụng trong Revit, hãy tạo tệp kê khai để đăng ký ứng dụng đó vào Revit.

1. Để tạo tệp kê khai, hãy tạo tệp văn bản mới trong Notepad.
Machine Translated by Google

2. Thêm văn bản sau:

Vùng mã 2-2: Tạo tệp kê khai .addin cho lệnh bên ngoài
<? xml version = "1.0" encoding = "utf-8" standalone = "no"?>
<RevitAddIns>

<AddIn Type = "Lệnh">

<Assembly> D: \ Sample \ HelloWorld \ bin \ Debug \ HelloWorld.dll </Assembly>


<AddInId> 239BD853-36E4-461f-9171-C5ACEDA4E721 </AddInId>

<FullClassName> HelloWorld.Class1 </FullClassName>

<Text> HelloWorld </Text>

<VendorId> ADSK </VendorId>

<VendorDescription> Autodesk, www.autodesk.com </VendorDescription> </AddIn>

</RevitAddIns>

3. Lưu tệp dưới dạng HelloWorld.addin và đặt nó vào vị trí sau:

o Đối với Windows XP - C: \ Documents and Settings \ All Users \ Application Data \ Autodesk \ Revit \ Addins \ 2012 \

o Đối với Vista / Windows 7 - C: \ ProgramData \ Autodesk \ Revit \ Addins \ 2012 \

o Nếu dll lắp ráp ứng dụng của bạn nằm trên một mạng chia sẻ thay vì ổ cứng cục bộ của bạn, bạn phải sửa đổi Revit.exe.config để cho phép các
cụm .NET bên ngoài máy cục bộ của bạn được tải. Trong nút "thời gian chạy" trong Revit.exe.config, thêm phần tử <loadFromRemoteSources
enable = "true" /> "như được hiển thị bên dưới. O <runtime>

o <createPublisherEvidence enable = "false" />


o <loadFromRemoteSources đã bật = "true" />
</runtime>

Tham khảo Tích hợp bổ trợ để biết thêm chi tiết bằng cách sử dụng tệp kê khai.

Gỡ lỗi bổ trợ

Chạy chương trình ở chế độ Gỡ lỗi sử dụng các điểm ngắt để tạm dừng chương trình để bạn có thể kiểm tra trạng thái của các biến và đối tượng. Nếu có lỗi,
bạn có thể kiểm tra các biến khi chương trình chạy để suy ra lý do tại sao giá trị không như bạn mong đợi.

1. Trong cửa sổ Solution Explorer, nhấp chuột phải vào dự án HelloWorld để hiển thị menu ngữ cảnh.

2. Từ menu ngữ cảnh, nhấp vào Thuộc tính. Cửa sổ Thuộc tính xuất hiện.

3. Nhấp vào tab Gỡ lỗi.

4. Trong phần Bắt đầu Hành động, bấm Khởi động chương trình bên ngoài và duyệt đến tệp Revit.exe. Theo mặc định, tệp nằm ở đường dẫn sau, C: \ Program
Files \ Autodesk \ Revit Structure 2012 \ Program \ Revit.exe.
Machine Translated by Google

Hình 3: Đặt môi trường gỡ lỗi

5. Từ menu Gỡ lỗi, chọn Toggle Breakpoint (hoặc nhấn F9) để đặt điểm ngắt trên dòng sau.

TaskDialog.Show ("Revit", "Hello World");

6. Nhấn F5 để bắt đầu quy trình gỡ lỗi.

Kiểm tra gỡ lỗi:

• Trên tab Phần bổ trợ, HelloWorld xuất hiện trong nút menu Công cụ Bên ngoài.

Hình 4: Lệnh HelloWorld External Tools

• Nhấp vào HelloWorld để thực thi chương trình, kích hoạt điểm ngắt.

• Nhấn F5 để tiếp tục thực hiện chương trình. Thông báo hệ thống sau sẽ xuất hiện.

Hình 5: Thông báo TaskDialog

Xử lý sự cố

H: Ứng dụng bổ trợ của tôi sẽ không biên dịch.

Đáp: Nếu lỗi xuất hiện khi bạn biên dịch mã mẫu, thì vấn đề có thể là với phiên bản RevitAPI được sử dụng để biên dịch phần bổ trợ.
Xóa tham chiếu RevitAPI cũ và tải tham chiếu mới. Để biết thêm chi tiết, hãy tham khảo Thêm tài liệu tham khảo.

H: Tại sao không có tab Bổ trợ hoặc tại sao ứng dụng bổ trợ của tôi không được hiển thị trong Công cụ bên ngoài?

Đ: Trong nhiều trường hợp, nếu một ứng dụng bổ trợ không tải được, Revit sẽ hiển thị hộp thoại lỗi khi khởi động với thông tin về lỗi đó. Ví dụ: nếu không
tìm thấy DLL bổ trợ ở vị trí được chỉ định trong tệp kê khai, một thông báo tương tự như sau sẽ xuất hiện.

Hình 6: Thông báo Lỗi Công cụ Bên ngoài

Thông báo lỗi cũng sẽ được hiển thị nếu không tìm thấy tên lớp được chỉ định trong ECClassName hoặc không kế thừa từ IExternalCommand.
Machine Translated by Google

Tuy nhiên, trong một số trường hợp, một ứng dụng bổ trợ có thể không tải mà không có bất kỳ thông báo nào. Các nguyên nhân có thể bao gồm:

• Ứng dụng bổ trợ được biên dịch với một phiên bản RevitAPI khác

• Không tìm thấy tệp kê khai

• Có lỗi định dạng trong tệp kê khai .addin

H: Tại sao ứng dụng bổ trợ của tôi không hoạt động?

Đ: Mặc dù ứng dụng bổ trợ của bạn có sẵn trong Công cụ bên ngoài, nó có thể không hoạt động. Điều này thường được gây ra bởi một ngoại lệ trong mã.

Ví dụ:

Vùng mã 2-3: Ngoại lệ trong Execute ()

Lệnh: IExternalCommand

{
A a = new A (); // dòng x
public IExternalCommand.Result Execute () {

//…

}
}
Hạng A

{
//…

Hai ngoại lệ sau xác định rõ ràng vấn đề:

• Lỗi ở dòng x

• Một ngoại lệ được đưa ra trong phương thức Execute ().

Revit sẽ hiển thị hộp thoại báo lỗi với thông tin về ngoại lệ chưa được thực hiện khi lệnh không thành công.

Hình 7: Ngoại lệ chưa được xử lý trong Lệnh ngoài

Điều này nhằm mục đích hỗ trợ gỡ lỗi lệnh của bạn; các lệnh được triển khai cho người dùng nên sử dụng try..catch..finally trong phương thức nhập ví dụ để
ngăn ngoại lệ bị Revit bắt. Đây là một ví dụ:
Machine Translated by Google

Vùng mã 2-4: Sử dụng try catch trong thực thi:

public IExternalCommand.Result Execute (ExternalCommandData commandData, thông báo chuỗi ref, các phần tử ElementSet) {

ExternalCommandData cdata = commandData; Ứng dụng

Autodesk.Revit.ApplicationServices.Application = cdata.Application;

thử
{
// Làm một số thứ

catch (Exception ex) {

tin nhắn = ex.Message; trả


về Autodesk.Revit.UI.Result.Failed;

}
trả về Autodesk.Revit.UI.Result.Succeeded;

}
Machine Translated by Google

Hướng dẫn: Thêm Bảng điều khiển ruy-băng Hello World

Trong phần Walkthrough: Hello World, bạn học cách tạo một ứng dụng bổ trợ và gọi nó trong Revit. Bạn cũng học cách tạo tệp kê khai .addin để đăng ký ứng
dụng bổ trợ làm công cụ bên ngoài. Một cách khác để gọi ứng dụng bổ trợ trong Revit là thông qua bảng điều khiển ruy-băng tùy chỉnh.

Tạo một dự án mới

Hoàn thành các bước sau để tạo một dự án mới:

1. Tạo một dự án C # trong Visual Studio bằng cách sử dụng mẫu Thư viện Lớp.

2. Gõ AddPanel làm tên dự án.

3. Thêm các tham chiếu đến RevitAPI.dll và RevitAPIUI.dll bằng cách sử dụng các hướng dẫn trong hướng dẫn trước, Walkthrough: Hello World.

4. Thêm tham chiếu PresentationCore:

o Trong Trình khám phá Giải pháp, bấm chuột phải vào Tham chiếu để hiển thị menu ngữ cảnh.

o Từ menu ngữ cảnh, nhấp vào Thêm tài liệu tham khảo. Hộp thoại Thêm tham chiếu xuất hiện.

o Trong hộp thoại Thêm Tham chiếu, nhấp vào Tab .NET.

o Từ danh sách Tên thành phần, chọn PresentationCore.

o Bấm OK để đóng hộp thoại. PresentationCore xuất hiện trong cây tham chiếu Solution Explorer.

Hình 8: Thêm tài liệu tham khảo

5. Thêm tham chiếu WindowsBase cũng như System.Xaml theo các bước tương tự như trên.

Thay đổi tên lớp

Để thay đổi tên lớp, hãy hoàn thành các bước sau:

1. Trong cửa sổ xem lớp, nhấp chuột phải vào Class1 để hiển thị menu ngữ cảnh.

2. Từ menu ngữ cảnh, chọn Đổi tên và đổi tên lớp thành CsAddPanel.

3. Trong Trình khám phá Giải pháp, bấm chuột phải vào tệp Class1.cs để hiển thị ngữ cảnh.

4. Từ menu ngữ cảnh, chọn Đổi tên và đổi tên tệp thành CsAddPanel.cs.

5. Nhấp đúp vào CsAddPanel.cs để mở nó để chỉnh sửa.

Thêm mã
Machine Translated by Google

Dự án Add Panel khác với Hello World vì nó tự động được gọi khi Revit chạy. Sử dụng giao diện IExternalApplication cho dự án này. Giao diện IExternalApplication
chứa hai phương thức trừu tượng, OnStartup () và OnShutdown (). Để biết thêm thông tin về IExternalApplication, hãy tham khảo Tích hợp bổ trợ.

Thêm mã sau cho bảng điều khiển ruy-băng:

Vùng mã 2-5: Thêm bảng điều khiển ruy-băng

sử dụng Autodesk.Revit.UI; sử
dụng Autodesk.Revit.DB; sử dụng
System.Windows.Media.Imaging; lớp CsAddpanel:
Autodesk.Revit.UI.IExternalApplication {

public Autodesk.Revit.UI.Result OnStartup (ứng dụng UIControlledApplication) {

// thêm bảng điều khiển ribbon


mới RibbonPanel ribbonPanel = application.CreateRibbonPanel ("NewRibbonPanel");

// Tạo nút nhấn trong bảng điều khiển ruy-băng "NewRibbonPanel" // ứng dụng bổ
trợ "HelloWorld" sẽ được kích hoạt khi nhấn nút

PushButton pushButton = ribbonPanel.AddItem (PushButtonData mới ("HelloWorld",


"HelloWorld", @ "D: \ HelloWorld.dll", "HelloWorld.CsHelloWorld")) dưới dạng PushButton;

// Đặt hình ảnh lớn hiển thị trên nút Uri uriImage
= new Uri (@ "D: \ Sample \ HelloWorld \ bin \ Debug \ 39-Globe_32x32.png"); BitmapImage LargeImage =
new BitmapImage (uriImage); pushButton.LargeImage = largeImage;

trả về Kết quả.

công khai kết quả OnShutdown (ứng dụng UIControlledApplication) {

trả về Kết quả.

}
}

Xây dựng ứng dụng

Sau khi hoàn thành mã, hãy xây dựng ứng dụng. Từ menu Xây dựng, nhấp vào Giải pháp Xây dựng. Đầu ra từ bản dựng xuất hiện trong cửa sổ Đầu ra cho biết rằng dự án
được biên dịch không có lỗi. AddPanel.dll nằm trong thư mục đầu ra của dự án.

Tạo tệp kê khai .addin

Để gọi ứng dụng trong Revit, hãy tạo tệp kê khai để đăng ký ứng dụng đó vào Revit.

1. Tạo một tệp văn bản mới bằng Notepad.

2. Thêm văn bản sau vào tệp:

Vùng mã 2-6: Tạo tệp .addin cho ứng dụng bên ngoài

<? xml version = "1.0" encoding = "utf-8" standalone = "no"?>


<RevitAddIns>

<AddIn Type = "Application">

<Name> SampleApplication </Name> <Assembly>

D: \ Sample \ AddPanel \ AddPanel \ bin \ Debug \ AddPanel.dll </Assembly> <AddInId> 604B1052-

F742-4951-8576-C261D1993107 </AddInId>

<FullClassName> AddPanel.CsAddPanel </FullClassName>

<VendorId> ADSK </VendorId>

<VendorDescription> Autodesk, www.autodesk.com </VendorDescription> </AddIn>

</RevitAddIns>

3. Lưu tệp dưới dạng HelloWorldRibbon.addin và đặt nó vào vị trí sau:

o Đối với Windows XP - C: \ Documents and Settings \ All Users \ Application Data \ Autodesk \ Revit \ Addins \ 2012 \

o Đối với Vista / Windows 7 - C: \ ProgramData \ Autodesk \ Revit \ Addins \ 2012 \


Machine Translated by Google

Lưu ý Tệp AddPanel.dll nằm trong thư mục tệp mặc định trong thư mục mới được gọi là Gỡ lỗi (D: \ Sample \ HelloWorld \ bin \ Debug \ AddPanel.dll). Sử dụng
đường dẫn tệp để đánh giá Assembly.

Tham khảo Tích hợp bổ trợ để biết thêm thông tin về tệp kê khai .addin.

Gỡ lỗi

Để bắt đầu gỡ lỗi, hãy xây dựng dự án và chạy Revit. Một bảng điều khiển ruy-băng mới xuất hiện trên tab Phần bổ trợ có tên là NewRibbonPanel và Hello
World xuất hiện dưới dạng nút duy nhất trên bảng, với hình ảnh quả địa cầu lớn.

Hình 9: Thêm một bảng điều khiển ribbon mới vào Revit

Nhấp vào Hello World để chạy ứng dụng và hiển thị hộp thoại sau.

Hình 10: Hộp thoại Hello World


Machine Translated by Google

Hướng dẫn: Truy xuất các phần tử đã chọn

Phần này giới thiệu cho bạn một ứng dụng bổ trợ lấy các phần tử được chọn từ Revit.

Trong các ứng dụng bổ trợ, bạn có thể thực hiện một thao tác cụ thể trên một phần tử cụ thể. Ví dụ: bạn có thể lấy hoặc thay đổi giá trị tham số của một
phần tử. Hoàn thành các bước sau để nhận giá trị tham số:

1. Tạo một dự án mới và thêm các tham chiếu như đã tóm tắt trong hướng dẫn trước.

2. Sử dụng thuộc tính UIApplication.ActiveUIDocument.Selection.Elements để truy xuất đối tượng đã chọn.

Đối tượng được chọn là Revit SelElementSet. Sử dụng giao diện IEnumerator hoặc vòng lặp foreach để tìm kiếm ElementSet.

Đoạn mã sau đây là một ví dụ về cách truy xuất các phần tử đã chọn.

Vùng mã 2-7: Truy xuất các phần tử đã chọn

[Autodesk.Revit.Attributes.Transaction (TransactionMode.ReadOnly)] lớp công khai


Document_Selection: IExternalCommand
{
public Autodesk.Revit.UI.Result Execute (ExternalCommandData commandData,
thông báo chuỗi tham chiếu, các phần tử ElementSet)
{
thử
{
// Chọn một số phần tử trong Revit trước khi gọi lệnh này

// Nhận xử lý của tài liệu hiện tại.

UIDocument uidoc = commandData.Application.ActiveUIDocument;


// Nhận lựa chọn phần tử của tài liệu hiện tại.

Lựa chọn lựa chọn = uidoc.Selection;


Bộ sưu tập ElementSet = selection.Elements;

if (0 == collection.Size)
{
// Nếu không có phần tử nào được chọn.

TaskDialog.Show ("Revit", "Bạn chưa chọn phần tử nào.");


}
khác

{
String info = "Id của các phần tử được chọn trong tài liệu là:";
foreach (Phần tử elem trong bộ sưu tập)
{
thông tin + = "\ n \ t" + elem.Id.IntegerValue;
}

TaskDialog.Show ("Revit", thông tin);


}
}
bắt (Ngoại lệ e)
{
tin nhắn = e.Message;
trả về Autodesk.Revit.UI.Result.Failed;
}

trả về Autodesk.Revit.UI.Result.Succeeded;
}
}

Sau khi bạn có được các phần tử đã chọn, bạn có thể lấy các thuộc tính hoặc tham số cho các phần tử. Để biết thêm thông tin, hãy xem Thông số.
Machine Translated by Google

Hướng dẫn: Truy xuất các phần tử đã lọc

Bạn có thể sử dụng bộ lọc để chỉ chọn các phần tử đáp ứng các tiêu chí nhất định. Để biết thêm thông tin về cách tạo và sử dụng bộ lọc phần tử, hãy
xem Lặp lại bộ sưu tập phần tử.

Ví dụ này truy xuất tất cả các cửa trong tài liệu và hiển thị hộp thoại liệt kê id của chúng.

Vùng mã 2-8: Truy xuất các phần tử đã lọc

// Tạo một Bộ lọc để lấy tất cả các cửa trong tài liệu ElementClassFilter
familyInstanceFilter = new ElementClassFilter (typeof (FamilyInstance)); ElementCategoryFilter doorCategoryfilter
= new ElementCategoryFilter (BuiltInCategory.OST_Doors);

Cửa LogicalAndFilterInstancesFilter =
mới LogicalAndFilter (familyInstanceFilter, doorCategoryfilter);
FilteredElementCollector collector = new FilteredElementCollector (tài liệu); ICollection
<ElementId> door = collector.WherePasses (doorInstancesFilter) .ToElementIds ();

String prompt = "Id của các cửa trong tài liệu hiện tại là:"; foreach (id ElementId
trong cửa) {

nhắc + = "\ n \ t" + id.IntegerValue;


}

// Cung cấp cho người dùng một số thông

tin TaskDialog.Show ("Revit", prompt);


Machine Translated by Google

Tích hợp bổ trợ

Các nhà phát triển thêm chức năng bằng cách tạo và triển khai Lệnh bên ngoài và Ứng dụng bên ngoài. Revit xác định các lệnh và ứng dụng mới bằng cách
sử dụng tệp kê khai .addin.

• Các Lệnh Bên ngoài xuất hiện dưới nút menu Công cụ Bên ngoài trên tab Phần bổ trợ.

• Ứng dụng bên ngoài được gọi khi Revit khởi động và không tải khi Revit tắt

Chương này tập trung vào những điều sau:

• Tìm hiểu cách thêm chức năng bằng Lệnh bên ngoài và Ứng dụng bên ngoài.

• Cách truy cập các sự kiện Revit.

• Cách tùy chỉnh giao diện người dùng Revit.

Tổng quan

API nền tảng Revit dựa trên chức năng của ứng dụng Revit. API nền tảng Revit bao gồm hai Thư viện lớp chỉ hoạt động khi Revit đang chạy.

RevitAPI.dll chứa các phương thức được sử dụng để truy cập ứng dụng, tài liệu, phần tử và tham số của Revit ở cấp cơ sở dữ liệu. Nó cũng chứa
IExternalDBApplication và các giao diện liên quan.

RevitAPIUI.dll chứa tất cả các giao diện API liên quan đến thao tác và tùy chỉnh giao diện người dùng Revit, bao gồm:

• Giao diện liên quan đến IExternalCommand và External Command

• IExternalApplication và các giao diện liên quan

• Lựa chọn

• RibbonPanel, RibbonItem và các lớp con

• TaskDialogs

Như hình dưới đây cho thấy, Revit Architecture, Revit Structure và Revit MEP lần lượt dành riêng cho Architecture, Structure và MEP.
Machine Translated by Google

Hình 11: Revit, RevitAPI và các phần bổ trợ

Để tạo một bổ trợ dựa trên RevitAPI, bạn phải cung cấp các loại điểm nhập cụ thể trong DLL bổ trợ của mình. Các lớp entrypoint này triển khai các giao
diện, IExternalCommand, IExternalApplication hoặc IExternalDBApplication. Bằng cách này, phần bổ trợ được chạy tự động trên các sự kiện nhất định hoặc, trong
trường hợp IExternalCommand và IExternalApplication, theo cách thủ công từ nút menu Công cụ bên ngoài.

IExternalCommand, IExternalApplication, IExternalDBApplication và các sự kiện Revit có sẵn khác để tích hợp add-in được giới thiệu trong chương này.

Lệnh bên ngoài

Các nhà phát triển có thể thêm chức năng bằng cách triển khai các Lệnh bên ngoài xuất hiện trong nút menu Công cụ bên ngoài.

Đang tải và chạy các lệnh bên ngoài

Khi không có lệnh hoặc chế độ chỉnh sửa nào khác đang hoạt động trong Revit, các lệnh bên ngoài đã đăng ký sẽ được bật. Khi một lệnh được chọn, một đối
tượng lệnh sẽ được tạo và phương thức Execute () của nó được gọi. Khi phương thức này quay trở lại Revit, đối tượng lệnh sẽ bị phá hủy. Do đó, dữ liệu không
thể tồn tại trong đối tượng giữa các lần thực thi lệnh. Tuy nhiên, có những cách khác để lưu dữ liệu giữa các lần thực thi lệnh; ví dụ, bạn có thể sử dụng cơ
chế chia sẻ thông số Revit để lưu trữ dữ liệu trong dự án Revit.

Bạn có thể thêm Lệnh bên ngoài vào Bảng công cụ bên ngoài trong nút menu Công cụ bên ngoài hoặc dưới dạng bảng điều khiển ruy-băng tùy chỉnh trên tab Thêm nội
dung, tab Phân tích hoặc tab ruy-băng tùy chỉnh mới. Xem hướng dẫn : Hello World và Walkthrough: Thêm Hello World Bảng điều khiển Ruy-băng cho các ví dụ về hai
cách tiếp cận này.

Các công cụ bên ngoài, tab ruy-băng và bảng ruy-băng được khởi tạo khi khởi động. Các bước khởi tạo như sau:

• Revit đọc các tệp kê khai và xác định:

o Các ứng dụng bên ngoài có thể được gọi.

o Công cụ bên ngoài có thể được thêm vào nút menu Công cụ bên ngoài của Revit.

• Phiên Ứng dụng Bên ngoài thêm các bảng và nội dung vào tab Bổ trợ.
Machine Translated by Google

IExternalCommand

Bạn tạo một lệnh bên ngoài bằng cách tạo một đối tượng triển khai giao diện IExternalCommand. Giao diện IExternalCommand có một phương thức trừu tượng,
Execute, là phương thức chính cho các lệnh bên ngoài.

Phương thức Execute () có ba tham số:

• commandData (ExternalCommandData)

• tin nhắn (Chuỗi)

• phần tử (ElementSet)

commandData (ExternalCommandData)

Đối tượng ExternalCommandData chứa các tham chiếu đến Ứng dụng và Dạng xem được lệnh bên ngoài yêu cầu. Tất cả dữ liệu Revit được lấy trực tiếp hoặc gián tiếp
từ tham số này trong lệnh bên ngoài.

Ví dụ: câu lệnh sau minh họa cách truy xuất Autodesk.Revit.Document từ tham số commandData:

Vùng mã 3-1: Truy xuất tài liệu hoạt động

Tài liệu doc = commandData.Application.ActiveUIDocument.Document;

Bảng sau minh họa các thuộc tính công cộng ExternalCommandData

Bảng 1: Thuộc tính công cộng ExternalCommandData

Tài sản Sự mô tả

Ứng dụng (Autodesk.Revit.UI.UIApplication) Truy xuất một đối tượng đại diện cho Ứng dụng UIA hiện tại cho lệnh bên ngoài.

JournalData Một bản đồ dữ liệu có thể được sử dụng để đọc và ghi dữ liệu vào tệp tạp chí Revit.

(IDictionary <Chuỗi, Chuỗi>)

Xem (Autodesk.Revit.DB.View) Truy xuất một đối tượng đại diện cho các lệnh bên ngoài View hoạt động.

tin nhắn (Chuỗi):

Thông báo lỗi được trả về bởi một lệnh bên ngoài bằng cách sử dụng thông báo tham số đầu ra. Tham số kiểu chuỗi được đặt trong quy trình lệnh bên ngoài. Khi
trả về Autodesk.Revit.UI.Result.Failed hoặc Autodesk.Revit.UI.Result.Cancell và thông số thông báo được đặt, hộp thoại lỗi sẽ xuất hiện.

Mẫu mã sau đây minh họa cách sử dụng tham số thông báo.

Vùng mã 3-2: Đặt chuỗi thông báo lỗi

1. lớp IExternalCommand_message: IExternalCommand 2. { 3.

public Autodesk.Revit.UI.Result Execute


4. (Autodesk.Revit.ExternalCommandData commandData, ref string message,
5. Autodesk.Revit.ElementSet element)
6. {
7. message = "Không thể xác định vị trí tường để phân tích."; trả
số 8. về Autodesk.Revit.UI.Result.Failed;
}
9. 10. }
Machine Translated by Google

Việc triển khai lệnh bên ngoài trước đó sẽ làm xuất hiện hộp thoại sau:

Hình 12: Hộp thoại thông báo lỗi

phần tử (ElementSet):

Bất cứ khi nào trả về Autodesk.Revit.UI.Result.Failed hoặc Autodesk.Revit.UI.Result.Canceled và thông báo tham số không trống, hộp thoại lỗi hoặc cảnh báo
sẽ xuất hiện. Ngoài ra, nếu bất kỳ phần tử nào được thêm vào tham số phần tử, các phần tử này sẽ được đánh dấu trên màn hình. Một thực tiễn tốt là đặt tham
số thông báo bất cứ khi nào lệnh không thành công, cho dù các phần tử có được trả về hay không.

Đoạn mã sau làm nổi bật các bức tường được chọn trước:

Vùng mã 3-3: Làm nổi bật các bức tường

1. lớp IExternalcommand_elements: IExternalCommand 2. { 3.

public Result Execute


4. (Autodesk.Revit.UI.ExternalCommandData commandData, thông báo chuỗi ref , các phần tử
5. Autodesk.Revit.DB.ElementSet)
6. {
7. message = "Vui lòng lưu ý Tường được đánh dấu.";
FilteredElementCollector collector = new FilteredElementCollector (commandData.Application.ActiveUIDocument.Document); ICollection <Element>
8. 9. collection = collector.OfClass (typeof (Wall)). ToElements (); foreach (Phần tử e trong bộ sưu tập) {
10.
11.
12. các phần tử.Insert (e);
13. }
14.
15. trả về Kết quả. Không thành công;
16. }
17. }

Hình ảnh sau đây hiển thị kết quả của mã trước đó.
Machine Translated by Google

Hình 13: Hộp thoại thông báo lỗi và các phần tử được đánh dấu

Trở về

Kết quả Trả về cho biết rằng việc thực thi không thành công, thành công hoặc bị hủy bỏ bởi người dùng. Nếu không thành công, Revit sẽ đảo ngược các thay đổi
được thực hiện bởi lệnh bên ngoài.

Bảng 2: IExternalCommand.Result

Tên thành viên Sự mô tả

Autodesk.Revit.UI.Result.Succeeded Lệnh bên ngoài đã hoàn tất thành công. Revit giữ tất cả các thay đổi được thực hiện bởi lệnh bên ngoài.

Autodesk.Revit.UI.Result.Failed Lệnh bên ngoài không thể hoàn thành tác vụ. Revit đảo ngược các hoạt động được thực hiện bởi lệnh bên ngoài. Nếu thông số

thông báo của Execute được thiết lập, Revit sẽ hiển thị hộp thoại với nội dung "Lỗi - không thể bỏ qua".

Autodesk.Revit.UI.Result.Cancell Người dùng đã hủy lệnh bên ngoài. Revit đảo ngược các thay đổi được thực hiện bởi lệnh bên ngoài. Nếu thông số thông

báo của Execute được thiết lập, Revit sẽ hiển thị hộp thoại có nội dung "Cảnh báo - có thể bỏ qua".
Machine Translated by Google

Ví dụ sau đây hiển thị thông báo chào mừng và cho phép người dùng chọn giá trị trả về. Sử dụng phương thức Execute () làm lối vào ứng dụng Revit.

Vùng mã 3-4: Nhắc người dùng

1. public Autodesk.Revit.UI.Result Execute (ExternalCommandData commandData, ref string message,


2. ElementSet element)
3. {
4. thử
5. {
Tài liệu doc = commandData.Application.ActiveUIDocument.Document; UIDocument uidoc
6. 7. = commandData.Application.ActiveUIDocument; // Xóa các phần tử đã chọn ICollection
<Autodesk.Revit.DB.ElementId> ids =
8. 9.
10. doc.Delete (uidoc.Selection.GetElementIds ());
11.
12. TaskDialog taskDialog = new TaskDialog ("Revit");
13. taskDialog.MainContent =
14. ("Nhấp vào Có để trở lại Đã thành công. Các thành viên được chọn sẽ bị xóa. \ N" + "Nhấp
15. vào Không để quay lại Không thành công. Các thành viên đã chọn sẽ không bị xóa. \ N" + "Nhấp
16. vào Hủy để trở lại Đã hủy. Các thành viên được chọn sẽ không bị xóa. ");
17. Các nút TaskDialogCommonButtons = TaskDialogCommonButtons.Yes |
18. TaskDialogCommonButtons.No | TaskDialogCommonButtons.Cancel;
19. taskDialog.CommonButtons = các nút; TaskDialogResult taskDialogResult =
20. taskDialog.Show ();
21.
22. if (taskDialogResult == TaskDialogResult.Yes) {
23.
24. trả về Autodesk.Revit.UI.Result.Succeeded;
25.
26. } else if (taskDialogResult == TaskDialogResult.No) {
27.
28. phần tử = uidoc.Selection.Elements; message =
29. "Không thể xóa lựa chọn."; trả về
30. Autodesk.Revit.UI.Result.Failed;
31.
32. }
33. khác {
34. trả về Autodesk.Revit.UI.Result.Cancell;
35. }
36.
37. } bắt
38. {
39. message = "Đã ném ngoại lệ không mong muốn."; trả về
40. Autodesk.Revit.UI.Result.Failed;
41. }
42. }

IExternalCommandAvailable

Giao diện này cho phép bạn kiểm soát xem có thể nhấn nút lệnh bên ngoài hay không. Phương thức giao diện IsCommandAvailable chuyển ứng dụng và một tập
hợp các danh mục phù hợp với các danh mục của các mục đã chọn trong Revit để bạn triển khai. Cách sử dụng điển hình là kiểm tra các danh mục đã chọn để xem liệu
chúng có đáp ứng các tiêu chí để chạy lệnh của bạn hay không.

Trong ví dụ này, kiểm tra khả năng tiếp cận cho phép nhấp vào một nút khi không có lựa chọn nào đang hoạt động hoặc khi ít nhất một bức tường được chọn:

Vùng mã 3-5: Đặt tính khả dụng của lệnh

1. lớp công khai SampleAccessibilityCheck: IExternalCommandAvailable 2. { 3.

public bool IsCommandAvailable (AutodeskAutodesk.Revit.UI.UIApplication applicationData,


4. CategorySet selectCategories)
5. {
6. // Cho phép nhấp vào nút nếu không có lựa chọn đang hoạt động if
7. (selectCategories.IsEmpty) return true; // Cho phép nhấp vào nút nếu
số 8. có ít nhất một tường được chọn foreach (Danh mục c trong Danh
mục đã chọn) {
9. 10.
11.
12. if (c.Id.IntegerValue == (int) BuiltInCategory.OST_Walls) trả về true;
13.
14.
15. } trả về false;
16. }
Machine Translated by Google

Ứng dụng bên ngoài


Các nhà phát triển có thể thêm chức năng thông qua Ứng dụng bên ngoài cũng như Lệnh bên ngoài. Các tab ruy-băng và bảng ruy-băng được tùy chỉnh bằng Ứng dụng Bên ngoài.
Các nút của bảng điều khiển ruy-băng được liên kết với lệnh Bên ngoài.

IExternalApplication

Để thêm Ứng dụng bên ngoài vào Revit, bạn tạo một đối tượng triển khai giao diện IExternalApplication.

Giao diện IExternalApplication có hai phương thức trừu tượng, OnStartup () và OnShutdown (), mà bạn ghi đè trong ứng dụng bên ngoài của mình. Revit gọi
OnStartup () khi nó khởi động và OnShutdown () khi nó đóng.

Đây là định nghĩa trừu tượng OnStartup () và OnShutdown ():

Vùng mã 3-6: OnShutdown () và OnStartup ()

giao diện công cộng IExternalApplication {

public Autodesk.Revit.UI.Result OnStartup (ứng dụng UIControlledApplication); public


Autodesk.Revit.UI.Result OnShutdown (ứng dụng UIControlledApplication);
}

Tham số UIControlledApplication cung cấp quyền truy cập vào các sự kiện Revit nhất định và cho phép tùy chỉnh các bảng điều khiển và bảng điều khiển ruy-băng cũng như
việc bổ sung các tab dải băng. Ví dụ, sự kiện công khai DialogBoxShowing của UIControlledApplication có thể được sử dụng để nắm bắt sự kiện hộp thoại được hiển thị. Đoạn
mã sau đăng ký hàm xử lý được gọi ngay trước khi hộp thoại được hiển thị.

Vùng mã 3-7: Sự kiện DialogBoxShowing

application.DialogBoxShowing + = new
EventHandler <Autodesk.Revit.Events.DialogBoxShowingEventArgs> (AppDialogShowing);

Mẫu mã sau minh họa cách sử dụng loại UIControlledApplication để đăng ký một trình xử lý sự kiện và xử lý sự kiện khi nó
xảy ra.

Vùng mã 3-8: Sử dụng ứng dụng có kiểm soát

public class Application_DialogBoxShowing: IExternalApplication {

// Thực hiện phương thức OnStartup để đăng ký các sự kiện khi Revit khởi động. Kết quả công
khai OnStartup (ứng dụng UIControlledApplication) {

// Đăng ký ứng dụng sự kiện liên


quan.DialogBoxShowing + =
EventHandler mới <Autodesk.Revit.UI.Events.DialogBoxShowingEventArgs> (AppDialogShowing);
trả về Kết quả.

// Triển khai phương thức này để hủy đăng ký các sự kiện đã đăng ký khi Revit thoát. công khai kết quả
OnShutdown (ứng dụng UIControlledApplication) {

// hủy đăng ký ứng dụng sự


kiện.DialogBoxShowing - =
EventHandler mới <Autodesk.Revit.UI.Events.DialogBoxShowingEventArgs> (AppDialogShowing);
trả về Kết quả.

// Trình xử lý sự kiện DialogBoxShowing, cho phép bạn // thực hiện một số


công việc trước khi hộp thoại hiển thị void AppDialogShowing (object
sender, DialogBoxShowingEventArgs args) {

// Lấy id trợ giúp của hộp thoại đang hiển thị int
DialId = args.HelpId;

// Định dạng chuỗi thông tin lời nhắc String


promptInfo = "Một hộp thoại Revit sẽ được mở. \ N"; promptInfo + = "Id
trợ giúp của hộp thoại này là" + speechId.ToString () + "\ n"; +promptInfo
= "Nếu bạn không muốn mở hộp thoại,
vui lòng nhấn nút hủy";
Machine Translated by Google

// Hiển thị thông báo nhắc và cho phép người dùng đóng hộp thoại trực tiếp.
TaskDialog taskDialog = new TaskDialog ("Revit");
taskDialog.MainContent = promptInfo; Các nút
TaskDialogCommonButtons = TaskDialogCommonButtons.Ok |
TaskDialogCommonButtons.Cancel;
taskDialog.CommonButtons = các nút; Kết quả TaskDialogResult =
taskDialog.Show (); if (TaskDialogResult.Cancel == kết quả) {

// Không hiển thị hộp thoại Revit


args.OverrideResult (1);

} khác

{
// Tiếp tục hiện hộp thoại Revit
args.OverrideResult (0);
}
}
}
Machine Translated by Google

Đăng ký bổ trợ
Các lệnh bên ngoài và các ứng dụng bên ngoài cần được đăng ký để xuất hiện bên trong Revit. Chúng có thể được đăng ký bằng cách thêm chúng vào tệp kê khai .addin.

Thứ tự mà các lệnh và ứng dụng bên ngoài được liệt kê trong Revit được xác định bởi thứ tự mà chúng được đọc khi Revit khởi động.

Tệp kê khai

Bắt đầu với Revit 2011, API Revit cung cấp khả năng đăng ký các ứng dụng API thông qua tệp kê khai .addin. Các tệp kê khai được Revit đọc tự động khi chúng được đặt ở
một trong hai vị trí trên hệ thống của người dùng:

Ở một vị trí không dành riêng cho người dùng trong "dữ liệu ứng dụng":

• Đối với Windows XP - C: \ Documents and Settings \ All Users \ Application Data \ Autodesk \ Revit \ Addins \ 2014 \

• Đối với Vista / Windows 7 - C: \ ProgramData \ Autodesk \ Revit \ Addins \ 2014 \

Ở vị trí dành riêng cho người dùng trong "dữ liệu ứng dụng":

• Đối với Windows XP - C: \ Documents and Settings \ <user> \ Application Data \ Autodesk \ Revit \ Addins \ 2014 \

• Đối với Vista / Windows 7 - C: \ Users \ <user> \ AppData \ Roaming \ Autodesk \ Revit \ Addins \ 2014 \

Tất cả các tệp có tên .addin ở các vị trí này sẽ được Revit đọc và xử lý trong quá trình khởi động. Tất cả các tệp ở cả vị trí dành riêng cho người dùng và vị trí của tất cả
người dùng đều được xem xét cùng nhau và được tải theo thứ tự bảng chữ cái. Nếu tệp kê khai của tất cả người dùng có cùng tên với tệp kê khai của người dùng cụ thể, thì tệp kê
khai của tất cả người dùng sẽ bị bỏ qua. Trong mỗi tệp kê khai, các lệnh bên ngoài và ứng dụng bên ngoài được tải theo thứ tự mà chúng được liệt kê.

Một tệp cơ bản thêm một Lệnh bên ngoài trông giống như sau:

Vùng mã 3-9: Tệp kê khai .addin ExternalCommand

1. <? Xml version = "1.0" encoding = "utf-8" standalone = "no"?> 2.


<RevitAddIns>

<AddIn Type = "Command">


3. 4. <Assembly> c: \ MyProgram \ MyProgram.dll </Assembly>
<AddInId> 76eb700a-2c85-4888-a78d-31429ecae9ed </AddInId> <FullClassName>
5. 6. Revit.Samples.SampleCommand </ FullClassName > <Text> Lệnh mẫu </Text>
<VendorId> ADSK </VendorId> <VendorDescription> Autodesk, www.autodesk.com
7. 8. </VendorDescription> <VisibilityMode> NotVitherInFamily </VisibilityMode>
<Discipline> Cấu trúc </Discipline> <Discipline > Kiến trúc </Discipline>
9. 10. <AvailableClassName> Revit.Samples.SampleAccessibilityCheck </ AvailableClassName>
11. <LongDescription> <p> Đây là phần mô tả dài cho lệnh của tôi. </p> <p> Đây là một
12. đoạn mô tả khác, với các ghi chú về cách để sử dụng lệnh đúng cách. </p> </
13. LongDescription> <TooltipImage> c: \ MyProgram \ Autodesk.png </TooltipImage> <LargeImage> c: \ MyProgram \
14. MyProgramIcon.png </LargeImage> </AddIn> 20.
15.
16.
17.
18.
19.

21. </RevitAddIns>

Một tệp cơ bản thêm một Ứng dụng bên ngoài trông giống như sau:

Vùng mã 3-10: Tệp kê khai .addin Bên ngoài Ứng dụng

1. <? Xml version = "1.0" encoding = "utf-8" standalone = "no"?> 2.


<RevitAddIns> 3. <AddIn Type = "Application"> 4. 5.

<Name> SampleApplication </Name>


<Assembly> c: \ MyProgram \ MyProgram.dll </Assembly> <AddInId>
6. 604B1052-F742-4951-8576-C261D1993107 </AddInId> <FullClassName>
7. Revit.Samples.SampleApplication </ FullClassName > <VendorId> ADSK </VendorId>
<VendorDescription> Autodesk, www.autodesk.com </VendorDescription> 10. </AddIn> 11.
8. 9. </RevitAddIns>

Tệp cơ bản thêm một Ứng dụng bên ngoài cấp DB trông giống như sau:
Machine Translated by Google

Vùng mã: Tệp kê khai .addin ExternalDBApplication

1. <? Xml version = "1.0" encoding = "utf-8" standalone = "no"?> 2.


<RevitAddIns>
3. <AddIn Type = "DBApplication">
4. <Assembly> c: \ MyDBLevelApplication \ MyDBLevelApplication.dll </Assembly> <AddInId>
5. DA3D570A-1AB3-4a4b-B09F-8C15DFEC6BF0 </AddInId>
6.
7. <FullClassName> MyCompany.MyDBLevelAddIn </FullClassName>
số 8.

9. <Name> AddIn cấp DB của tôi </Name>


<VendorId> ADSK </VendorId> 10. 11.
<VendorDescription> Autodesk, www.autodesk.com </VendorDescription> 12. </AddIn>
13. </RevitAddIns>

Nhiều phần tử AddIn có thể được cung cấp trong một tệp kê khai.

Bảng sau đây mô tả các thẻ XML có sẵn:

Nhãn Sự mô tả

Cuộc họp Đường dẫn đầy đủ đến tệp lắp ráp bổ trợ. Bắt buộc đối với tất cả các Lệnh bên ngoài và Ứng dụng Bên ngoài.

FullClassName Tên đầy đủ của lớp trong tệp hợp ngữ triển khai IExternalCommand hoặc IExternalApplication. Bắt buộc đối với tất cả các Lệnh bên ngoài và

Ứng dụng Bên ngoài.

AddInId GUID đại diện cho id của ứng dụng cụ thể này. AddInIds phải là duy nhất cho một phiên Revit nhất định.

Autodesk khuyên bạn nên tạo một GUID duy nhất cho mỗi ứng dụng hoặc lệnh đã đăng ký. Bắt buộc đối với tất cả các Lệnh bên ngoài

và Ứng dụng Bên ngoài.

Tên Tên của ứng dụng. Yêu cầu; chỉ dành cho Ứng dụng bên ngoài.

Chữ Tên của nút. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh bên ngoài. Mặc định là "Công cụ bên ngoài".

Nhà cung cấp dữ liệu thông tin


Một chuỗi tuân theo tiêu chuẩn ID nhà cung cấp Autodesk. Bắt buộc đối với tất cả các Lệnh bên ngoài và Ứng dụng Bên ngoài.

Đăng ký chuỗi id nhà cung cấp của bạn với Autodesk tại http://www.autodesk.com/symbreg.

VendorDescription Mô tả có chứa tên pháp lý của nhà cung cấp và / hoặc thông tin thích hợp khác. Không bắt buộc.

Sự mô tả Mô tả ngắn gọn về lệnh, sẽ được sử dụng làm chú giải công cụ của nút. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh bên ngoài.

Mặc định là một chú giải công cụ chỉ với văn bản lệnh.

VisibilityMode Các chế độ mà lệnh bên ngoài sẽ hiển thị. Nhiều giá trị có thể được đặt cho tùy chọn này. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh

bên ngoài.

Mặc định là hiển thị lệnh ở tất cả các chế độ, kể cả khi không có tài liệu nào hoạt động. Các lệnh bên ngoài đã viết trước đây cần chạy

trên tài liệu đang hoạt động nên được sửa đổi để đảm bảo rằng mã xử lý lệnh gọi khi không có tài liệu hoạt động hoặc áp dụng chế độ

NotVibleWhenNoActiveDocument. Xem bảng dưới đây để biết thêm thông tin.

Kỷ luật Các quy tắc mà lệnh bên ngoài sẽ hiển thị. Nhiều giá trị có thể được đặt cho tùy chọn này. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh

bên ngoài.

Mặc định là hiển thị lệnh trong tất cả các ngành. Nếu bất kỳ ngành cụ thể nào được liệt kê, lệnh sẽ chỉ hiển thị trong các ngành đó. Xem bảng

dưới đây để biết thêm thông tin.

Tên miền sẵn có Tên đầy đủ của lớp trong tệp hợp ngữ đã triển khai IExternalCommandAv Khả dụng. Lớp này cho phép nút lệnh được chuyển sang màu xám

một cách chọn lọc tùy thuộc vào ngữ cảnh. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh bên ngoài.

Mặc định là một lệnh có sẵn bất cứ khi nào nó được hiển thị.

Hình ảnh lớn Biểu tượng để sử dụng cho nút trong trình đơn Công cụ Bên ngoài kéo xuống. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh bên ngoài.

Mặc định là hiển thị một nút không có biểu tượng.

SmallImage Biểu tượng để sử dụng nếu nút được thăng cấp trên Thanh công cụ Truy nhập Nhanh. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh bên ngoài.

Mặc định là hiển thị nút Thanh công cụ truy cập nhanh mà không có biểu tượng, điều này có thể gây nhầm lẫn cho người dùng.

Mô tả dài Mô tả dài của lệnh, sẽ được sử dụng như một phần của chú giải công cụ mở rộng của nút, được hiển thị khi con chuột di chuột qua
Machine Translated by Google

lệnh trong một khoảng thời gian dài hơn. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh bên ngoài. Nếu thuộc tính này và TooltipImage

không được cung cấp, nút sẽ không có chú giải công cụ mở rộng.

TooltipImage Tệp hình ảnh sẽ hiển thị dưới dạng một phần của chú giải công cụ mở rộng nút, được hiển thị khi chuột di chuột qua lệnh trong một khoảng

thời gian dài hơn. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh bên ngoài. Nếu thuộc tính này và TooltipImage không được cung cấp,

nút sẽ không có chú giải công cụ mở rộng.

LanguageType Cài đặt bản địa hóa cho các nút Văn bản, Mô tả, Hình ảnh lớn, Mô tả dài và Hình ảnh công cụ của các nút công cụ bên ngoài. Revit sẽ tải

các giá trị tài nguyên từ dll tài nguyên ngôn ngữ được chỉ định. Giá trị có thể là một trong mười một ngôn ngữ được Revit hỗ trợ. Nếu

không có LanguageType nào được chỉ định, tài nguyên ngôn ngữ mà phiên hiện tại của Revit đang sử dụng sẽ được tải tự động. Để biết thêm
chi tiết, hãy xem phần Bản địa hóa.

AllowLoadIntoExistingSession Cờ cho phép tải. Đặt thành false để ngăn Revit tự động tải các bổ trợ trong .addin mới được thêm vào

tệp kê khai mà không cần khởi động lại. Không bắt buộc. Theo mặc định. Revit sẽ tự động tải các bổ trợ từ các tệp kê khai .addin mới được thêm

vào mà không cần khởi động lại Revit.

Bảng 3: Thành viên Chế độ hiển thị

Tên thành viên Sự mô tả

Luôn luôn có thể Lệnh có sẵn ở tất cả các chế độ có thể được hỗ trợ bởi API Revit.

Không thể phân chia được trong dự án Lệnh ẩn khi có tài liệu dự án đang hoạt động.

Không thể tìm thấy trong gia đình Lệnh ẩn khi có một tài liệu gia đình đang hoạt động.

NotVibleWhenNoActiveDocument Lệnh ẩn khi không có tài liệu đang hoạt động.

Bảng 4: Các thành viên kỷ luật

Tên thành viên Sự mô tả

Không tí nào Lệnh có sẵn trong tất cả các nguyên tắc có thể được hỗ trợ bởi API Revit.

Ngành kiến trúc Lệnh hiển thị trong Autodesk Revit Architecture.

Kết cấu Lệnh hiển thị trong Autodesk Revit Structure.

StructuralAnalysis Lệnh hiển thị khi có sẵn các công cụ chỉnh sửa kỷ luật Phân tích cấu trúc.

MassingAndSite

Lệnh này hiển thị khi có sẵn các công cụ chỉnh sửa Khối lượng và Quy tắc trang web.

Phân tích năng lượng Lệnh hiển thị khi có sẵn các công cụ chỉnh sửa kỷ luật Phân tích năng lượng.

Cơ khí Lệnh hiển thị khi có sẵn các công cụ chỉnh sửa kỷ luật Cơ khí, ví dụ như trong Autodesk Revit MEP.

Điện Lệnh hiển thị khi có sẵn các công cụ chỉnh sửa kỷ luật Điện, ví dụ như trong Autodesk Revit MEP.

Đường ống Lệnh hiển thị khi có sẵn các công cụ chỉnh sửa kỷ luật Đường ống, ví dụ như trong Autodesk Revit MEP.

MechanicalAnalysis Lệnh hiển thị khi các công cụ chỉnh sửa kỷ luật Phân tích Cơ học khả dụng.

PipingAnalysis Lệnh hiển thị khi có sẵn các công cụ chỉnh sửa kỷ luật Phân tích đường ống.

Phân tích điện Lệnh này hiển thị khi có sẵn các công cụ chỉnh sửa kỷ luật Phân tích Điện.

Tiện ích bổ trợ .NET dành cho tệp kê khai

Tiện ích .NET DLL RevitAddInUtility.dll cung cấp một API chuyên dụng có khả năng đọc, ghi và sửa đổi tệp kê khai Revit Add-In. Nó được thiết kế để sử dụng
từ trình cài đặt sản phẩm và tập lệnh. Tham khảo tài liệu API trong tệp trợ giúp RevitAddInUtility.chm trong thư mục cài đặt SDK.
Machine Translated by Google

Vùng mã 3-11: Tạo và chỉnh sửa tệp kê khai


1. // tạo một tệp kê khai addin mới 2.
RevitAddInManifest Manifest = new RevitAddInManifest (); 3. 4. // tạo
một lệnh bên ngoài 5. RevitAddInCommand command1 = new RevitAddInCommand
(" đường dẫn đầy đủ \\ assemblyName.dll", 6.

Guid.NewGuid (), "namespace.className"); 7.


command1.Description = "mô tả"; 8. command1.Text = "hiển
thị văn bản"; 9. 10. // lệnh này chỉ hiển thị trong Revit
MEP, Structure, và chỉ hiển thị 11. // trong tài liệu Dự
án hoặc khi không có tài liệu nào cả 12. command1.Discipline = Discipline.Mechanical | Kỷ
luật.Electrical | Kỷ luật.Piping | Kỷ luật, Kiến trúc; 13. 14. command1.VisibilityMode =
VisibilityMode.NotVosystemInFamily; 15. 16. // tạo ứng dụng bên ngoài 17.
RevitAddInApplication ("appName", "full
RevitAddInApplication
path \\ assemblyName.dll",
application1
Guid.NewGuid
= new (),
"namespace.className"); 18. 19.

20. // thêm cả (các) lệnh và (các) ứng dụng vào tệp kê khai 21.
Manifest.AddInCommands.Add (command1); 22. Manifest.AddInApplication.Add
(application1);
23.
24. // lưu tệp kê khai vào một tệp
25. RevitProduct revitProduct1 = RevitProductUtility.GetAllInstalledRevitProducts () [0]; 26.
Manifest.SaveAs (revitProduct1.AllUsersAddInFolder + "\\ RevitAddInUtilitySample.addin");

Vùng mã 3-12: Đọc tệp kê khai hiện có


1. RevitProduct revitProduct1 = RevitProductUtility.GetAllInstalledRevitProducts () [0]; 2.

3. RevitAddInManifest revitAddInManifest =
4. Autodesk.RevitAddIns.AddInManifestUtility.GetRevitAddInManifest (
5. revitProduct1.AllUsersAddInFolder + "\\ RevitAddInUtilitySample.addin");

Đăng ký bổ trợ
Các lệnh bên ngoài và các ứng dụng bên ngoài cần được đăng ký để xuất hiện bên trong Revit. Chúng có thể được đăng ký bằng cách thêm chúng vào tệp kê khai .addin.

Thứ tự mà các lệnh và ứng dụng bên ngoài được liệt kê trong Revit được xác định bởi thứ tự mà chúng được đọc khi Revit khởi động.

Tệp kê khai

Bắt đầu với Revit 2011, API Revit cung cấp khả năng đăng ký các ứng dụng API thông qua tệp kê khai .addin. Các tệp kê khai được Revit đọc tự động khi chúng được đặt ở
một trong hai vị trí trên hệ thống của người dùng:

Ở một vị trí không dành riêng cho người dùng trong "dữ liệu ứng dụng":

• Đối với Windows XP - C: \ Documents and Settings \ All Users \ Application Data \ Autodesk \ Revit \ Addins \ 2014 \

• Đối với Vista / Windows 7 - C: \ ProgramData \ Autodesk \ Revit \ Addins \ 2014 \

Ở vị trí dành riêng cho người dùng trong "dữ liệu ứng dụng":

• Đối với Windows XP - C: \ Documents and Settings \ <user> \ Application Data \ Autodesk \ Revit \ Addins \ 2014 \

• Đối với Vista / Windows 7 - C: \ Users \ <user> \ AppData \ Roaming \ Autodesk \ Revit \ Addins \ 2014 \

Tất cả các tệp có tên .addin ở các vị trí này sẽ được Revit đọc và xử lý trong quá trình khởi động. Tất cả các tệp ở cả vị trí dành riêng cho người dùng và vị trí của tất cả
người dùng đều được xem xét cùng nhau và được tải theo thứ tự bảng chữ cái. Nếu tệp kê khai của tất cả người dùng có cùng tên với tệp kê khai của người dùng cụ thể, thì tệp kê
khai của tất cả người dùng sẽ bị bỏ qua. Trong mỗi tệp kê khai, các lệnh bên ngoài và ứng dụng bên ngoài được tải theo thứ tự mà chúng được liệt kê.
Machine Translated by Google

Một tệp cơ bản thêm một Lệnh bên ngoài trông giống như sau:

Vùng mã 3-9: Tệp kê khai .addin ExternalCommand

1. <? Xml version = "1.0" encoding = "utf-8" standalone = "no"?> 2.


<RevitAddIns>
3. <AddIn Type = "Command">
4. <Assembly> c: \ MyProgram \ MyProgram.dll </Assembly>
5. <AddInId> 76eb700a-2c85-4888-a78d-31429ecae9ed </AddInId> <FullClassName>
6. Revit.Samples.SampleCommand </ FullClassName > <Text> Lệnh mẫu </Text>
7. <VendorId> ADSK </VendorId> <VendorDescription> Autodesk, www.autodesk.com
số 8. </VendorDescription> <VisibilityMode> NotVitherInFamily </VisibilityMode>
9. <Discipline> Cấu trúc </Discipline> <Discipline > Kiến trúc </Discipline>
10. <AvailableClassName> Revit.Samples.SampleAccessibilityCheck </ AvailableClassName>
11. <LongDescription> <p> Đây là phần mô tả dài cho lệnh của tôi. </p> <p> Đây là một
12. đoạn mô tả khác, với các ghi chú về cách để sử dụng lệnh đúng cách. </p> </
13. LongDescription> <TooltipImage> c: \ MyProgram \ Autodesk.png </TooltipImage> <LargeImage> c: \ MyProgram \
14. MyProgramIcon.png </LargeImage> 20.
15.
16.
17.
18.
19.
</AddIn>
21. </RevitAddIns>

Một tệp cơ bản thêm một Ứng dụng bên ngoài trông giống như sau:

Vùng mã 3-10: Tệp kê khai .addin Bên ngoài Ứng dụng

1. <? Xml version = "1.0" encoding = "utf-8" standalone = "no"?> 2.


<RevitAddIns> 3. <AddIn Type = "Application"> 4.

<Name> SampleApplication </Name>


<Assembly> c: \ MyProgram \ MyProgram.dll </Assembly>
5. 6. <AddInId> 604B1052-F742-4951-8576-C261D1993107 </AddInId> <FullClassName>
Revit.Samples.SampleApplication </ FullClassName > <VendorId> ADSK </VendorId>
7. 8. <VendorDescription> Autodesk, www.autodesk.com </VendorDescription> 9.

10. </AddIn>
11. </RevitAddIns>

Tệp cơ bản thêm một Ứng dụng bên ngoài cấp DB trông giống như sau:

Vùng mã: Tệp kê khai .addin ExternalDBApplication

1. <? Xml version = "1.0" encoding = "utf-8" standalone = "no"?> 2.


<RevitAddIns>
3. <AddIn Type = "DBApplication">
4. <Assembly> c: \ MyDBLevelApplication \ MyDBLevelApplication.dll </Assembly> <AddInId>
5. DA3D570A-1AB3-4a4b-B09F-8C15DFEC6BF0 </AddInId>
6.
7. <FullClassName> MyCompany.MyDBLevelAddIn </FullClassName>

8. 9. <Name> AddIn cấp DB của tôi </Name>


<VendorId> ADSK </VendorId> 10. 11.
<VendorDescription> Autodesk, www.autodesk.com </VendorDescription> 12. </AddIn>
13. </RevitAddIns>
Machine Translated by Google

Nhiều phần tử AddIn có thể được cung cấp trong một tệp kê khai.

Bảng sau đây mô tả các thẻ XML có sẵn:

Nhãn Sự mô tả

Cuộc họp Đường dẫn đầy đủ đến tệp lắp ráp bổ trợ. Bắt buộc đối với tất cả các Lệnh bên ngoài và Ứng dụng Bên ngoài.

FullClassName Tên đầy đủ của lớp trong tệp hợp ngữ triển khai IExternalCommand hoặc IExternalApplication. Bắt buộc đối với tất cả các Lệnh bên ngoài và

Ứng dụng Bên ngoài.

AddInId GUID đại diện cho id của ứng dụng cụ thể này. AddInIds phải là duy nhất cho một phiên Revit nhất định.

Autodesk khuyên bạn nên tạo một GUID duy nhất cho mỗi ứng dụng hoặc lệnh đã đăng ký. Bắt buộc đối với tất cả các Lệnh bên ngoài

và Ứng dụng Bên ngoài.

Tên Tên của ứng dụng. Yêu cầu; chỉ dành cho Ứng dụng bên ngoài.

Chữ Tên của nút. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh bên ngoài. Mặc định là "Công cụ bên ngoài".

Nhà cung cấp dữ liệu thông tin


Một chuỗi tuân theo tiêu chuẩn ID nhà cung cấp Autodesk. Bắt buộc đối với tất cả các Lệnh bên ngoài và Ứng dụng Bên ngoài.

Đăng ký chuỗi id nhà cung cấp của bạn với Autodesk tại http://www.autodesk.com/symbreg.

VendorDescription Mô tả có chứa tên pháp lý của nhà cung cấp và / hoặc thông tin thích hợp khác. Không bắt buộc.

Sự mô tả Mô tả ngắn gọn về lệnh, sẽ được sử dụng làm chú giải công cụ của nút. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh bên ngoài.

Mặc định là một chú giải công cụ chỉ với văn bản lệnh.

VisibilityMode Các chế độ mà lệnh bên ngoài sẽ hiển thị. Nhiều giá trị có thể được đặt cho tùy chọn này. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh

bên ngoài.

Mặc định là hiển thị lệnh ở tất cả các chế độ, kể cả khi không có tài liệu nào hoạt động. Các lệnh bên ngoài đã viết trước đây cần chạy

trên tài liệu đang hoạt động nên được sửa đổi để đảm bảo rằng mã xử lý lệnh gọi khi không có tài liệu hoạt động hoặc áp dụng chế độ

NotVibleWhenNoActiveDocument. Nhìn thấy

bảng bên dưới để biết thêm thông tin.

Kỷ luật Các quy tắc mà lệnh bên ngoài sẽ hiển thị. Nhiều giá trị có thể được đặt cho tùy chọn này. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh

bên ngoài.

Mặc định là hiển thị lệnh trong tất cả các ngành. Nếu bất kỳ ngành cụ thể nào được liệt kê, lệnh sẽ chỉ hiển thị trong các ngành đó. Xem bảng

dưới đây để biết thêm thông tin.

Tên miền sẵn có Tên đầy đủ của lớp trong tệp hợp ngữ đã triển khai IExternalCommandAv Khả dụng. Lớp này cho phép nút lệnh được chuyển sang màu xám

một cách chọn lọc tùy thuộc vào ngữ cảnh. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh bên ngoài.

Mặc định là một lệnh có sẵn bất cứ khi nào nó được hiển thị.

Hình ảnh lớn Biểu tượng để sử dụng cho nút trong trình đơn Công cụ Bên ngoài kéo xuống. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh bên ngoài.

Mặc định là hiển thị một nút không có biểu tượng.

SmallImage Biểu tượng để sử dụng nếu nút được thăng cấp trên Thanh công cụ Truy nhập Nhanh. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh bên ngoài.

Mặc định là hiển thị nút Thanh công cụ truy cập nhanh mà không có biểu tượng, điều này có thể gây nhầm lẫn cho người dùng.

Mô tả dài Mô tả dài của lệnh, sẽ được sử dụng như một phần của chú giải công cụ mở rộng nút, được hiển thị khi chuột di chuột qua lệnh trong một khoảng

thời gian dài hơn. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh bên ngoài. Nếu thuộc tính này và TooltipImage không được cung cấp, nút sẽ

không có chú giải công cụ mở rộng.

TooltipImage Tệp hình ảnh sẽ hiển thị dưới dạng một phần của chú giải công cụ mở rộng nút, được hiển thị khi chuột di chuột qua lệnh trong một khoảng thời

gian dài hơn. Không bắt buộc; chỉ sử dụng thẻ này cho các Lệnh bên ngoài. Nếu thuộc tính này và TooltipImage không được cung cấp, nút sẽ không

có chú giải công cụ mở rộng.

LanguageType Cài đặt bản địa hóa cho các nút Văn bản, Mô tả, Hình ảnh lớn, Mô tả dài và Hình ảnh công cụ của các nút công cụ bên ngoài. Revit sẽ tải các

giá trị tài nguyên từ dll tài nguyên ngôn ngữ được chỉ định. Giá trị có thể là một trong mười một ngôn ngữ được Revit hỗ trợ. Nếu không có

LanguageType nào được chỉ định, tài nguyên ngôn ngữ mà phiên hiện tại của Revit đang sử dụng sẽ được tải tự động. Để biết thêm chi tiết, hãy

xem phần Bản địa hóa.

AllowLoadIntoExistingSession Cờ cho phép tải. Đặt thành false để ngăn Revit tự động tải các bổ trợ trong .addin mới được thêm vào

tệp kê khai mà không cần khởi động lại. Không bắt buộc. Theo mặc định. Revit sẽ tự động tải các bổ trợ từ các tệp kê khai .addin mới được thêm

vào mà không cần khởi động lại Revit.


Machine Translated by Google

Bảng 3: Thành viên Chế độ hiển thị

Tên thành viên Sự mô tả

Luôn luôn có thể Lệnh có sẵn ở tất cả các chế độ có thể được hỗ trợ bởi API Revit.

Không thể phân chia được trong dự án Lệnh ẩn khi có tài liệu dự án đang hoạt động.

Không thể tìm thấy trong gia đình Lệnh ẩn khi có một tài liệu gia đình đang hoạt động.

NotVibleWhenNoActiveDocument Lệnh ẩn khi không có tài liệu đang hoạt động.

Bảng 4: Các thành viên kỷ luật

Tên thành viên Sự mô tả

Không tí nào Lệnh có sẵn trong tất cả các nguyên tắc có thể được hỗ trợ bởi API Revit.

Ngành kiến trúc Lệnh hiển thị trong Autodesk Revit Architecture.

Kết cấu Lệnh hiển thị trong Autodesk Revit Structure.

StructuralAnalysis Lệnh hiển thị khi có sẵn các công cụ chỉnh sửa kỷ luật Phân tích cấu trúc.

MassingAndSite

Lệnh này hiển thị khi có sẵn các công cụ chỉnh sửa Khối lượng và Quy tắc trang web.

Phân tích năng lượng Lệnh hiển thị khi có sẵn các công cụ chỉnh sửa kỷ luật Phân tích năng lượng.

Cơ khí Lệnh hiển thị khi có sẵn các công cụ chỉnh sửa kỷ luật Cơ khí, ví dụ như trong Autodesk Revit MEP.

Điện Lệnh hiển thị khi có sẵn các công cụ chỉnh sửa kỷ luật Điện, ví dụ như trong Autodesk Revit MEP.

Đường ống Lệnh hiển thị khi có sẵn các công cụ chỉnh sửa kỷ luật Đường ống, ví dụ như trong Autodesk Revit MEP.

MechanicalAnalysis Lệnh hiển thị khi các công cụ chỉnh sửa kỷ luật Phân tích Cơ học khả dụng.

PipingAnalysis Lệnh hiển thị khi có sẵn các công cụ chỉnh sửa kỷ luật Phân tích đường ống.

Phân tích điện Lệnh này hiển thị khi có sẵn các công cụ chỉnh sửa kỷ luật Phân tích Điện.

Tiện ích bổ trợ .NET dành cho tệp kê khai

Tiện ích .NET DLL RevitAddInUtility.dll cung cấp một API chuyên dụng có khả năng đọc, ghi và sửa đổi tệp kê khai Revit Add-In. Nó được thiết kế để sử dụng
từ trình cài đặt sản phẩm và tập lệnh. Tham khảo tài liệu API trong tệp trợ giúp RevitAddInUtility.chm trong thư mục cài đặt SDK.

Vùng mã 3-11: Tạo và chỉnh sửa tệp kê khai


1. // tạo một tệp kê khai addin mới 2.
RevitAddInManifest Manifest = new RevitAddInManifest (); 3. 4. // tạo
một lệnh bên ngoài 5. RevitAddInCommand command1 = new RevitAddInCommand
("full path \\ assemblyName.dll", 6. 7. command1.Description =
"description"; 8. command1.Text = "display text" ; 9.
Guid.NewGuid (), "namespace.className");

10. // lệnh này chỉ hiển thị trong Revit MEP, Structure, và chỉ hiển thị 11. // trong
tài liệu Dự án hoặc khi không có tài liệu nào cả 12. command1.Discipline =
Discipline.Mechanical | Kỷ luật.Electrical | 13.
Kỷ luật.Piping | Kỷ luật, Kiến trúc; 14.
command1.VisibilityMode = VisibilityMode.NotVosystemInFamily;
15.
16. // tạo ứng dụng bên ngoài 17.
RevitAddInApplication application1 = new RevitAddInApplication ("appName", "full path \\
assemblyName.dll", Guid.NewGuid (), "namespace.className"); 18.

19. 20. // thêm cả (các) lệnh và (các) ứng dụng vào tệp kê khai 21.
Manifest.AddInCommands.Add (command1); 22. Manifest.AddInApplication.Add
(application1); 23. 24. // lưu tệp kê khai vào một tệp 25.
RevitProduct revitProduct1 = RevitProductUtility.GetAllInstalledRevitProducts
() [0]; 26. Manifest.SaveAs (revitProduct1.AllUsersAddInFolder + "\\
RevitAddInUtilitySample.addin");
Machine Translated by Google

Vùng mã 3-12: Đọc tệp kê khai hiện có

1. RevitProduct revitProduct1 = RevitProductUtility.GetAllInstalledRevitProducts () [0];


2.
3. RevitAddInManifest revitAddInManifest =
4. Autodesk.RevitAddIns.AddInManifestUtility.GetRevitAddInManifest (
5. revitProduct1.AllUsersAddInFolder + "\\ RevitAddInUtilitySample.addin");

Bản địa hóa

Bạn có thể cho phép Revit bản địa hóa các tài nguyên mà người dùng có thể nhìn thấy của nút lệnh bên ngoài (bao gồm Văn bản, hình ảnh biểu tượng lớn,
mô tả dài và ngắn và hình ảnh chú giải công cụ). Bạn sẽ cần tạo một DLL vệ tinh .NET chứa các chuỗi, hình ảnh và biểu tượng cho nút.
Sau đó, thay đổi giá trị của các thẻ trong tệp .addin để tương ứng với tên của tài nguyên trong dll Vệ tinh, nhưng được thêm vào trước ký tự @. Vì vậy,
thẻ:

Vùng mã 3-13: Mục nhập Văn bản không được bản địa hóa

<Text> Trình quản lý tiện ích mở rộng </Text>

Trở thành:

Vùng mã 3-14: Mục nhập văn bản được bản địa hóa

<Text> @ExtensionText </Text>

trong đó ExtensionText là tên của tài nguyên được tìm thấy trong Satellite DLL.

Các DLL vệ tinh được mong đợi sẽ nằm trong một thư mục với tên của ngôn ngữ của ngôn ngữ-văn hóa, chẳng hạn như en hoặc en-US. Thư mục phải được
đặt trong thư mục chứa hợp ngữ bổ trợ. Xem http://msdn.microsoft.com/en-us/library/e9zazcx5.aspx
để tạo các DLL vệ tinh được quản lý.

Bạn có thể buộc Revit sử dụng DLL tài nguyên ngôn ngữ cụ thể, bất kể ngôn ngữ của phiên Revit là gì, bằng cách chỉ định rõ ràng ngôn ngữ và văn hóa bằng thẻ
LanguageType.

Vùng mã 3-15: Sử dụng thẻ LanguageType

<LanguageType> English_USA </LanguageType>

Ví dụ: mục nhập ở trên sẽ buộc Revit luôn tải các giá trị từ en-US Satellite DLL và bỏ qua cài đặt ngôn ngữ và văn hóa Revit hiện tại khi xem xét các
thành viên có thể bản địa hóa của tệp kê khai lệnh bên ngoài.

Revit hỗ trợ 11 ngôn ngữ được định nghĩa trong Autodesk.Revit.ApplicationServices.LanguageType kiểu liệt kê: English_USA, German, Spanish, French, Italian,
Dutch, Chinese_Simplified, Chinese_Traditional, Japanese, Korean và Russian.
Machine Translated by Google

Thuộc tính

API Revit cung cấp một số thuộc tính để định cấu hình hành vi ExternalCommand và ExternalApplication.

Giao dịch

Thuộc tính tùy chỉnh Autodesk.Revit.Attributes.TransactionMode phải được áp dụng cho lớp triển khai của giao diện IExternalCommand của bạn để kiểm soát hành vi giao
dịch cho lệnh bên ngoài. Không có mặc định cho tùy chọn này. Chế độ này kiểm soát cách khung API mong đợi các giao dịch được sử dụng khi lệnh được gọi. Các giá trị
được hỗ trợ là:

• TransactionMode.Automatic - Revit sẽ tạo một giao dịch trong tài liệu đang hoạt động trước khi lệnh bên ngoài được thực thi và

giao dịch sẽ được cam kết hoặc quay trở lại sau khi lệnh hoàn thành (dựa trên giá trị trả về của lệnh gọi lại Bên ngoài). Lệnh không thể tạo
và bắt đầu các Giao dịch của riêng nó, nhưng nó có thể tạo các Giao dịch con. Lệnh phải báo cáo trạng thái thành công hoặc thất bại của nó với giá trị trả
về Kết quả.

• TransactionMode.Manual - Revit sẽ không tạo một giao dịch (nhưng nó sẽ tạo một nhóm giao dịch bên ngoài để khôi phục tất cả các thay đổi nếu
lệnh bên ngoài trả về lỗi). Thay vào đó, bạn có thể sử dụng kết hợp Giao dịch, Giao dịch con và Nhóm giao dịch tùy ý. Bạn sẽ phải tuân theo
tất cả các quy tắc liên quan đến việc sử dụng các giao dịch và các lớp liên quan. Bạn sẽ phải cung cấp tên giao dịch của mình sau đó sẽ xuất hiện trong menu Hoàn
tác. Revit sẽ kiểm tra xem tất cả các giao dịch (cũng như các nhóm và giao dịch phụ) đã được đóng đúng cách khi trả về từ một lệnh bên ngoài hay chưa. Nếu
không, Revit sẽ loại bỏ tất cả các thay đổi được thực hiện đối với mô hình.

• TransactionMode.ReadOnly - Không có giao dịch (cũng như nhóm) nào được tạo và không có giao dịch nào có thể được tạo trong thời gian tồn tại của lệnh. Lệnh bên
ngoài chỉ có thể sử dụng các phương thức đọc từ mô hình. Các ngoại lệ sẽ được ném ra nếu lệnh cố gắng bắt đầu một giao dịch (hoặc nhóm) hoặc cố gắng ghi vào mô
hình.

Trong cả ba chế độ, TransactionMode chỉ áp dụng cho tài liệu đang hoạt động. Bạn có thể mở các tài liệu khác trong quá trình thực hiện lệnh và bạn có thể có toàn
quyền kiểm soát việc tạo và sử dụng Giao dịch, Giao dịch con và Nhóm giao dịch trên các tài liệu khác đó (ngay cả trong chế độ ReadOnly).

Ví dụ: để đặt lệnh bên ngoài để sử dụng chế độ giao dịch tự động:

Vùng mã 3-18: Giao dịch


[Giao dịch (TransactionMode.Automatic)]
lớp công khai Lệnh: IExternalCommand
{
public Autodesk.Revit.IExternalCommand.Result Execute (
Autodesk.Revit.ExternalCommandData commandData,

thông báo chuỗi ref, các phần tử Autodesk.Revit.DB.ElementSet)


{
// Thực hiện lệnh, sửa đổi trực tiếp tài liệu đang hoạt động // và không cần bắt đầu / cam
kết giao dịch.

}
}

Xem Giao dịch.

JournalingAttribute

Thuộc tính tùy chỉnh Autodesk.Revit.Attributes.JournalingAttribute có thể được tùy chọn áp dụng cho lớp triển khai của giao diện IExternalCommand của bạn để
kiểm soát hành vi ghi nhật ký trong quá trình thực thi lệnh bên ngoài. Có hai lựa chọn để viết nhật ký:

• JournalMode.NoCommandData - Nội dung của bản đồ ExternalCommandData.JournalData không được ghi vào tạp chí Revit. Tùy chọn này cho phép các lệnh gọi Revit API ghi
vào nhật ký khi cần thiết. Tùy chọn này cho phép các lệnh gọi giao diện người dùng Revit để lựa chọn hoặc phản hồi cho hộp thoại tác vụ phát lại một cách chính
xác.

• JournalMode.UsingCommandData - Sử dụng IDictionary <String, String> được cung cấp trong dữ liệu lệnh. Thao tác này sẽ ẩn tất cả các mục nhật ký Revit giữa lệnh
gọi bên ngoài và mục nhập IDictionary <String, String>. Các lệnh gọi giao diện người dùng Revit để lựa chọn hoặc phản hồi cho hộp thoại tác vụ có thể không
phát lại chính xác. Đây là mặc định nếu JournalingAttribute không được chỉ định.
Machine Translated by Google

Vùng mã 3-19: JournalingAttribute

[Viết nhật ký (JournalingMode.UsingCommandData)]


lớp công khai Lệnh: IExternalCommand
{
public Autodesk.Revit.IExternalCommand.Result Execute (
Autodesk.Revit.ExternalCommandData commandData, thông báo
chuỗi ref, phần tử Autodesk.Revit.DB.ElementSet)
{
trả về Autodesk.Revit.UI.Result.Succeeded;
}
}

Revit Exceptions
Khi các phương thức API gặp lỗi không nghiêm trọng, chúng sẽ đưa ra một ngoại lệ. Các trường hợp ngoại lệ nên được bổ sung Revit. Tệp trợ giúp Revit API
chỉ định các ngoại lệ thường gặp cho các phương pháp cụ thể. Tất cả các phương thức Revit API đều ném một lớp con của
Autodesk.Revit.Exceptions.ApplicationException. Các ngoại lệ này phản ánh chặt chẽ các ngoại lệ .NET tiêu chuẩn như:

• ArgumentException

• Không hợp lệ

• FileNotFoundException

Tuy nhiên, một số lớp con này là duy nhất đối với Revit:

• AutoJoinFailedException

• RegenerationFailedException

• ModificationOutsideTransactionException

Ngoài ra, có một loại ngoại lệ đặc biệt được gọi là InternalException, đại diện cho một đường dẫn lỗi không được dự đoán trước. Các trường hợp ngoại lệ
của loại này mang thông tin chẩn đoán bổ sung có thể được chuyển lại cho Autodesk để chẩn đoán.
Machine Translated by Google

Bảng điều khiển và bảng điều khiển ruy-băng

Revit cung cấp các giải pháp API để tích hợp các bảng điều khiển và bảng điều khiển ruy-băng tùy chỉnh. Các API này được sử dụng với IExternalApplication. Các
bảng ruy-băng tùy chỉnh có thể được thêm vào tab Bổ trợ, tab Phân tích hoặc vào tab ruy-băng tùy chỉnh mới.

Bảng điều khiển có thể bao gồm các nút, cả lớn và nhỏ, có thể là nút nhấn đơn giản, nút kéo xuống chứa nhiều lệnh hoặc nút tách là nút kéo xuống có gắn nút nhấn mặc
định. Ngoài các nút, bảng điều khiển có thể bao gồm các nhóm radio, hộp tổ hợp và hộp văn bản. Bảng điều khiển cũng có thể bao gồm các dấu phân cách dọc để giúp phân
tách các lệnh thành các nhóm hợp lý. Cuối cùng, các bảng có thể bao gồm một điều khiển trượt ra được truy cập bằng cách nhấp vào cuối bảng.

Vui lòng xem Nguyên tắc về ruy-băng trong Nguyên tắc giao diện người dùng API để biết thông tin về cách phát triển giao diện người dùng tuân thủ các tiêu chuẩn
được sử dụng bởi Autodesk.

Tạo một tab ruy-băng mới

Mặc dù bảng điều khiển ruy-băng có thể được thêm vào tab Bổ trợ hoặc Phân tích, chúng cũng có thể được thêm vào tab ruy-băng tùy chỉnh mới. Tùy chọn này chỉ nên
được sử dụng nếu cần thiết. Để đảm bảo rằng các tab ruy-băng Revit tiêu chuẩn vẫn hiển thị, giới hạn 20 tab ruy-băng tùy chỉnh được áp dụng. Hình ảnh sau đây cho
thấy một tab ruy-băng mới với một bảng điều khiển ruy-băng và một vài điều khiển đơn giản.

Dưới đây là mã tạo tab ruy-băng ở trên.

Vùng mã: Tab ruy-băng mới


1. publicResult OnStartup (ứng dụng UIControlledApplication) 2. { 3.

// Tạo một tab ribbon tùy chỉnh


4. String tabName = "Tên Tab này";
5. application.CreateRibbonTab (tabName);

6. 7. // Tạo hai nút ấn PushButtonData


button1 = newPushButtonData ("Button1", "My Button # 1", @ "C: \ ExternalCommands.dll",
8. 9. "Revit.Test.Command1"); PushButtonData button2 = newPushButtonData ("Button2",
10. "My Button # 2", @ "C: \ ExternalCommands.dll", "Revit.Test.Command2");
11.
12.
13. // Tạo bảng điều khiển ruy
14. -băng RibbonPanel m_projectPanel = application.CreateRibbonPanel (tabName, "Tên bảng này"); // Thêm các nút vào
15. bảng Danh sách <RibbonItem> projectButtons = newList <RibbonItem> (); projectButtons.AddRange
16. (m_projectPanel.AddStackedItems (button1, button2));
17.
18.
19. returnResult.Succeeded;
20. }

Tạo bảng điều khiển và bảng điều khiển ruy-băng mới

Hình ảnh sau đây hiển thị bảng điều khiển ruy-băng trên tab Phần bổ trợ bằng cách sử dụng các điều khiển bảng điều khiển ruy-băng khác nhau. Các phần sau đây mô
tả chi tiết hơn các điều khiển này và cung cấp các mẫu mã để tạo từng phần của dải băng.

Hình 14: Bảng điều khiển và bảng điều khiển ribbon mới
Machine Translated by Google

Đoạn mã sau đây phác thảo các bước thực hiện để tạo bảng điều khiển ruy-băng như hình trên. Mỗi hàm được gọi trong mẫu này được cung cấp trong các mẫu tiếp theo
ở phần sau của phần này. Những mẫu đó giả định rằng có một tổ hợp đặt tại D: \
Sample \ HelloWorld \ bin \ Debug \ Hello.dll có chứa các loại lệnh bên ngoài:

• Xin chào.HelloButton

• Xin chào.HelloOne

• Xin chào.HelloTwo

• Xin chào.HelloThree

• Xin chào.HelloA

• Xin chào.HelloB

• Xin chào.HelloC

• Xin chào.HelloRed

• Xin chào.HelloBlue

• Xin chào.HelloGreen

Vùng mã: Bảng điều khiển và bảng điều khiển ruy-băng

1. Kết quả công khai OnStartup (ứng dụng Autodesk.Revit.UI.UIControlledApplication) 2. { 3. 4.

Bảng điều khiển RibbonPanel = app.CreateRibbonPanel (" Bảng điều khiển Ribbon mới");

AddRadioGroup (bảng điều


5. 6. khiển); panel.AddSeparator ();
AddPushButton (bảng điều
7. 8. khiển); AddSplitButton (bảng
9. điều khiển); AddStackedButtons (bảng
10. điều khiển); AddSlideOut (bảng điều khiển);
11.
12. trả về Kết quả.
13. }

Bảng điều khiển ruy-băng

Bảng điều khiển ruy-băng tùy chỉnh có thể được thêm vào tab Bổ trợ (mặc định) hoặc tab Phân tích hoặc chúng có thể được thêm vào tab ruy-băng tùy chỉnh mới.
Có nhiều loại điều khiển ruy-băng khác nhau có thể được thêm vào bảng điều khiển ruy-băng sẽ được thảo luận chi tiết hơn trong phần tiếp theo. Tất cả các
điều khiển ruy-băng có một số thuộc tính và chức năng chung.

Các lớp điều khiển ruy-băng

Mỗi điều khiển ruy-băng có hai lớp được liên kết với nó - một lớp bắt nguồn từ RibbonItemData được sử dụng để tạo điều khiển (tức là
SplitButtonData) và thêm nó vào bảng điều khiển ruy-băng và một bảng dẫn xuất từ RibbonItem (tức là SplitButton) đại diện cho mục sau khi nó được thêm vào bảng.
Các thuộc tính có sẵn từ RibbonItemData (và các lớp dẫn xuất) cũng có sẵn từ RibbonItem (và các lớp dẫn xuất tương ứng). Các thuộc tính này có thể được đặt trước
khi thêm điều khiển vào bảng hoặc có thể được đặt bằng cách sử dụng lớp RibbonItem sau khi nó đã được thêm vào bảng.

Chú giải công cụ

Hầu hết các điều khiển có thể có một bộ chú giải công cụ (sử dụng thuộc tính ToolTip) được hiển thị khi người dùng di chuyển chuột qua điều khiển. Khi người dùng
di chuột qua điều khiển trong một khoảng thời gian dài, chú giải công cụ mở rộng sẽ được hiển thị bằng cách sử dụng thuộc tính LongDescription và ToolTipImage. Nếu
cả LongDescription và ToolTipImage đều không được đặt, chú giải công cụ mở rộng sẽ không được hiển thị. Nếu không có ToolTip nào được cung cấp, thì văn bản của
điều khiển (RibbonItem.ItemText) được hiển thị khi chuột di chuyển qua điều khiển.

Hình 15: Chú giải công cụ mở rộng


Machine Translated by Google

Trợ giúp theo ngữ cảnh

Các điều khiển có thể có trợ giúp theo ngữ cảnh được liên kết với chúng. Khi người dùng di chuột qua điều khiển và nhấn F1, trợ giúp theo ngữ cảnh sẽ được kích hoạt. Các
tùy chọn trợ giúp theo ngữ cảnh bao gồm liên kết đến một URL bên ngoài, khởi chạy tệp trợ giúp (chm) được cài đặt cục bộ hoặc liên kết đến một chủ đề trên wiki trợ giúp
Autodesk. Lớp ContextualHelp được sử dụng để tạo một loại trợ giúp theo ngữ cảnh và sau đó RibbonItem.SetContextualHelp () (hoặc RibbonItemData.SetContextualHelp ()) liên
kết nó với một điều khiển. Khi một phiên bản ContextualHelp được liên kết với một điều khiển, văn bản "Nhấn F1 để được trợ giúp thêm" sẽ xuất hiện bên dưới chú giải công
cụ khi con chuột di chuột qua điều khiển, như được hiển thị bên dưới.

Ví dụ sau liên kết Trợ giúp theo ngữ cảnh mới với điều khiển nút nhấn. Nhấn F1 khi di chuột qua nút nhấn sẽ mở trang chủ Autodesk trong cửa sổ trình duyệt mới.

Vùng mã: Trợ giúp theo ngữ cảnh

1. private void AddPushButton (bảng điều khiển RibbonPanel)


2. { 3. 4.
PushButton pushButton = panel.AddItem ( PushButtonData mới ("HelloWorld",
"HelloWorld", @ "D: \ Sample \ HelloWorld \ bin \ Debug \ HelloWorld.dll", "HelloWorld.CsHelloWorld")) là PushButton;

5. 6. // Đặt ToolTip và trợ giúp theo ngữ cảnh


7. pushButton.ToolTip = "Say Hello World";
số 8.
ContextualHelp contextHelp = new ContextualHelp (ContextualHelpType.Url, "http://
9. www.autodesk.com"); pushButton.SetContextualHelp (contextHelp);
10.
11.
12. // Đặt hình ảnh lớn hiển thị trên button
13. pushButton.LargeImage = new BitmapImage (new Uri
14. (@ "D: \ Sample \ HelloWorld \ bin \ Debug \ 39-Globe_32x32.png"));
15. }

Lớp ContextualHelp có phương thức Launch () có thể được gọi để hiển thị chủ đề trợ giúp được chỉ định bởi nội dung của đối tượng ContextualHelp này bất kỳ lúc nào, giống
như khi phím F1 được nhấn khi điều khiển đang hoạt động. Điều này cho phép liên kết các chủ đề trợ giúp với các thành phần giao diện người dùng bên trong hộp thoại được
tạo bởi một ứng dụng bổ trợ.

Liên kết hình ảnh với các điều khiển

Tất cả các điều khiển này có thể có một hình ảnh được liên kết với chúng bằng cách sử dụng thuộc tính LargeImage. Kích thước tốt nhất cho hình ảnh được liên kết với các
nút điều khiển lớn, chẳng hạn như dải băng và nút thả xuống không xếp chồng lên nhau, là 32 × 32 pixel, nhưng hình ảnh lớn hơn sẽ được điều chỉnh để vừa với nút. Các nút
xếp chồng và các điều khiển nhỏ như hộp văn bản và hộp tổ hợp phải có tập hợp hình ảnh 16 × 16 pixel. Các nút lớn cũng phải có hình ảnh 16 × 16 pixel được đặt cho thuộc
tính Hình ảnh. Hình ảnh này được sử dụng nếu lệnh được chuyển đến Thanh công cụ Truy nhập Nhanh. Nếu thuộc tính Hình ảnh không được đặt, sẽ không có hình ảnh nào được
hiển thị nếu lệnh được chuyển đến Thanh công cụ Truy nhập Nhanh. Lưu ý rằng nếu sử dụng hình ảnh lớn hơn 16 × 16 pixel, nó sẽ KHÔNG được điều chỉnh để vừa với thanh công
cụ.

ToolTipImage sẽ được hiển thị bên dưới LongDescription trong chú giải công cụ mở rộng, nếu được cung cấp. Không có kích thước được khuyến nghị cho hình ảnh này.

Tính khả dụng của kiểm soát ruy-băng

Các điều khiển ruy-băng có thể được bật hoặc tắt với thuộc tính RibbonItem.Enabled hoặc được hiển thị hoặc ẩn với thuộc tính RibbonItem.Vither.
Machine Translated by Google

Điều khiển ruy-băng

Ngoài các điều khiển sau, dấu phân cách dọc có thể được thêm vào bảng dải băng để nhóm các bộ điều khiển có liên quan.

Nút ấn

Có ba loại nút bạn có thể thêm vào bảng điều khiển: nút nhấn đơn giản, nút thả xuống và nút chia nhỏ. Nút HelloWorld trong Hình 13 là một nút nhấn. Khi nhấn
nút, lệnh tương ứng sẽ được kích hoạt.

Ngoài thuộc tính Enabled, PushButton có thuộc tính Av AvailableClassName có thể được sử dụng để đặt tên của giao diện IExternalCommandAv Khả dụng
điều khiển khi lệnh có sẵn.

Vùng mã: Thêm nút nhấn

1. private void AddPushButton (bảng điều khiển RibbonPanel) 2. { 3. 4.

PushButton pushButton = panel.AddItem ( PushButtonData mới ("HelloWorld",


"HelloWorld", @ "D: \ HelloWorld.dll", "HelloWorld.CsHelloWorld")) dưới dạng PushButton;

5. 6. pushButton.ToolTip = "Nói Xin chào Thế giới"; // Đặt hình


ảnh lớn hiển thị trên button pushButton.LargeImage = new
7. 8. BitmapImage (new Uri (@ "D: \ Sample \ HelloWorld \ bin
\ Debug \ 39-Globe_32x32.png"));
9. 10. }

Các nút thả xuống

Các nút thả xuống mở rộng để hiển thị hai hoặc nhiều lệnh trong menu thả xuống. Trong Revit API, các nút thả xuống được gọi là PulldownButtons. Các dấu phân
cách ngang có thể được thêm vào giữa các mục trong menu thả xuống.

Mỗi lệnh trong trình đơn thả xuống cũng có thể có một LargeImage được liên kết như thể hiện trong ví dụ trên.

Các nút tách

Các nút tách là các nút thả xuống có gắn một nút nhấn mặc định. Nửa trên của nút hoạt động giống như một nút nhấn trong khi nửa dưới hoạt động như một
nút thả xuống. Nút Tùy chọn Một trong Hình 13 là một nút tách.

Ban đầu, nút nhấn sẽ là mục hàng đầu trong danh sách thả xuống. Tuy nhiên, bằng cách sử dụng thuộc tính IsSynchronizedWithCurrentItem, lệnh mặc định (được
hiển thị dưới dạng nút nhấn nửa trên của nút tách) có thể được đồng bộ hóa với lệnh được sử dụng cuối cùng. Theo mặc định, nó sẽ được đồng bộ hóa. Chọn
Tùy chọn Hai trong nút tách từ Hình 13 sản lượng trên:

Hình 16: Nút tách được đồng bộ hóa với mục hiện tại

Lưu ý rằng các thuộc tính ToolTip, ToolTipImage và LongDescription cho SplitButton bị bỏ qua. Chú giải công cụ cho nút nhấn hiện tại được hiển thị thay thế.
Machine Translated by Google

Vùng mã: Thêm nút tách


1. private void AddSplitButton (bảng điều khiển RibbonPanel) 2.
{ 3. 4.
string assembly = @ "D: \ Sample \ HelloWorld \ bin \ Debug \ Hello.dll";

// tạo nút nhấn cho nút chia nhỏ thả xuống PushButtonData bOne =
5. 6. new PushButtonData ("ButtonNameA", "Option One", assembly, "Hello.HelloOne"); bOne.LargeImage
= new BitmapImage (new Uri (@ "D: \ Sample \ HelloWorld \ bin \ Debug \ One.bmp"));
7. 8.
9.
10.
11. PushButtonData bTwo = new PushButtonData ("ButtonNameB", "Tùy chọn Hai", assembly,
12. "Hello.HelloTwo"); bTwo.LargeImage = new BitmapImage (new Uri (@ "D: \ Sample \
13. HelloWorld \ bin \ Debug \ Two.bmp"));
14.
15.
16. PushButtonData bThree = new PushButtonData ("ButtonNameC", "Tùy chọn Ba", assembly,
17. "Hello.HelloThree"); bThree.LargeImage = new BitmapImage (new Uri (@ "D: \ Sample \ HelloWorld \
18. bin \ Debug \ Three.bmp"));
19.
20.
21. SplitButtonData sb1 = new SplitButtonData ("splitButton1", "Split"); SplitButton sb =
22. panel.AddItem (sb1) dưới dạng SplitButton; sb.AddPushButton (bOne); sb.AddPushButton
23. (bTwo); sb.AddPushButton (bThree);
24.
25.

26. }

Các nút radio

Nhóm nút radio là một tập hợp các nút bật tắt loại trừ lẫn nhau; mỗi lần chỉ có thể chọn một. Sau khi thêm RadioButtonGroup vào một bảng điều khiển, hãy sử dụng các phương thức
AddItem () hoặc AddItems () để thêm các nút bật tắt vào nhóm. Các nút chuyển đổi có nguồn gốc từ PushButton. Thuộc tính RadioButtonGroup.Current có thể được sử dụng để truy cập
vào nút hiện đang được chọn.

Lưu ý rằng chú giải công cụ không áp dụng cho các nhóm nút radio. Thay vào đó, chú giải công cụ cho mỗi nút bật tắt được hiển thị khi chuột di chuyển qua các nút riêng lẻ.

Vùng mã: Thêm nhóm nút radio


1. private void AddRadioGroup (bảng điều khiển RibbonPanel) 2.
{ 3. 4.
// thêm nhóm nút radio
RadioButtonGroupData radioData = new RadioButtonGroupData ("radioGroup"); RadioButtonGroup
radioButtonGroup = panel.AddItem (radioData) as RadioButtonGroup;
5. 6.

// tạo nút bật tắt và thêm vào nhóm nút radio ToggleButtonData tb1 = new
7. 8. ToggleButtonData ("toggleButton1", "Red"); tb1.ToolTip = "Tùy chọn màu đỏ"; tb1.LargeImage
= new BitmapImage (new Uri (@ "D: \ Sample \ HelloWorld \ bin \ Debug \ Red.bmp"));
9. 10. ToggleButtonData tb2 = new ToggleButtonData ("toggleButton2", "Xanh lục"); tb2.ToolTip = "Tùy chọn màu xanh lá
11. cây"; tb2.LargeImage = new BitmapImage (new Uri (@ "D: \ Sample \ HelloWorld \ bin \ Debug \ Green.bmp"));
12. ToggleButtonData tb3 = new ToggleButtonData ("toggleButton3", "Xanh lam"); tb3.ToolTip = "Tùy chọn màu xanh lam";
13. tb3.LargeImage = new BitmapImage (new Uri (@ "D: \ Sample \ HelloWorld \ bin \ Debug \ Blue.bmp"));
14. radioButtonGroup.AddItem (tb1); radioButtonGroup.AddItem (tb2); radioButtonGroup.AddItem (tb3);
15.
16.
17.
18.
19.

20. }

Hộp văn bản

Hộp văn bản là một điều khiển đầu vào để người dùng nhập văn bản. Hình ảnh cho hộp văn bản có thể được sử dụng như một nút có thể nhấp bằng cách đặt thuộc
tính ShowImageAsButton thành true. Mặc định này sai. Hình ảnh được hiển thị ở bên trái của hộp văn bản khi ShowImageAsButton là false và được hiển thị ở cuối bên phải của
hộp văn bản khi nó hoạt động như một nút, như trong Hình 13.

Văn bản được nhập vào hộp văn bản chỉ được chấp nhận nếu người dùng nhấn phím Enter hoặc nếu họ nhấp vào hình ảnh được liên kết khi hình ảnh được hiển thị dưới dạng nút. Nếu
không, văn bản sẽ trở lại giá trị trước đó của nó.

Ngoài việc cung cấp chú giải công cụ cho hộp văn bản, thuộc tính PromptText có thể được sử dụng để cho người dùng biết loại thông tin cần nhập vào hộp văn bản. Văn bản
lời nhắc được hiển thị khi hộp văn bản trống và không có tiêu điểm bàn phím. Văn bản này được hiển thị ở dạng nghiêng.
Hộp văn bản trong Hình 13 có dòng chữ nhắc "Nhập nhận xét".

Chiều rộng của hộp văn bản có thể được đặt bằng cách sử dụng thuộc tính Chiều rộng. Giá trị mặc định là 200 đơn vị độc lập với thiết bị.
Machine Translated by Google

Sự kiện TextBox.EnterPressed được kích hoạt khi người dùng nhấn enter hoặc khi họ nhấp vào hình ảnh được liên kết cho hộp văn bản khi ShowImageAsButton được đặt thành true. Khi triển
khai một trình xử lý sự kiện EnterPressed, hãy truyền đối tượng người gửi tới TextBox để nhận giá trị mà người dùng đã nhập như được hiển thị trong ví dụ sau.

Vùng mã: Trình xử lý sự kiện TextBox.EnterPressed

1. void ProcessText (object sender, Autodesk.Revit.UI.Events.TextBoxEnterPressedEventArgs args) 2. { 3.

// ép kiểu người gửi dưới dạng TextBox để lấy giá trị văn bản
TextBox textBox = sender as TextBox; string strText =
textBox.Value as string;
4. 5. 6. }

Thuộc tính ItemText kế thừa không có tác dụng đối với TextBox. Văn bản do người dùng nhập có thể được lấy từ thuộc tính Giá trị, thuộc tính này phải được chuyển đổi thành chuỗi.

Xem phần về các mục ruy-băng xếp chồng lên nhau để biết ví dụ về cách thêm TextBox vào bảng điều khiển ruy-băng, bao gồm cách đăng ký sự kiện ở trên.

Hộp kết hợp

Hộp tổ hợp là một hộp kéo xuống với một tập hợp các mục có thể chọn. Sau khi thêm ComboBox vào bảng điều khiển, hãy sử dụng phương thức AddItem () hoặc AddItems () để thêm ComboBoxMembers
vào danh sách.

Dấu phân tách cũng có thể được thêm vào các mục riêng biệt trong danh sách hoặc các thành viên có thể được nhóm tùy ý bằng cách sử dụng thuộc tính ComboBoxMember.GroupName. Tất cả các
thành viên có cùng Tên nhóm sẽ được nhóm lại với nhau với tiêu đề hiển thị tên nhóm. Bất kỳ mục nào không được gán GroupName sẽ được đặt ở đầu danh sách. Lưu ý rằng khi nhóm các mục,
không nên sử dụng dấu phân cách vì chúng sẽ được đặt ở cuối nhóm hơn là theo thứ tự chúng được thêm vào.

Hình 17: Hộp tổ hợp với phân nhóm

ComboBox có ba sự kiện:

• CurrentChanged - được kích hoạt khi mục hiện tại của ComboBox được thay đổi

• DropDownClosed - được kích hoạt khi menu thả xuống của ComboBox đóng lại

• DropDownClosed - được kích hoạt khi menu thả xuống của ComboBox được mở

Xem vùng mã trong phần sau trên các mục ruy-băng xếp chồng lên nhau để biết mẫu thêm ComboBox vào bảng điều khiển ruy-băng.

Các mục bảng xếp chồng lên nhau

Để tiết kiệm không gian bảng điều khiển, bạn có thể thêm các mục bảng điều khiển nhỏ thành chồng hai hoặc ba. Mỗi mục trong ngăn xếp có thể là một nút nhấn, một nút thả xuống, một hộp tổ
hợp hoặc một hộp văn bản. Không thể xếp chồng lên nhau các nhóm nút radio và nút tách. Các nút xếp chồng phải có hình ảnh được liên kết thông qua thuộc tính Hình ảnh của chúng, thay vì Hình
ảnh lớn. Hình ảnh 16 × 16 là lý tưởng cho các nút nhỏ xếp chồng lên nhau.
Machine Translated by Google

Ví dụ sau tạo hộp văn bản và hộp tổ hợp xếp chồng trong Hình 13.

Vùng mã: Thêm hộp văn bản và hộp tổ hợp dưới dạng các mục xếp chồng lên nhau

1. private void AddStackedButtons (bảng điều khiển RibbonPanel) 2.


{ 3.
ComboBoxData cbData = new ComboBoxData ("comboBox");
4.
5. TextBoxData textData = new TextBoxData (" Hộp văn bản");
6. textData.Image = new BitmapImage (new Uri (@ "D: \ Sample \
7. HelloWorld \ bin \ Debug \ 39-Globe_16x16.png"));
số 8. textData.Name = "Hộp văn bản";
9. textData.ToolTip = "Nhập một số văn bản vào đây";
10. textData.LongDescription = "<p> Đây là văn bản sẽ xuất hiện bên cạnh hình ảnh </p>" + "<p> khi người dùng di
11. chuột qua điều khiển </p>";
12. textData.ToolTipImage = new
13. BitmapImage (new Uri (@ "D: \ Sample \ HelloWorld \ bin \ Debug \ 39-Globe_32x32.png"));
14.
15. IList <RibbonItem> stackedItems = panel.AddStackedItems (textData, cbData); if
16. (stackedItems.Count> 1) {
17.
18. TextBox tBox = stackedItems [0] dưới dạng TextBox; if
19. (tBox! = null) {
20.
21. tBox.PromptText = "Nhập nhận xét";
22. tBox.ShowImageAsButton = true; tBox.ToolTip =
23. "Nhập một số văn bản"; // Đăng ký trình xử lý
24. sự kiện ProcessText tBox.EnterPressed + =
25.
26. EventHandler mới <Autodesk.Revit.UI.Events.TextBoxEnterPressedEventArgs> (ProcessText); }
27.
28.
29. ComboBox cBox = stackedItems [1] as ComboBox; if (cBox!
30. = null) {
31.
32. cBox.ItemText = "ComboBox";
33. cBox.ToolTip = "Chọn một tùy chọn";
34. cBox.LongDescription = "Chọn một số hoặc chữ cái";
35.
36. ComboBoxMemberData cboxMemDataA = new ComboBoxMemberData ("A", "Tùy chọn A"); cboxMemDataA.Image
37. = new BitmapImage (new Uri (@ "D: \ Sample \ HelloWorld \ bin \ Debug \ A.bmp"));
38.
39. cboxMemDataA.GroupName = "Chữ cái";
40. cBox.AddItem (cboxMemDataA);
41.
42. ComboBoxMemberData cboxMemDataB = new ComboBoxMemberData ("B", "Tùy chọn B"); cboxMemDataB.Image
43. = new BitmapImage (new Uri (@ "D: \ Sample \ HelloWorld \ bin \ Debug \ B.bmp"));
44.
45. cboxMemDataB.GroupName = "Chữ cái";
46. cBox.AddItem (cboxMemDataB);
47.
48. ComboBoxMemberData cboxMemData = new ComboBoxMemberData ("Một", "Tùy chọn 1"); cboxMemData.Image
49. = new BitmapImage (new Uri (@ "D: \ Sample \ HelloWorld \ bin \ Debug \ One.bmp"));
50.
51. cboxMemData.GroupName = "Số"; cBox.AddItem
52. (cboxMemData); ComboBoxMemberData
53. cboxMemData2 = new ComboBoxMemberData ("Hai", "Tùy chọn 2"); cboxMemData2.Image = new BitmapImage
54. (new Uri (@ "D: \ Sample \ HelloWorld \ bin \ Debug \ Two.bmp"));
55.
56. cboxMemData2.GroupName = "Số"; cBox.AddItem
57. (cboxMemData2); ComboBoxMemberData
58. cboxMemData3 = new ComboBoxMemberData ("Ba", "Tùy chọn 3"); cboxMemData3.Image = new BitmapImage (new
59. Uri (@ "D: \ Sample \ HelloWorld \ bin \ Debug \ Three.bmp"));
60.
61. cboxMemData3.GroupName = "Số"; cBox.AddItem
62. (cboxMemData3);
63. }
64. }
65. }
Machine Translated by Google

Bảng điều khiển trượt ra

Sử dụng phương thức RibbonPanel.AddSlideOut () để thêm một trang trình bày vào cuối bảng điều khiển ruy-băng. Khi một trang trình bày được thêm vào,
một mũi tên sẽ hiển thị ở cuối bảng điều khiển, khi được nhấp vào sẽ hiển thị trang trình bày. Sau khi gọi AddSlideOut (), các lệnh gọi tiếp theo để thêm
các mục mới vào bảng sẽ được thêm vào slide-out, do đó, slide-out phải được thêm sau khi tất cả các điều khiển khác đã được thêm vào bảng ribbon.

Hình 18: Trượt ra

Ví dụ sau tạo slide-out được hiển thị ở trên:

Vùng mã: Trình xử lý sự kiện TextBox.EnterPressed

1. private static void AddSlideOut (bảng điều khiển RibbonPanel) 2.


{ 3. 4.
string assembly = @ "D: \ Sample \ HelloWorld \ bin \ Debug \ Hello.dll";

5. panel.AddSlideOut ();
6.
7. // tạo một số điều khiển cho trang trình bày
số 8.
PushButtonData b1 = new PushButtonData ("ButtonName1", "Nút 1",
9. assembly, "Hello.HelloButton");
10. b1.LargeImage = new BitmapImage (new Uri (@
11. "D: \ Sample \ HelloWorld \ bin \ Debug \ 39-Globe_32x32.png"));
12. PushButtonData b2 = new PushButtonData ("ButtonName2", "Nút 2", assembly,
13. "Hello.HelloTwo"); b2.LargeImage = new BitmapImage (new Uri (@ "D: \ Sample \
14. HelloWorld \ bin \ Debug \ 39-Globe_16x16.png"));
15.
16.
17. // các mục được thêm vào sau khi gọi AddSlideOut () được thêm vào bảng điều khiển tự động slide-
18. out.AddItem (b1); panel.AddItem (b2);
19.
Machine Translated by Google

Hộp thoại tác vụ kiểu Revit

TaskDialog là một sự thay thế kiểu Revit cho một MessageBox đơn giản của Windows. Nó có thể được sử dụng để hiển thị thông tin và nhận đầu vào đơn giản từ người dùng.
Nó có một bộ điều khiển chung được sắp xếp theo thứ tự tiêu chuẩn để đảm bảo giao diện nhất quán với phần còn lại của Revit.

Hình 19: Hộp thoại Tác vụ kiểu Revit

Có hai cách để tạo và hiển thị hộp thoại tác vụ cho người dùng. Tùy chọn đầu tiên là xây dựng TaskDialog, đặt các thuộc tính của nó riêng lẻ và sử dụng phương
thức thể hiện Show () để hiển thị nó cho người dùng. Cách thứ hai là sử dụng một trong các phương thức Show () tĩnh để tạo và hiển thị hộp thoại trong một bước. Khi bạn
sử dụng các phương thức tĩnh, chỉ một tập hợp con của các tùy chọn có thể được chỉ định.

Vui lòng xem Hộp thoại Tác vụ trong Nguyên tắc giao diện người dùng API để biết thông tin về cách phát triển hộp thoại tác vụ tuân thủ các tiêu chuẩn được sử dụng
bởi Autodesk.

Ví dụ sau đây cho thấy cách tạo và hiển thị hộp thoại tác vụ được hiển thị ở trên.

Vùng mã 3-27: Hiển thị TaskDialog kiểu Revit

[Autodesk.Revit.Attributes.Transaction (Autodesk.Revit.Attributes.TransactionMode.Automatic)]
lớp TaskDialogExample: IExternalCommand
{
public Autodesk.Revit.UI.Result Execute (ExternalCommandData commandData, ref string message, Autodesk.Revit.DB.ElementSet element)

{
// Lấy ứng dụng và tài liệu từ dữ liệu lệnh bên ngoài.
Ứng dụng ứng dụng = commandData.Application.Application;
Tài liệu activeDoc = commandData.Application.ActiveUIDocument.Document;

// Tạo hộp thoại tác vụ Revit để truyền đạt thông tin cho người dùng.
TaskDialog mainDialog = new TaskDialog ("Xin chào, Revit!");
mainDialog.MainInstruction = "Xin chào, Revit!";
mainDialog.MainContent =
"Mẫu này cho thấy cách sử dụng hộp thoại tác vụ Revit để giao tiếp với người dùng."
+ "Lệnh liên kết bên dưới mở hộp thoại nhiệm vụ bổ sung với nhiều thông tin hơn.";

// Thêm tùy chọn commmandLink vào hộp thoại tác vụ


mainDialog.AddCommandLink (TaskDialogCommandLinkId.CommandLink1,
"Xem thông tin về cài đặt Revit");
mainDialog.AddCommandLink (TaskDialogCommandLinkId.CommandLink2, "Xem thông tin về
tài liệu hoạt động");

// Đặt các nút thông thường và nút mặc định. Nếu không có CommonButton hoặc CommandLink nào được thêm vào,

// hộp thoại tác vụ sẽ hiển thị nút Đóng theo mặc định
mainDialog.CommonButtons = TaskDialogCommonButtons.Close;
mainDialog.DefaultButton = TaskDialogResult.Close;

// Đặt văn bản chân trang. Văn bản chân trang thường được sử dụng để liên kết đến tài liệu trợ giúp.
mainDialog.FooterText =
"<a href=\"http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=2484975 \">"
+ "Nhấp vào đây để xem Trung tâm nhà phát triển API Revit </a>";
Machine Translated by Google

TaskDialogResult tResult = mainDialog.Show ();

// Nếu người dùng nhấp vào liên kết lệnh đầu tiên, Hộp thoại Tác vụ đơn giản // chỉ
với một nút Đóng sẽ hiển thị thông tin về cài đặt Revit. if (TaskDialogResult.CommandLink1 ==
tResult)
{
Hộp thoại TaskDialog_CommandLink1 = new TaskDialog ("Thông tin bản dựng Revit");
Dial_CommandLink1.MainInstruction =
"Tên Phiên bản Revit là:" + app.VersionName + "\ n"
+ "Số Phiên bản Revit là:" + app.VersionNumber + "\ n" +
+ "Phiên bản Revit Build là:" app.VersionBuild;

hộp thoại_CommandLink1.Show ();

// Nếu người dùng nhấp vào liên kết lệnh thứ hai, Hộp thoại Tác vụ đơn giản // được tạo
bằng phương thức tĩnh hiển thị thông tin về tài liệu đang hoạt động
else if (TaskDialogResult.CommandLink2 == tResult)
{
TaskDialog.Show ("Thông tin Tài liệu Hoạt động", "Tài liệu
đang hoạt động:" + activeDoc.Title + "\ n"
"
+ "Tên chế độ xem đang kích hoạt:
+ activeDoc.ActiveView.Name);
}

trả về Autodesk.Revit.UI.Result.Succeeded;
}
}
Machine Translated by Google

Ứng dụng bên ngoài cấp DB


Phần bổ trợ cấp cơ sở dữ liệu là các Ứng dụng Bên ngoài không thêm bất kỳ thứ gì vào Giao diện người dùng Revit. Các Ứng dụng Bên ngoài cấp DB có thể được sử dụng khi mục đích

của ứng dụng là gán các sự kiện và / hoặc các trình cập nhật cho phiên Revit.

Để thêm Ứng dụng bên ngoài cấp DB vào Revit, bạn tạo một đối tượng triển khai giao diện IExternalDBApplication.

Giao diện IExternalDBApplication có hai phương thức trừu tượng, OnStartup () và OnShutdown (), mà bạn ghi đè trong ứng dụng bên ngoài cấp DB của mình. Revit gọi OnStartup () khi

nó khởi động và OnShutdown () khi nó đóng. Điều này rất giống với IExternalApplication, nhưng lưu ý rằng các phương thức này trả về Autodesk.Revit.DB.ExternalDBApplicationResult

thay vì Autodesk.Revit.UI.Result và sử dụng ControlApplication thay vì UIControlledApplication.

Vùng mã: IExternalDBApplication OnShutdown () và OnStartup ()


1. giao diện công cộng IExternalDBApplication 2. { 3.

public Autodesk.Revit.DB.ExternalDBApplicationResult OnStartup (Ứng dụng có kiểm soát); public


Autodesk.Revit.DB.ExternalDBApplicationResult OnShutdown (Ứng dụng có điều khiển);
4. 5. }

Tham số Kiểm soát ứng dụng cung cấp quyền truy cập vào các sự kiện cơ sở dữ liệu Revit . Các sự kiện và bản cập nhật mà ứng dụng cấp cơ sở dữ liệu sẽ phản hồi có thể được đăng

ký trong phương pháp OnStartup.


Machine Translated by Google

Ứng dụng và Tài liệu


Các đối tượng cấp cao nhất trong Revit Platform API là ứng dụng và tài liệu. Chúng được đại diện bởi các lớp Application, UIApplication, Document
và UIDocument.

• Đối tượng ứng dụng đề cập đến một phiên Revit riêng lẻ, cung cấp quyền truy cập vào tài liệu, tùy chọn và dữ liệu toàn ứng dụng khác
và cài đặt.

o Autodesk.Revit.UI.UIApplication - cung cấp quyền truy cập vào các giao diện cấp UI cho ứng dụng, bao gồm khả năng thêm
RibbonPanels cho giao diện người dùng và khả năng lấy tài liệu hoạt động trong giao diện người dùng.

o Autodesk.Revit.ApplicationServices.Application - cung cấp quyền truy cập vào tất cả các thuộc tính cấp ứng dụng khác.

• Đối tượng tài liệu là một tệp dự án Revit duy nhất đại diện cho một mô hình xây dựng. Revit có thể mở nhiều dự án và nhiều
lượt xem cho một dự án.

o Autodesk.Revit.UI.UIDocument - cung cấp quyền truy cập vào các giao diện cấp UI cho tài liệu, chẳng hạn như nội dung của
lựa chọn và khả năng nhắc người dùng thực hiện các lựa chọn và chọn điểm

o Autodesk.Revit.DB.Document - cung cấp quyền truy cập vào tất cả các thuộc tính cấp tài liệu khác

• Nếu nhiều tài liệu đang mở, tài liệu đang hoạt động là tài liệu có chế độ xem đang hoạt động trong phiên Revit.

Chương này xác định tất cả các chức năng của Ứng dụng và Tài liệu, sau đó tập trung vào quản lý tệp, cài đặt và đơn vị. Để biết thêm chi tiết về lớp Element,
hãy tham khảo Elements Essentials và các phần tử chỉnh sửa và tham khảo Chế độ xem để biết thêm chi tiết về các phần tử xem.

Chức năng ứng dụng


Các chức năng ứng dụng cung cấp quyền truy cập vào tài liệu, đối tượng, dữ liệu và cài đặt ứng dụng khác. Tất cả các chức năng Ứng dụng và Ứng dụng UIA
được xác định và định nghĩa trong các phần sau.

Đăng kí

Lớp này đại diện cho Ứng dụng Autodesk Revit, cung cấp quyền truy cập vào tài liệu, tùy chọn và dữ liệu và cài đặt toàn ứng dụng khác.

Thông tin phiên bản ứng dụng

Thuộc tính ứng dụng bao gồm VersionBuild, VersionNumber và VersionName. Chúng có thể được sử dụng để cung cấp hành vi bổ trợ dựa trên việc phát hành và xây
dựng Revit, như được hiển thị trong Cách sử dụng thuộc tính Ứng dụng để thực thi một phiên bản chính xác cho bổ trợ của bạn.

Cài đặt toàn ứng dụng

Thuộc tính SharedParametersFilename và các phương thức GetLibraryPaths () và SetLibraryPaths () cung cấp quyền truy cập vào các cài đặt toàn ứng dụng này.

Quản lý tài liệu

Lớp Ứng dụng cung cấp các phương thức để tạo các loại tài liệu sau:

• Tài liệu gia đình

• Tài liệu dự án

• Mẫu dự án

Phương thức OpenDocumentFile () có thể được sử dụng để mở bất kỳ loại tài liệu nào trong số này.

Tất cả các tài liệu đang mở có thể được truy xuất bằng cách sử dụng thuộc tính Documents.

Để biết thêm chi tiết, hãy xem Tài liệu và Quản lý.

Thông tin phiên

Các thuộc tính như UserName và các phương thức như GetRevitServerNetworkHosts () cung cấp quyền truy cập chỉ đọc vào thông tin cụ thể của phiên này.

Quản lý thông số được chia sẻ

Revit sử dụng một tệp thông số được chia sẻ tại một thời điểm. Phương thức Application.OpenSharedParameterFile () truy cập tệp tham số được chia sẻ có
đường dẫn được đặt trong thuộc tính SharedParametersFilename. Để biết thêm chi tiết, hãy xem Thông số được chia sẻ.
Machine Translated by Google

Sự kiện

Lớp Ứng dụng hiển thị các sự kiện tài liệu và ứng dụng như mở và lưu tài liệu. Đăng ký các sự kiện này sẽ thông báo cho ứng dụng khi các sự kiện được bật
và hoạt động tương ứng. Để biết thêm chi tiết, hãy xem Truy cập vào Sự kiện Revit trong Tích hợp bổ trợ tiết diện.

Tạo ra

Thuộc tính Create trả về Object Factory được sử dụng để tạo các đối tượng hình học và tiện ích cho toàn ứng dụng trong Revit Platform API. Tạo được sử dụng
khi bạn muốn tạo một đối tượng trong bộ nhớ ứng dụng Revit hơn là bộ nhớ ứng dụng của bạn.

Đăng và xử lý lỗi

FailureDefinitionRegistry, chứa tất cả các FailureDefinitions đã đăng ký có sẵn từ phương thức GetFailureDefinitionRegistry () tĩnh. Phương thức tĩnh
RegisterFailuresProcessor () có thể được sử dụng để đăng ký IFailuresProcessor tùy chỉnh. Để biết thêm thông tin về việc đăng và xử lý lỗi, hãy xem Đăng và xử
lý lỗi.

Ứng dụng UIA

Lớp này đại diện cho một phiên hoạt động của giao diện người dùng Autodesk Revit, cung cấp quyền truy cập vào các phương pháp, sự kiện tùy chỉnh giao diện người dùng và
tài liệu đang hoạt động.

Quản lý tài liệu

Ứng dụng UIA cung cấp quyền truy cập vào tài liệu đang hoạt động bằng thuộc tính UIActiveDocument. Ngoài ra, tài liệu Revit có thể được mở bằng phương
thức OpenAndActivateDocument () đã quá tải. Tài liệu sẽ được mở với chế độ xem mặc định đang hoạt động. Phương thức này có thể không được gọi bên trong một
giao dịch và chỉ có thể được gọi trong một sự kiện khi không có tài liệu đang hoạt động nào được mở trong Revit và sự kiện này không được lồng trong một sự
kiện khác.

Quản lý bổ trợ

Thuộc tính ActiveAddInId nhận ứng dụng bên ngoài đang hoạt động hiện tại hoặc id lệnh bên ngoài, trong khi thuộc tính LoadedApplication trả về một mảng
các ứng dụng bên ngoài được tải thành công.

Tiện ích bảng điều khiển ruy-băng

Sử dụng đối tượng UIApplication để thêm các bảng điều khiển và bảng ribbon mới vào Revit.

Để biết thêm chi tiết, hãy xem Bảng điều khiển và Bảng điều khiển Ruy-băng trong Tích hợp bổ trợ tiết diện.

Phạm vi

Thuộc tính DrawingAreaExtents trả về một hình chữ nhật đại diện cho tọa độ pixel trên màn hình của khu vực vẽ, trong khi
Thuộc tính MainWindowExtents trả về hình chữ nhật đại diện cho tọa độ pixel màn hình của cửa sổ chính Revit

Sự kiện

Lớp UIApplication hiển thị các sự kiện liên quan đến giao diện người dùng, chẳng hạn như khi hộp thoại được hiển thị. Đăng ký các sự kiện này sẽ thông báo cho
ứng dụng khi các sự kiện được bật và hoạt động tương ứng. Để biết thêm chi tiết, hãy xem Truy cập vào Sự kiện Revit trong Tích hợp bổ trợ tiết diện.
Machine Translated by Google

Kiểm soát kỷ luật

Các thuộc tính:

• Application.IsArchitectureEnabled
• Application.IsStructureEnabled
• Application.IsStructuralAnalysisEnabled
• Application.IsMassingEnabled
• Application.IsEnergyAnalysisEnabled
• Application.IsSystemsEnabled
• Application.IsMechanicalEnabled
• Application.IsMechanicalAnalysisEnabled
• Application.IsElectricalEnabled
• Application.IsElectricalAnalysisEnabled
• Application.IsPipingEnabled
• Application.IsPipingAnalysisEnabled

cung cấp quyền truy cập đọc và sửa đổi đối với các lĩnh vực có sẵn. Một ứng dụng có thể đọc các thuộc tính để xác định thời điểm bật hoặc tắt các khía cạnh của giao diện người dùng của nó.

Khi trạng thái của kỷ luật được bật, giao diện người dùng của Revit sẽ được điều chỉnh và một số hoạt động và tính năng nhất định sẽ được bật hoặc tắt khi thích

hợp. Việc bật chế độ phân tích sẽ chỉ có hiệu lực nếu chế độ tương ứng được bật. Ví dụ: việc bật phân tích cơ học sẽ không có hiệu lực trừ khi tính năng cơ học

cũng được bật.

Cách sử dụng thuộc tính Ứng dụng để thực thi một phiên bản chính xác cho bổ trợ
của bạn

Đôi khi bạn cần bổ trợ của mình chỉ hoạt động khi có Bản phát hành cập nhật Revit cụ thể do sự hiện diện của các bản sửa lỗi cụ thể hoặc các API tương thích. Mã

mẫu sau đây trình bày một kỹ thuật để xác định xem phiên bản Revit có phải là bất kỳ Bản phát hành Cập nhật nào sau bản phát hành Revit đã biết ban đầu hay không.

Vùng mã: Sử dụng VersionBuild để xác định xem bổ trợ của bạn có tương thích không

1. public void GetVersionInfo (ứng dụng Autodesk.Revit.ApplicationServices.Application) 2. { 3.

// 20110309_2315 là mã dữ liệu của bản phát hành đầu tiên của Revit 2012 if (app.VersionNumber
4. == "2012" && String.Compare (app.VersionBuild, "20110309_2315") > 0)
5.
6. {
7. TaskDialog.Show (" Phiên bản được hỗ trợ", "Ứng
số 8.
dụng này được hỗ trợ trong phiên bản này.");

9. 10. }
11. khác {
12. Hộp thoại TaskDialog = new TaskDialog ("Phiên bản không được hỗ trợ."); hộp
13. thoại.MainIcon = TaskDialogIcon.TaskDialogIconWarning; Hộp thoại.MainInstruction
14. = "Ứng dụng này chỉ được hỗ trợ trong Revit 2012 UR1 trở lên."; hộp thoại.Show ();
15.
16. }
Machine Translated by Google

Chức năng tài liệu

Tài liệu lưu trữ Phần tử Revit, quản lý dữ liệu và cập nhật nhiều chế độ xem dữ liệu. Lớp Document chủ yếu cung cấp các chức năng sau.

Tài liệu

Lớp Tài liệu đại diện cho một dự án Autodesk Revit đang mở.

Thuộc tính cài đặt

Thuộc tính Cài đặt trả về một đối tượng cung cấp quyền truy cập vào các thành phần chung trong các dự án Revit. Để biết thêm chi tiết, hãy xem Cài đặt.

Địa điểm và Vị trí

Mỗi dự án chỉ có một vị trí địa điểm xác định vị trí thực tế của dự án trên Trái đất. Có thể có một số vị trí dự án cho một dự án. Mỗi vị trí là một phần bù
hoặc vòng quay của vị trí trang web. Để biết thêm chi tiết, hãy xem Địa điểm và Vị trí.

Nhập Bộ sưu tập

Document cung cấp các thuộc tính như FloorTypes, WallTypes, v.v. Tất cả các thuộc tính trả về một đối tượng tập hợp chứa các kiểu tương ứng
được tải vào dự án.

Xem quản lý

Một tài liệu dự án có thể có nhiều dạng xem. Thuộc tính ActiveView trả về một đối tượng View đại diện cho chế độ xem hiện hoạt. Bạn có thể lọc các phần tử
trong dự án để lấy các khung nhìn khác. Để biết thêm chi tiết, hãy xem Chế độ xem.

Truy xuất phần tử

Đối tượng Document lưu trữ các phần tử trong dự án. Truy xuất các phần tử cụ thể theo ElementId hoặc UniqueId bằng cách sử dụng thuộc tính Element.

Để biết thêm chi tiết, hãy xem Elements Essential.

Quản lý tệp

Mỗi đối tượng Document đại diện cho một tệp dự án Revit. Tài liệu cung cấp các chức năng sau:

• Truy xuất thông tin tệp như tên đường dẫn tệp và tiêu đề dự án.

• Cung cấp các phương thức Close () và Save () để đóng và lưu tài liệu.

Để biết thêm chi tiết, hãy xem Quản lý tài liệu và tệp.

Quản lý yếu tố

Revit duy trì tất cả các đối tượng Element trong một dự án. Để tạo các phần tử mới, hãy sử dụng thuộc tính Create trả về một Object Factory được sử dụng
để tạo các phiên bản phần tử dự án mới trong Revit Platform API, chẳng hạn như FamilyInstance hoặc Group.

Lớp Document cũng có thể được sử dụng để xóa các phần tử. Sử dụng phương thức Delete () để xóa một phần tử trong dự án. Các phần tử đã xóa và bất kỳ phần tử phụ
thuộc nào không được hiển thị và bị xóa khỏi Tài liệu. Các tham chiếu đến các phần tử đã xóa không hợp lệ và gây ra một ngoại lệ. Để biết thêm chi tiết, hãy xem
phần Chỉnh sửa.

Sự kiện

Sự kiện được đưa ra trên một số hành động nhất định, chẳng hạn như khi bạn lưu dự án bằng Lưu hoặc Lưu dưới dạng. Để nắm bắt các sự kiện và phản hồi
trong ứng dụng, bạn phải đăng ký trình xử lý sự kiện. Để biết thêm chi tiết, hãy xem Sự kiện.
Machine Translated by Google

Tình trạng tài liệu

Một số thuộc tính cung cấp thông tin về trạng thái của tài liệu:

• IsModifiable - liệu tài liệu có thể được sửa đổi hay không

• IsModified - liệu tài liệu đã được thay đổi kể từ khi nó được mở hay được lưu hay chưa

• IsReadOnly - cho dù tài liệu hiện chỉ được đọc hay có thể được sửa đổi

• IsReadOnlyFile - tài liệu có được mở ở chế độ chỉ đọc hay không

• IsFamilyDocument - liệu tài liệu có phải là tài liệu gia đình hay không

• IsWorkshared - các trang tính đã được bật trong tài liệu chưa

Khác

Document cũng cung cấp các chức năng khác:

• Thuộc tính ParameterBindings - Ánh xạ giữa các định nghĩa tham số và danh mục. Để biết thêm chi tiết, hãy xem Thông số được chia sẻ.

• Thuộc tính ReactionsAreUpToDate - Báo cáo xem tải phản động có thay đổi hay không. Để biết thêm chi tiết, hãy xem Tải trong Cấu trúc Revit
tiết diện.

UIDocument

Lớp UIDocument đại diện cho một dự án Autodesk Revit được mở trong giao diện người dùng Revit.

Truy xuất phần tử

Truy xuất các phần tử đã chọn bằng cách sử dụng thuộc tính Lựa chọn trong UIDocument. Thuộc tính này trả về một đối tượng đại diện cho lựa chọn đang hoạt
động có chứa các phần tử dự án đã chọn. Nó cũng cung cấp các phương pháp tương tác UI để chọn các đối tượng trong mô hình Revit.

Để biết thêm chi tiết, hãy xem Elements Essential.

Hiển thị phần tử

Phương thức ShowElements () sử dụng thu phóng để vừa với tập trung vào một phần tử nữa.

Xem quản lý

Lớp UIDocument có thể được sử dụng để làm mới dạng xem hiện hoạt trong tài liệu hiện hoạt bằng cách gọi phương thức RefreshActiveView (). Thuộc tính
ActiveView có thể được sử dụng để truy xuất hoặc đặt chế độ xem hiện hoạt cho tài liệu. Thay đổi chế độ xem hiện hoạt có một số hạn chế. Nó chỉ có thể được
sử dụng trong một tài liệu đang hoạt động, tài liệu này không được ở trạng thái chỉ đọc và không được ở bên trong một giao dịch. Ngoài ra, chế độ xem hiện
hoạt không được thay đổi trong sự kiện Kích hoạt hoặc Chế độ xem đã kích hoạt hoặc trong bất kỳ sự kiện trước hành động nào, chẳng hạn như Lưu tài liệu, Khoá
tài liệu hoặc các sự kiện tương tự khác.

UIDocument cũng có thể được sử dụng để lấy danh sách tất cả các cửa sổ dạng xem đang mở trong giao diện người dùng Revit. Phương thức GetOpenUIViews trả về
danh sách các UIView chứa dữ liệu về các cửa sổ xem trong giao diện người dùng Revit.
Machine Translated by Google

Quản lý tài liệu và tệp

Quản lý tài liệu và tệp giúp bạn dễ dàng tạo và tìm tài liệu của mình.

Truy xuất tài liệu

Lớp Ứng dụng duy trì tất cả các tài liệu. Như đã đề cập trước đây, bạn có thể mở nhiều tài liệu trong một phiên. Tài liệu hoạt động được truy xuất bằng thuộc tính lớp UIApplication,
ActiveUIDocument.

Tất cả các tài liệu đang mở, bao gồm cả tài liệu đang hoạt động, được truy xuất bằng thuộc tính Tài liệu lớp Ứng dụng. Thuộc tính trả về một tập hợp chứa tất cả các tài liệu đang mở trong
phiên Revit.

Thông tin tệp tài liệu

Lớp Document cung cấp hai thuộc tính cho mỗi tệp tương ứng, PathName và Title.

• PathName trả về đường dẫn tệp đủ điều kiện của tài liệu. PathName trả về một chuỗi trống nếu dự án chưa được lưu
kể từ khi nó được tạo ra.

• Title là tiêu đề dự án, thường bắt nguồn từ tên tệp dự án. Giá trị trả về thay đổi tùy theo cài đặt hệ thống của bạn.
Mở tài liệu

Lớp Ứng dụng cung cấp một phương thức được nạp chồng để mở tệp dự án hiện có:

Bảng 3: Mở tài liệu trong API

Phương pháp Biến cố

Tài liệu OpenDocumentFile (tên tệp chuỗi) DocumentOpened

Tài liệu OpenDocumentFile (ModelPath modelPath, OpenOptions openOptions)

Khi bạn chỉ định một chuỗi có đường dẫn tệp đủ điều kiện, Revit sẽ mở tệp và tạo một cá thể Tài liệu. Sử dụng phương pháp này để mở tệp trên máy tính khác bằng cách gán tên Chuyển đổi đặt
tên chung (UNC) tệp cho phương pháp này.

Tệp có thể là tệp dự án có phần mở rộng .rvt, tệp gia đình có phần mở rộng .rfa hoặc tệp mẫu có phần mở rộng .rte.

Quá tải thứ hai đưa một đường dẫn đến mô hình dưới dạng ModelPath chứ không phải là một chuỗi và tham số OpenOptions cung cấp các tùy chọn để mở tệp,
chẳng hạn như khả năng tách tài liệu đã mở khỏi trung tâm nếu có, cũng như các tùy chọn liên quan đến chia sẻ công việc. Để biết thêm thông tin về cách mở
tài liệu chia sẻ công việc, hãy xem Mở tài liệu chia sẻ công việc.

Các phương pháp này đưa ra các trường hợp ngoại lệ được ghi lại bằng văn bản cụ thể trong trường hợp không thành công. Các trường hợp ngoại lệ được chia thành 4 loại chính.

Bảng 4: Các loại ngoại lệ được ném ra

Loại hình Thí dụ

Lỗi đĩa Tệp không tồn tại hoặc là phiên bản sai

Lỗi tài nguyên Không đủ bộ nhớ hoặc dung lượng đĩa để mở tệp

Lỗi tệp mô hình trung tâm Tệp bị khóa hoặc bị hỏng

Mô hình trung tâm / lỗi máy chủ Lỗi giao tiếp mạng với máy chủ

Nếu tài liệu được mở thành công, sự kiện DocumentOpened sẽ xuất hiện.

Tạo tài liệu

Tạo tài liệu mới bằng cách sử dụng các phương pháp Ứng dụng trong bảng sau.

Bảng 5: Tạo tài liệu trong API

Phương pháp Biến cố

Tài liệu được tạo


Tài liệu NewProjectDocument (string templateFileName);

Tài liệu được tạo


Tài liệu NewFamilyDocument (string templateFileName);

Tài liệu NewProjectTemplateDocument (string templateFilename); Tài liệu được tạo


Machine Translated by Google

Mỗi phương thức yêu cầu một tên tệp mẫu làm tham số. Tài liệu đã tạo được trả về dựa trên tệp mẫu.

Lưu và đóng tài liệu

Lớp Tài liệu cung cấp các phương thức để lưu hoặc đóng các thể hiện.

Bảng 6: Lưu và đóng tài liệu trong API

Phương pháp Biến cố

Tiết kiệm() Tài liệu Đã lưu

SaveAs () DocumentSavedAs

Đóng() Tài liệu được đóng lại

Save () có 2 quá tải, một không có đối số và một có đối số SaveOptions có thể chỉ định xem có buộc HĐH xóa tất cả dữ liệu đã chết khỏi tệp trên đĩa hay không. Nếu tệp chưa được
lưu trước đó, thay vào đó, SaveAs () phải được gọi.

SaveAs () có 3 lần quá tải. Một quá tải chỉ lấy tên tệp làm đối số và một ngoại lệ sẽ được ném ra nếu một tệp khác tồn tại với tên tệp đã cho. 2 quá tải khác lấy tên tệp làm
đối số (ở dạng ModelPath trong một trường hợp) cũng như đối số SaveAsOptions thứ hai chỉ định xem có đổi tên tệp hay không và / hoặc có ghi đè và tệp hiện có hay không, nếu nó
tồn tại. SaveAsOptions cũng có thể được sử dụng để chỉ định các tùy chọn liên quan khác, chẳng hạn như có xóa dữ liệu đã chết trên đĩa liên quan đến tệp hay không và các tùy
chọn chia sẻ công việc.

Save () và SaveAs () ném các ngoại lệ cụ thể đã được lập thành tài liệu vào 4 danh mục giống như khi mở một tài liệu và được liệt kê trong Bảng 4 ở trên.

Close () có hai quá tải. Một lấy đối số Boolean cho biết có nên lưu tệp trước khi đóng nó hay không. Quá tải thứ hai không có đối số và nếu tài liệu đã được sửa đổi, người dùng
sẽ được hỏi xem họ có muốn lưu tệp trước khi đóng hay không. Phương thức này sẽ đưa ra một ngoại lệ nếu tên đường dẫn của tài liệu chưa được đặt hoặc nếu tệp đích đang lưu ở
chế độ chỉ đọc.

Ghi chú

Phương thức Close () không ảnh hưởng đến tài liệu đang hoạt động hoặc làm tăng sự kiện DocumentClosed, vì tài liệu được sử dụng bởi một ứng dụng bên ngoài. Bạn chỉ có thể gọi
phương thức này trên các tài liệu không hoạt động.

Lớp UIDocument cũng cung cấp các phương thức để lưu và đóng các thể hiện.

Bảng 7: Lưu và đóng UIDocument trong API

Phương pháp Biến cố

SaveAndClose () DocumentSaved, DocumentClosed

Lưu thành() DocumentSavedAs

SaveAndClose () đóng tài liệu sau khi lưu nó. Nếu tên đường dẫn của tài liệu chưa được đặt, hộp thoại "Lưu dưới dạng" sẽ được hiển thị cho người dùng Revit để đặt tên và vị
trí của nó.

Phương thức SaveAs () lưu tài liệu vào tên tệp và đường dẫn thu được từ người dùng Revit thông qua hộp thoại "Lưu dưới dạng".

Xem trước tài liệu

Lớp DocumentPreviewSettings có thể được lấy từ Tài liệu và chứa các cài đặt liên quan đến việc lưu hình ảnh xem trước cho một tài liệu nhất định.
Machine Translated by Google

Vùng mã: Xem trước tài liệu

1. public void SaveActiveViewWithPreview (ứng dụng UIApplication) 2. { 3.

// Nhận xử lý của tài liệu hiện tại.


4. Autodesk.Revit.DB.Document document = application.ActiveUIDocument.Document;
5.
6. // Lấy cài đặt xem trước của tài liệu Cài đặt
7. DocumentPreviewSettings = document.GetDocumentPreviewSettings ();
số 8.

9. // Tìm chế độ xem 3D ứng viên


10. FilteredElementCollector collector = new FilteredElementCollector (document); collector.OfClass
11. (typeof (View3D));
12.
13. Func <View3D, bool> isValidForPreview = v => settings.IsViewIdValidForPreview (v.Id);
14.
15. View3D viewForPreview = collector.OfType <View3D> () .First <View3D> (isValidForPreview);
16.
17. // Đặt cài đặt xem trước Giao dịch
18. setTransaction = new Giao dịch (tài liệu, "Đặt id chế độ xem trước"); setTransaction.Start ();
19. settings.PreviewViewId = viewForPreview.Id; setTransaction.Commit ();
20.
21.
22.
23. // Lưu tài liệu
24. document.Save ();
25. }

Tải gia đình

Lớp Tài liệu cung cấp cho bạn khả năng tải toàn bộ họ và tất cả các ký hiệu của nó vào dự án. Bởi vì việc tải toàn bộ họ có thể mất nhiều thời gian và nhiều
bộ nhớ, lớp Tài liệu cung cấp một phương thức tương tự, LoadFamilySymbol () để chỉ tải các ký hiệu được chỉ định.

Để biết thêm chi tiết, hãy xem Tải gia đình.


Machine Translated by Google

Cài đặt

Bảng sau xác định các lệnh trong tab Quản lý giao diện người dùng Revit Platform và các API tương ứng.

Bảng 7: Cài đặt trong API và giao diện người dùng

Lệnh giao diện người dùng API được liên kết Tài liệu tham khảo

Cài đặt thông tin dự án Document.ProjectInformation Xem ghi chú sau

Cài đặt Tham số dự án Document.ParameterBindings (Chỉ dành cho tham số được chia sẻ) Xem thông số được chia sẻ

Bảng vị trí dự án Document.ProjectLocations Xem Địa điểm và Vị trí

Document.ActiveProjectLocation

Cài đặt Cài đặt bổ sung Mẫu điền Lọc FilteredElementCollector trên lớp FillPatternElement Xem ghi chú sau

Vật liệu cài đặt Document.Settings.Materials Xem Quản lý Vật liệu

Cài đặt Kiểu đối tượng Document.Settings.Categories Xem ghi chú sau

Phasing Phases Document.Phases Xem ghi chú sau

Cài đặt Cài đặt cấu trúc Tải các cài đặt kết cấu liên quan có sẵn trong API Xem Cấu trúc Revit

Cài đặt Đơn vị Dự án Document.GetUnits () Xem các đơn vị

Tính toán Diện tích và Thể tích (trên bảng Room & Area) Xem ghi chú sau

Ghi chú

• Thông tin dự án - API cung cấp lớp ProjectInfo được truy xuất bằng cách sử dụng Document.ProjectInformation để đại diện

thông tin dự án trong dự án Revit. Bảng sau xác định các API tương ứng cho các tham số Thông tin dự án.

Bảng 8: Thông tin dự án

Thông số API tương ứng Các thông số tích hợp

Ngày phát hành dự án ProjectInfo.IssueDate PROJECT_ISSUE_DATE

Tình trạng của dự án ProjectInfo.Status TÌNH TRẠNG CỦA DỰ ÁN

Tên khách hàng ProjectInfo.ClientName TÊN KHÁCH HÀNG

Địa chỉ dự án ProjectInfo.Address PROJECT_ADDRESS

Tên dự án ProjectInfo.Name TÊN DỰ ÁN

Số dự án ProjectInfo.Number PROJECT_NUMBER

Sử dụng các thuộc tính được ProjectInfo hiển thị để truy xuất và đặt tất cả các chuỗi. Các thuộc tính này được thực hiện bởi các tham số tích hợp sẵn tương ứng. Bạn có thể lấy

hoặc đặt trực tiếp các giá trị thông qua các tham số tích hợp sẵn. Để biết thêm thông tin về cách có quyền truy cập vào các tham số này thông qua các tham số tích hợp, hãy xem

Tham số trong Elements Essential tiết diện. Cách được khuyến nghị để lấy thông tin dự án là sử dụng các thuộc tính ProjectInfo.

• Fill Patterns - Lấy tất cả các mẫu Fill trong tài liệu hiện tại bằng cách sử dụng bộ lọc FilteredElementCollector trên lớp FillPatternElement.

FillPatterns cụ thể có thể được truy xuất bằng các phương thức tĩnh FillPatternElement.GetFillPattern (Document, ElementId) hoặc FillPatternElement.GetFillPatternByName

(Document, string).

• Kiểu đối tượng - Sử dụng Settings.Categories để truy xuất tất cả thông tin trong các đối tượng Category ngoại trừ Kiểu dòng. Để biết thêm chi tiết, hãy xem Danh mục trong Elements

Essentialand Vật chất các phần.

• Các giai đoạn - Revit duy trì thời gian tồn tại của phần tử theo các giai đoạn, đó là các khoảng thời gian riêng biệt trong vòng đời của dự án. Tất cả các giai đoạn trong một

tài liệu được truy xuất bằng cách sử dụng thuộc tính Document.Phases. Thuộc tính trả về một mảng chứa các cá thể của lớp Pha.

Tuy nhiên, API Revit không hiển thị các chức năng từ lớp Giai đoạn.

• Tùy chọn - Lệnh Tùy chọn cấu hình cài đặt chung của dự án. Bạn có thể truy xuất một cá thể Options.Application bằng cách sử dụng

Thuộc tính Application.Options. Hiện tại, lớp Options.Application chỉ hỗ trợ quyền truy cập vào đường dẫn thư viện và tệp tham số được chia sẻ.

• Tính toán diện tích và thể tích - Document.Settings.VolumeCalculationSetting cho phép bạn bật hoặc tắt tính toán thể tích,

và để thay đổi vị trí ranh giới phòng.


Machine Translated by Google

Các đơn vị

Hai lớp chính trong Revit API để làm việc với các đơn vị là Units và FormatOptions. Lớp Units đại diện cho cài đặt mặc định của tài liệu để định dạng số với đơn vị
là chuỗi. Nó chứa một đối tượng FormatOptions cho từng loại đơn vị cũng như các cài đặt liên quan đến ký hiệu thập phân và nhóm chữ số.

Lớp Units lưu trữ một đối tượng FormatOptions cho mọi loại đơn vị hợp lệ, nhưng không phải tất cả chúng đều có thể được sửa đổi trực tiếp. Một số, như UT_Number
và UT_SiteAngle, có các định nghĩa cố định. Những người khác có các định nghĩa được tự động bắt nguồn từ các loại đơn vị khác. Ví dụ: UT_SheetLength có nguồn gốc
từ UT_Length và UT_ForceScale có nguồn gốc từ UT_Force.

Lớp FormatOptions chứa các cài đặt kiểm soát cách định dạng số với đơn vị là chuỗi. Nó chứa những cài đặt thường được chọn bởi người dùng cuối trong hộp
thoại Định dạng và được lưu trữ trong tài liệu, chẳng hạn như làm tròn, độ chính xác, đơn vị hiển thị và xem có loại bỏ dấu cách hoặc số không ở đầu hoặc ở cuối
hay không.

Lớp FormatOptions được sử dụng theo hai cách khác nhau. Một đối tượng FormatOptions trong lớp Units đại diện cho cài đặt mặc định cho tài liệu. Một đối tượng
FormatOptions được sử dụng ở nơi khác đại diện cho các cài đặt có thể tùy chọn ghi đè cài đặt mặc định.

Thuộc tính UseDefault kiểm soát xem một đối tượng FormatOptions đại diện cho định dạng mặc định hay tùy chỉnh. Nếu UseDefault là true, định dạng sẽ theo cài đặt mặc
định trong lớp Đơn vị và không có cài đặt nào khác trong đối tượng là có ý nghĩa. Nếu UseDefault là false, đối tượng chứa cài đặt tùy chỉnh ghi đè cài đặt mặc định
trong lớp Đơn vị. UseDefault luôn sai đối với các đối tượng FormatOptions trong lớp Units.

Các bảng liệt kê quan trọng liên quan đến đơn vị trong API Revit bao gồm:

• UnitType - loại đại lượng vật lý cần đo, ví dụ như chiều dài hoặc lực (UT_Length hoặc UT_Force)

• DisplayUnitType - đơn vị và định dạng hiển thị được sử dụng để định dạng số dưới dạng chuỗi hoặc chuyển đổi đơn vị (tức là DUT_METERS)

• UnitSymbolType - biểu tượng đơn vị được hiển thị trong biểu diễn chuỗi được định dạng của một số để biểu thị các đơn vị của giá trị (tức là
UST_M)

Chuyển đổi đơn vị

API Revit cung cấp các lớp tiện ích để tạo điều kiện làm việc với số lượng trong Revit. Lớp UnitUtils giúp dễ dàng chuyển đổi dữ liệu đơn vị đến và từ các đơn vị
nội bộ của Revit.

Revit có bảy đại lượng cơ bản, mỗi đại lượng có đơn vị bên trong riêng. Các đơn vị nội bộ này được xác định trong bảng sau.

Bảng 9: 7 Đơn vị cơ bản trong Hệ thống Đơn vị Revit

Đơn vị cơ sở Đơn vị trong Revit Hệ thống đơn vị

Chiều dài Bàn chân (ft) thành nội

Góc Radian Hệ mét

Khối lượng
Kg (kg) Hệ mét

Thời gian Giây Hệ mét

Dòng điện Ampe (A) Hệ mét

Nhiệt độ Kelvin (K) Hệ mét

Mức độ phát sáng Candela (cd) Hệ mét

Lưu ý: Vì Revit lưu trữ độ dài bằng feet và các đại lượng cơ bản khác theo đơn vị hệ mét, nên một đơn vị dẫn xuất liên quan đến độ dài sẽ là một đơn vị không chuẩn
dựa trên cả hệ thống Hệ đo lường Anh và Hệ mét. Ví dụ: vì một lực được đo bằng "độ dài khối lượng trên bình phương thời gian", nó được lưu trữ bằng kg-ft / s2 .

Ví dụ sau sử dụng phương thức UnitUtils.ConvertFromInternalUnits () để nhận ứng suất chảy tối thiểu cho vật liệu tính bằng kips trên inch vuông.
Machine Translated by Google

Vùng mã: Chuyển đổi từ các đơn vị nội bộ của Revit

1. nhân đôi GetYieldSosystemInKsi (Nguyên liệu vật liệu) 2. { 3.


4.
double dMinYieldSosystem = 0; // Lấy
tài sản cấu trúc cho vật liệu ElementId strucAssetId =
material.StructuralAssetId; if (strucAssetId! =
5. 6. ElementId.InvalidElementId) {

7. 8. PropertySetElement pse = material.Document.GetElement (strucAssetId) as PropertySetElement; if (pse! = null) {

9. 10.
11. Tài sản StructuralAsset = pse.GetStructuralAsset ();
12.
13. // Lấy ứng suất năng suất tối thiểu và chuyển đổi thành ksi
14. dMinYieldSosystem = asset.MinimumYieldSosystem;
15. dMinYieldSosystem = UnitUtils.ConvertFromInternalUnits (dMinYieldSosystem,
16. DisplayUnitType.DUT_KIPS_PER_SQUARE_INCH);
17. }
18. }
19.
20. trả lại dMinYieldS Stress;
21. }

UnitUtils cũng có thể được sử dụng để chuyển đổi giá trị từ loại đơn vị này sang loại đơn vị khác, chẳng hạn như bộ vuông sang mét vuông. Trong ví dụ sau, giá trị offset trên cùng của bức

tường được nhập bằng inch được chuyển đổi thành feet, đơn vị dự kiến để đặt giá trị đó.

Vùng mã: Chuyển đổi giữa các đơn vị

1. void SetTopOffset (Wall wall, double dOffsetIffs) 2. {

3. // chuyển đổi giá trị offset do người dùng xác định thành feet từ inch trước khi đặt double
4. dOffsetFeet = UnitUtils.Convert (dOffsetIffs, DisplayUnitType.DUT_DECIMAL_INCHES,
5. DisplayUnitType.DUT_DECIMAL_FEET);
6.

7. 8. Tham số paramTopOffset = wall.get_Parameter (BuiltInParameter.WALL_TOP_OFFSET); paramTopOffset.Set


(dOffsetFeet);
9. 10. }

Định dạng đơn vị và phân tích cú pháp

Một lớp tiện ích khác, UnitFormatUtils, có thể định dạng dữ liệu hoặc phân tích cú pháp dữ liệu đơn vị được định dạng.

Phương thức nạp chồng FormatValueToString () có thể được sử dụng để định dạng một giá trị thành một chuỗi dựa trên các tùy chọn định dạng như ví dụ sau minh họa. Mật độ vật liệu được truy

xuất và sau đó giá trị được chuyển đổi thành giá trị thân thiện với người dùng với đơn vị bằng phương thức FormatValueToString ().

Vùng mã: Định dạng giá trị thành chuỗi

1. void DisplayDensityOfMaterial (Nguyên liệu vật liệu) 2. { 3. 4.

gấp đôi dDensity = 0; //


lấy tài sản cấu trúc của material để lấy mật độ ElementId strucAssetId =
material.StructuralAssetId; if (strucAssetId! = ElementId.InvalidElementId) {
5. 6.

7. 8. PropertySetElement pse = material.Document.GetElement (strucAssetId) as PropertySetElement; if (pse! = null) {

9. 10.
11. Tài sản StructuralAsset = pse.GetStructuralAsset ();
12.
13. dDensity = tài sản. // chuyển đổi
14. giá trị mật độ thành một chuỗi người dùng có thể đọc được bao gồm các đơn vị Units units =
15. material.Document.GetUnits (); string strDensity = UnitFormatUtils.FormatValueToString (unit,
16. UnitType.UT_UnitWeight, dDensity, false, false); string msg = string.Format (" Giá trị thô: {0} \ r \ n Giá trị định dạng: {1}", dDensity, strDensity);
17. TaskDialog.Show (" Mật độ vật liệu", msg);
18.
19. }
20. }
21. }

Phương thức UnitFormatUtils.TryParse () được nạp chồng sẽ phân tích cú pháp một chuỗi được định dạng, bao gồm các đơn vị, thành một giá trị nếu có thể, bằng cách sử dụng các đơn vị nội bộ Revit của

loại đơn vị được chỉ định. Ví dụ sau đây nhận một giá trị độ dài do người dùng nhập, giả sử là một số và đơn vị độ dài, và cố gắng phân tích cú pháp nó thành một giá trị độ dài. Kết quả được so

sánh với chuỗi đầu vào trong TaskDialog cho mục đích trình diễn.
Machine Translated by Google

Vùng mã: Phân tích cú pháp chuỗi

1. nhân đôi GetLengthInput (Tài liệu tài liệu, Chuỗi userInputLength) 2. { 3. 4.

double dParsedLength = 0; Đơn


vị đơn vị = document.GetUnits (); // cố
gắng phân tích cú pháp người dùng đã nhập chuỗi (tức là 100 mm, 1'6 ")
5. 6. bool parsed = UnitFormatUtils.TryParse (đơn vị, UnitType.UT_Length, userInputLength, out dParsedLength); if (parsed == true) {

7. 8.
9. string msg = string.Format ("User Input: {0} \ r \ nParsed value: {1}" , userInputLength, dParsedLength); TaskDialog.Show ("
10. Dữ liệu được phân tích cú pháp", msg);
11. }
12.
13. trả về dParsedLength;
Machine Translated by Google

Yếu tố cơ bản

Phần tử tương ứng với một tòa nhà hoặc thành phần bản vẽ, chẳng hạn như cửa, tường hoặc một kích thước. Ngoài ra, Phần tử có thể là kiểu cửa, khung nhìn hoặc định nghĩa vật liệu.

Phân loại nguyên tố

Phần tử Revit được chia thành sáu nhóm: Mô hình, Phác thảo, Chế độ xem, Nhóm, Chú thích và Thông tin. Mỗi nhóm chứa các Phần tử liên quan và các ký hiệu tương ứng của chúng.

Phần tử mô hình

Phần tử Mô hình đại diện cho các hạng mục vật lý tồn tại trong một dự án xây dựng. Các phần tử trong nhóm Phần tử Mô hình có thể được chia nhỏ thành các phần sau:

• Phiên bản gia đình - Phiên bản gia đình chứa các đối tượng cá thể gia đình. Bạn có thể tải các đối tượng gia đình vào dự án của mình hoặc tạo chúng từ
các mẫu gia đình. Để biết thêm thông tin, hãy xem Phiên bản gia đình.

• Phần tử Máy chủ - Phần tử Máy chủ chứa các đối tượng họ hệ thống có thể chứa các phần tử mô hình khác, chẳng hạn như tường, mái nhà, trần nhà và
sàn nhà. Để biết thêm thông tin về Phần tử Chủ, hãy xem Tường, Sàn, Mái và Khoảng hở.

• Yếu tố cấu trúc. - Phần tử Structure chứa các phần tử chỉ được sử dụng trong Revit Structure. Để biết thêm thông tin về
Phần tử Cấu trúc, xem Cấu trúc Revit.
Xem các phần tử

View Elements đại diện cho cách bạn xem và tương tác với các đối tượng khác trong Revit. Để biết thêm thông tin, hãy xem Chế độ xem.

Các thành phần nhóm

Các phần tử nhóm đại diện cho các phần tử trợ lý như các đối tượng Mảng và Nhóm trong Revit. Để biết thêm thông tin, hãy xem Phần tử chỉnh sửa.

Phần tử chú thích và dữ liệu

Chú thích và Phần tử dữ liệu chứa các mục phi vật lý có thể nhìn thấy được.

• Phần tử chú thích đại diện cho các thành phần 2D duy trì tỷ lệ trên giấy và chỉ hiển thị trong một chế độ xem. Để biết thêm thông tin
về Phần tử chú thích, hãy xem Phần tử chú thích.

Lưu ý Phần tử chú thích đại diện cho các thành phần 2D không chỉ tồn tại trong dạng xem 2D. Ví dụ: kích thước có thể được vẽ trong chế độ xem 3D

trong khi hình dạng mà chúng đề cập đến chỉ tồn tại trong một mặt phẳng 2D.

• Phần tử Datum đại diện cho các hạng mục phi vật lý được sử dụng để thiết lập bối cảnh dự án. Các yếu tố này có thể tồn tại trong các khung nhìn. Datum
Các phần tử được chia thành những phần sau:

• Phần tử dữ liệu chung - Phần tử dữ liệu chung đại diện cho các mục có thể nhìn thấy phi vật lý được sử dụng để lưu trữ dữ liệu để mô hình hóa.

• Datum FamilyInstance - Datum FamilyInstance đại diện cho các mục hiển thị phi vật lý được tải vào dự án của bạn hoặc được tạo từ gia đình
các mẫu.

Lưu ý Để biết thêm thông tin về Phần tử Datum Chung và Datum FamilyInstance, hãy xem Datum và Phần tử Thông tin; để biết các nội dung liên quan đến ModelCurve, hãy xem Phác

thảo.

• Phần tử dữ liệu cấu trúc - Phần tử dữ liệu cấu trúc đại diện cho các mục hiển thị phi vật lý được sử dụng để lưu trữ dữ liệu cho cấu trúc
làm mẫu. Để biết thêm thông tin về các phần tử dữ liệu cấu trúc, hãy xem Revit Structure.
Yếu tố phác thảo

Sketch Elements đại diện cho các mục tạm thời được sử dụng để phác thảo dạng 2D / 3D. Nhóm này chứa các đối tượng sau được sử dụng trong mô hình hóa gia đình và khối lượng:

• SketchPlane

• Phác thảo

• Path3D

• GenericForm.

Để biết chi tiết về Sketch, hãy xem Sketching.


Machine Translated by Google

Các yếu tố thông tin

Phần tử thông tin chứa các mục vô hình phi vật lý được sử dụng để lưu trữ dữ liệu dự án và ứng dụng. Các phần tử thông tin được tách ra thành những phần
sau:

• Phần tử dữ liệu dự án

• Phần tử Datum Dự án (Duy nhất).

Để biết thêm thông tin về Phần tử Datum, hãy xem Datum và Phần tử Thông tin.

Các phân loại khác

Các phần tử cũng được phân loại như sau:

• Loại

• Gia đình

• Biểu tượng

• Ví dụ

Có một số mối quan hệ giữa các phân loại. Ví dụ:

• Bạn có thể phân biệt các loại FamilyInstances khác nhau theo danh mục. Các mục như cột cấu trúc nằm trong Cấu trúc
Danh mục cột, dầm và thanh giằng nằm trong danh mục Khung kết cấu, v.v.

• Bạn có thể phân biệt các Phần tử FamilyInstance cấu trúc bằng ký hiệu của chúng.
Loại

Thuộc tính Element.Category đại diện cho danh mục hoặc danh mục con mà một Phần tử thuộc về. Nó được sử dụng để xác định loại phần tử.
Ví dụ, bất cứ thứ gì trong danh mục tường đều được coi là tường. Các hạng mục khác bao gồm cửa và phòng.

Danh mục là lớp chung nhất. Thuộc tính Document.Settings.Categories là một bản đồ chứa tất cả các đối tượng Category trong tài liệu và được chia thành
các phần sau:

• Hạng mục Mô hình - Hạng mục Mô hình bao gồm dầm, cột, cửa ra vào, cửa sổ và tường.

• Danh mục chú thích. Danh mục chú thích bao gồm kích thước, lưới, cấp độ và chú thích văn bản.

Hình 20: Các hạng mục


Machine Translated by Google

Ghi chú

Các nguyên tắc sau áp dụng cho các danh mục:

• Nói chung, các quy tắc sau áp dụng cho các danh mục:

o Mỗi đối tượng gia đình thuộc một loại

o Các đối tượng không thuộc gia đình, như vật liệu và khung cảnh, không thuộc về một danh mục

o Có những ngoại lệ như ProjectInfo, thuộc danh mục Thông tin dự án.

• Một phần tử và các ký hiệu tương ứng của nó thường thuộc cùng một loại. Ví dụ: tường cơ bản và loại tường Chung - 8 "
đều nằm trong danh mục Tường.

• Cùng một loại Phần tử có thể thuộc các danh mục khác nhau. Ví dụ: SpotDimensions có SpotDimensionType, nhưng nó có thể
thuộc hai danh mục khác nhau: Độ cao Điểm và Tọa độ Điểm.

• Các Phần tử khác nhau có thể nằm trong cùng một danh mục vì sự giống nhau của chúng hoặc vì lý do kiến trúc. ModelLine và DetailLine là
trong danh mục Dòng.

Để có quyền truy cập vào các danh mục trong tài liệu 'Lớp thiết lập (ví dụ: để chèn một tập hợp danh mục mới), hãy sử dụng một trong các kỹ thuật sau:

• Nhận các Danh mục từ các thuộc tính tài liệu.

• Nhận một danh mục cụ thể một cách nhanh chóng từ bản đồ danh mục bằng cách sử dụng kiểu liệt kê BuiltInCategory.

Vùng mã 5-1: Nhận danh mục từ cài đặt tài liệu


// Nhận cài đặt của tài liệu hiện tại
Cài đặt documentSettings = document.Settings;

// Nhận tất cả các danh mục của tài liệu hiện tại
Nhóm danh mục = documentSettings.Categories;

// Hiển thị số lượng tất cả các danh mục cho người dùng
String prompt = "Số lượng tất cả các danh mục trong tài liệu Revit hiện tại:" + groups.Size;

// lấy danh mục Tầng theo OST_Floors và hiển thị tên của nó
Category floorCategory = groups.get_Item (BuiltInCategory.OST_Floors);
nhắc + = floorCategory.Name;

// Cung cấp cho người dùng một số thông tin

MessageBox.Show (dấu nhắc, "Revit", MessageBoxButtons.OK);

Danh mục được sử dụng theo cách sau:

• Category được sử dụng để phân loại các phần tử. Loại phần tử xác định các hành vi nhất định. Ví dụ: tất cả các phần tử trong cùng một
danh mục có thể được bao gồm trong cùng một lịch trình.

• Các phần tử có các tham số dựa trên danh mục của chúng.

• Các danh mục cũng được sử dụng để kiểm soát khả năng hiển thị và giao diện đồ họa trong Revit.
Machine Translated by Google

Hình 21: Khả năng hiển thị theo danh mục

Danh mục của một phần tử được xác định bởi ID Danh mục.

• ID danh mục được đại diện bởi lớp ElementId.

• ID danh mục đã nhập tương ứng với các phần tử trong tài liệu.

• Hầu hết các danh mục đều được tích hợp sẵn và ID của chúng là các hằng số được lưu trữ trong các ElementIds.

• Mỗi ID danh mục cài sẵn có một giá trị tương ứng trong Danh sách danh mục được xây dựng. Chúng có thể được chuyển đổi thành tương ứng
Các kiểu liệt kê được xây dựng trongCategory.

• Nếu danh mục không được tích hợp sẵn, ID sẽ được chuyển đổi thành giá trị null.

Vùng mã 5-2: Nhận danh mục phần tử

Phần tử đã chọnElement = null;

foreach (Phần tử e trong document.Selection.Elements)


{
selectElement = e;

phá vỡ; // chỉ lấy một phần tử đã chọn


}

// Lấy thể hiện danh mục từ thuộc tính Category


Danh mục thể loại = selectElement.Category;

BuiltInCategory enumCategory = (BuiltInCategory) hạng mục.Id.Value;


Machine Translated by Google

Lưu ý Để tránh các vấn đề Toàn cầu hóa khi sử dụng Category.Name, BuiltInCategory là lựa chọn tốt hơn. Category.Name có thể khác nhau ở các ngôn ngữ
khác nhau.

Gia đình

Gia đình là các lớp của các phần tử trong một danh mục. Các gia đình có thể nhóm các Phần tử theo cách sau:

• Một tập hợp các tham số (thuộc tính) chung.

• Sử dụng giống hệt nhau.

• Biểu diễn đồ họa tương tự.

Hầu hết các gia đình là các tệp Gia đình thành phần, có nghĩa là bạn có thể tải chúng vào dự án của mình hoặc tạo chúng từ các mẫu Gia đình. Bạn xác định
tập hợp thuộc tính và biểu diễn đồ họa Gia đình.

Một kiểu gia đình khác là Gia đình hệ thống. Hệ thống họ không có sẵn để tải hoặc tạo. Revit xác định trước các thuộc tính Family của hệ thống và biểu
diễn đồ họa; chúng bao gồm các bức tường, kích thước, mái nhà, sàn (hoặc tấm) và các cấp.

Hình 22: Gia đình

Ngoài chức năng hoạt động như một lớp Phần tử, Gia đình còn là một khuôn mẫu được sử dụng để tạo ra các mục mới thuộc Gia đình.

Họ trong API nền tảng Revit

Trong API nền tảng Revit, cả lớp Family và FamilyInstance đều thuộc Họ thành phần. Các yếu tố khác bao gồm Họ hệ thống.

Các họ trong API nền tảng Revit được đại diện bởi ba đối tượng:

• Gia đình

• FamilySymbol

• FamilyInstance.

Mỗi đối tượng đóng một vai trò quan trọng trong cấu trúc Gia đình.

Đối tượng Family có các đặc điểm sau:

• Đại diện cho toàn bộ họ chẳng hạn như chùm.

• Đại diện cho toàn bộ tệp gia đình trên đĩa.

• Chứa một số FamilySymbols.

Đối tượng FamilySymbol đại diện cho một tập hợp các thiết lập cụ thể trong Family chẳng hạn như Type, Concrete-Rectangular Beam: 16 × 32.

Đối tượng FamilyInstance là một cá thể FamilySymbol đại diện cho một cá thể duy nhất trong dự án Revit. Ví dụ, FamilyInstance có thể là một phiên bản đơn lẻ
của một chùm hình chữ nhật bê tông 16 × 32 trong dự án.

Lưu ý Hãy nhớ rằng FamilyInstance tồn tại trong FamilyInstance Elements, Datum Elements và Annotation Elements.

Do đó, các quy tắc sau được áp dụng:

• Mỗi FamilyInstance có một FamilySymbol.

• Mỗi FamilySymbol thuộc về một Family.


Machine Translated by Google

• Mỗi Family chứa một hoặc nhiều FamilySymbols.

Để biết thêm thông tin chi tiết, hãy xem Phiên bản gia đình.

Loại nguyên tố

Trong API nền tảng Revit, Biểu tượng thường là các phần tử không hiển thị được sử dụng để xác định các phiên bản. Các ký hiệu được gọi là Kiểu trong giao diện người dùng.

• Một loại có thể là một kích thước cụ thể trong một gia đình, chẳng hạn như cửa 1730 × 2032 hoặc góc 8 × 4 × 1/2.

• Một kiểu có thể là một kiểu, chẳng hạn như kiểu đường thẳng mặc định hoặc kiểu góc mặc định cho các kích thước.

Các biểu tượng đại diện cho các Phần tử chứa dữ liệu được chia sẻ cho một tập hợp các phần tử tương tự. Trong một số trường hợp, Biểu tượng đại diện cho các thành
phần của tòa nhà mà bạn có thể lấy từ nhà kho, chẳng hạn như cửa ra vào hoặc cửa sổ và có thể được đặt nhiều lần trong cùng một tòa nhà. Trong các trường hợp khác, Biểu
tượng chứa các tham số đối tượng chủ hoặc các phần tử khác. Ví dụ, một Biểu tượng WallType chứa độ dày, số lớp, vật liệu cho mỗi lớp và các thuộc tính khác cho một loại
tường cụ thể.

FamilySymbol là một biểu tượng trong API. Nó còn được gọi là Family Type trong giao diện người dùng Revit. FamilySymbol là một lớp các phần tử trong một họ có cùng giá
trị chính xác cho tất cả các thuộc tính. Ví dụ, tất cả các cửa sáu tấm 32 × 78 thuộc một loại, trong khi tất cả các cửa sáu tấm 24 × 80 thuộc về một loại khác. Giống như
Family, FamilySymbol cũng là một mẫu. Đối tượng FamilySymbol có nguồn gốc từ đối tượng ElementType và đối tượng Element.

Ví dụ

Đối tượng là các mục có vị trí cụ thể trong tòa nhà (đối tượng mô hình) hoặc trên trang bản vẽ (đối tượng chú thích). Phiên bản đại diện cho các bản sao
giống hệt nhau đã được chuyển đổi của một ElementType. Ví dụ: nếu một tòa nhà chứa 20 cửa sổ thuộc một loại cụ thể, thì sẽ có một ElementType với 20 Phiên bản. Các phiên
bản được gọi là Thành phần trong giao diện người dùng.

Ghi chú

Đối với FamilyInstance, thuộc tính Symbol có thể được sử dụng thay cho phương thức GetTypeId () để nhận FamilySymbol tương ứng. Nó là thuận tiện và an toàn vì
bạn không cần phải thực hiện chuyển đổi loại.
Machine Translated by Google

Truy xuất phần tử

Các phần tử trong Revit rất phổ biến. Việc lấy các phần tử mà bạn muốn từ Revit là cần thiết trước khi sử dụng API cho bất kỳ lệnh Phần tử nào. Có một số cách để truy xuất các phần tử
bằng API Revit:

• ElementId - Nếu ElementId của phần tử được biết, phần tử có thể được truy xuất từ tài liệu.

• Lọc và lặp phần tử - đây là một cách tốt để lấy một tập hợp các phần tử liên quan trong tài liệu.

• Các phần tử đã chọn - truy xuất tập hợp các phần tử mà người dùng đã chọn

• Các phần tử cụ thể - một số phần tử có sẵn dưới dạng thuộc tính của tài liệu

Mỗi phương pháp truy xuất phần tử này sẽ được thảo luận chi tiết hơn trong các phần sau.

Nhận một phần tử theo ID

Khi biết ElementId của phần tử mong muốn, hãy sử dụng thuộc tính Document.Element để lấy phần tử.

Lọc bộ sưu tập các phần tử

Cách phổ biến nhất để lấy các phần tử trong tài liệu là sử dụng tính năng lọc để truy xuất một tập hợp các phần tử. API Revit cung cấp lớp FilteredElementCollector và các lớp hỗ trợ, để
tạo các bộ sưu tập phần tử đã lọc mà sau đó có thể được lặp lại. Xem Lọc để biết thêm thông tin.

Lựa chọn

Thay vì nhận được một bộ sưu tập đã lọc của tất cả các phần tử trong mô hình, bạn có thể chỉ truy cập các phần tử đã được chọn. Bạn có thể lấy các đối tượng đã chọn từ tài liệu hoạt
động hiện tại bằng cách sử dụng thuộc tính UIDocument.Selection.Elements. Để biết thêm thông tin về cách sử dụng lựa chọn đang hoạt động, hãy xem Lựa chọn.

Truy cập các yếu tố cụ thể từ tài liệu

Ngoài việc sử dụng cách chung để truy cập các Phần tử, API Nền tảng Revit có các thuộc tính trong lớp Tài liệu để lấy các Phần tử được chỉ định từ tài liệu đang hoạt động hiện tại mà
không cần lặp lại tất cả các Phần tử. Các phần tử được chỉ định mà bạn có thể truy xuất được liệt kê trong bảng sau.

Bảng 11: Truy xuất các phần tử từ thuộc tính tài liệu

Yếu tố Quyền truy cập vào thuộc tính của Tài liệu

ProjectInfo Document.ProjectInformation

Địa điểm dự án Document.ProjectLocations

Document.ActiveProjectLocation

SiteLocation Document.SiteLocation

Giai đoạn Document.Phases

Vật chất Document.Settings.Materials

FamilySymbol liên quan đến biên Document.DeckProfiles

dạng boong của lớp trong cấu trúc

FamilySymbol trong Khối tiêu đề Document.TitleBlocks

thể loại

Tất cả các loại phần tử Document.AnnotationSymbolTypes / BeamSystemTypes / ContFootingTypes / DimensionTypes / FloorTypes / GridTypes /

LevelTypes / RebarBarTypes / RebarHookTypes / RoomTagTypes / SpotDimensionTypes / WallTypes / TextNoteTypes


Machine Translated by Google

Thuộc tính chung


Các thuộc tính sau đây là chung cho mỗi Phần tử được tạo bằng Revit.

ElementId

Mọi phần tử trong tài liệu đang hoạt động đều có một số nhận dạng duy nhất được đại diện bởi kiểu lưu trữ ElementId. Các đối tượng ElementId là dự án rộng.
Nó là một số duy nhất không bao giờ thay đổi trong mô hình phần tử, cho phép nó được lưu trữ bên ngoài để truy xuất phần tử khi cần thiết.

Để xem ID phần tử trong Revit, hãy hoàn thành các bước sau:

1. Từ tab Sửa đổi, trên bảng Điều tra, chọn ID Phần tử. Menu thả xuống ID yếu tố xuất hiện.

Chọn ID của Lựa chọn để lấy số ID cho một phần tử.

Hình 23: ElementId

Trong API nền tảng Revit, bạn có thể tạo trực tiếp một ElementId, sau đó liên kết một giá trị số nguyên duy nhất với ElementId mới. Giá trị ElementId mới là
0 theo mặc định.

Vùng mã 5-3: Cài đặt ElementId


// Lấy id của phần tử

Autodesk.Revit.DB.ElementId selectId = element.Id;


int idInteger = selectId.IntegerValue;

// tạo một id mới và đặt giá trị


Autodesk.Revit.DB.ElementId id = new Autodesk.Revit.DB.ElementId (idInteger);

ElementId có những cách sử dụng sau:

• Sử dụng ElementId để lấy một phần tử cụ thể từ Revit. Từ lớp Ứng dụng Revit, có quyền truy cập vào tài liệu đang hoạt động, sau đó lấy phần tử được
chỉ định bằng phương thức Document.GetElement (ElementId).

Vùng mã 5-4: Sử dụng ElementId


// Lấy id của phần tử

Autodesk.Revit.DB.ElementId selectId = element.Id;


int idInteger = selectId.IntegerValue;

// tạo một id mới và đặt giá trị


Autodesk.Revit.DB.ElementId id = new Autodesk.Revit.DB.ElementId (idInteger);

// Lấy phần tử
Autodesk.Revit.DB.Element first = document.GetElement (id);

Nếu số ID không tồn tại trong dự án, phần tử bạn truy xuất là null.

• Sử dụng ElementId để kiểm tra xem hai Phần tử trong một dự án có bằng nhau hay không. Không nên sử dụng Object.Equal ()
phương pháp.

UniqueId

Mọi phần tử đều có UniqueId, được đại diện bởi kiểu lưu trữ Chuỗi. UniqueId tương ứng với ElementId. Tuy nhiên, không giống như ElementId, UniqueId
hoạt động giống như một GUID (Định danh duy nhất trên toàn cầu), là mã duy nhất trên các dự án Revit riêng biệt. UniqueId có thể giúp bạn theo dõi các phần
tử khi bạn xuất các tệp dự án Revit sang các định dạng khác.
Machine Translated by Google

Vùng mã 5-5: UniqueId

Chuỗi uniqueId = element.UniqueId;

Lưu ý ElementId chỉ là duy nhất trong dự án hiện tại. Nó không phải là duy nhất trên các dự án Revit riêng biệt. UniqueId luôn là duy nhất trong các dự án riêng biệt.

Địa điểm

Vị trí của một đối tượng là quan trọng trong quá trình xây dựng mô hình. Trong Revit, một số đối tượng có vị trí điểm. Ví dụ một bảng có một vị trí điểm. Các đối tượng khác có một vị trí đường

thẳng, đại diện cho một đường cong vị trí hoặc không có vị trí nào cả. Tường là một phần tử có vị trí đường thẳng.

API Nền tảng Revit cung cấp lớp Vị trí và chức năng vị trí cho hầu hết các phần tử. Ví dụ, nó có các phương thức Move () và Rotate () để dịch và xoay các phần tử. Tuy nhiên, lớp Vị trí không có

thuộc tính nào mà từ đó bạn có thể lấy thông tin như tọa độ. Trong trường hợp này, hãy hạ đối tượng Location xuống lớp con của nó giống như LocationPoint hoặc LocationCurve-để có thông tin vị

trí chi tiết hơn và kiểm soát bằng cách sử dụng các dẫn xuất đối tượng.

Việc truy xuất vị trí thực của một phần tử trong một dự án rất hữu ích khi bạn có được hình học của một đối tượng. Các quy tắc sau áp dụng khi bạn truy xuất vị trí:

• Wall, Beam và Brace được điều khiển theo đường cong bằng cách sử dụng LocationCurve.

• Room, RoomTag, SpotDimension, Group, FamilyInstances không theo hướng đường cong và tất cả đều sử dụng In-Place-FamilyInstances
Điểm vị trí.

Trong API nền tảng Revit, hướng theo đường cong có nghĩa là hình dạng hoặc vị trí của một phần tử được xác định bởi một hoặc nhiều đường cong liên quan.

Hầu hết tất cả các phần tử của mô hình phân tích đều hướng theo đường cong - tải trọng tuyến tính và diện tích, các bức tường, các phần tử khung, v.v.

Các phần tử khác không thể truy xuất LocationCurve hoặc LocationPoint. Họ trả về Vị trí mà không có thông tin.

Bảng 12: Thông tin vị trí các yếu tố

Các yếu tố thông tin vị trí

LocationCurve Tường, dầm, nẹp, giàn kết cấu, LineLoad (không có máy chủ)

LocationPoint Room, RoomTag, SpotDimension, Group, Column, Mass

Chỉ vị trí Tầng, Tầng, một số Thẻ, Hệ thống dầm, Thanh cốt thép, Gia cố, Điểm tải, Khu vực tải (không có Máy chủ), Hướng Span (Thẻ độc lập)

Không có vị trí View, LineLoad (với máy chủ), AreaLoad (với Host), BoundaryCondition

Lưu ý Có các phần tử khác không có thông tin Vị trí. Ví dụ: một LineLoad (với máy chủ) hoặc một AreaLoad (với máy chủ) không có Vị trí.

Một số điểm Vị trí FamilyInstance, chẳng hạn như tất cả các điểm FamilyInstance tại chỗ và khối lượng, được chỉ định thành điểm (0, 0, 0) khi chúng được tạo. Tọa độ LocationPoint

được thay đổi nếu bạn chuyển đổi hoặc di chuyển phiên bản.

Để thay đổi Điểm vị trí của Nhóm, hãy thực hiện một trong các thao tác sau:

• Kéo nguồn gốc Nhóm trong giao diện người dùng Revit để thay đổi tọa độ LocationPoint. Trong trường hợp này, Group LocationPoint được thay đổi

trong khi vị trí của Nhóm không được thay đổi.

• Di chuyển Nhóm bằng phương thức ElementTransformUtils.MoveElement () để thay đổi LocationPoint. Điều này thay đổi cả vị trí Nhóm và LocationPoint.

Để biết thêm thông tin về LocationCurve và LocationPoint, hãy xem Di chuyển.

Mức độ

Mặt bằng là mặt phẳng ngang hữu hạn hoạt động như một tham chiếu cho các phần tử được lưu trữ theo cấp hoặc dựa trên cấp, chẳng hạn như mái nhà, sàn nhà và trần nhà. API nền tảng Revit cung

cấp một lớp Cấp độ để thể hiện các đường cấp độ trong Revit. Nhận đối tượng Cấp mà phần tử được gán bằng API nếu phần tử dựa trên cấp.

Vùng mã 5-6: Cấp độ chỉ định

// Lấy đối tượng cấp mà phần tử được gán.

Mức độ cấp = element.Level;


Machine Translated by Google

Một số phần tử, chẳng hạn như một cột, sử dụng một cấp làm tham chiếu cơ bản. Khi bạn nhận được cấp độ cột, cấp độ bạn lấy được là Cấp độ cơ bản.

Hình 24: Tham số mức cơ sở của cột

Ghi chú

Nhận mức Beam hoặc Brace bằng cách sử dụng tham số Mức tham chiếu. Từ thuộc tính Cấp, bạn chỉ nhận được null thay vì thông tin cấp tham chiếu.

Cấp độ là yếu tố được sử dụng phổ biến nhất trong Revit. Trong Revit Platform API, tất cả các cấp trong dự án được định vị bằng cách lặp lại toàn bộ dự án và tìm
kiếm các đối tượng Elements.Level.

Để biết thêm chi tiết Cấp, hãy xem Dữ liệu và Yếu tố Thông tin.

Tham số

Mỗi phần tử đều có một tập hợp các tham số mà người dùng có thể xem và chỉnh sửa trong Revit. Các tham số hiển thị trong hộp thoại Thuộc tính phần tử (chọn bất kỳ
phần tử nào và nhấp vào nút Thuộc tính bên cạnh bộ chọn loại). Ví dụ, hình ảnh sau đây hiển thị các thông số Phòng.

Hình 25: Thông số phòng

Trong Revit Platform API, mỗi đối tượng Phần tử có thuộc tính Tham số, là một tập hợp của tất cả các thuộc tính được gắn vào Phần tử.
Bạn có thể thay đổi các giá trị thuộc tính trong bộ sưu tập. Ví dụ, bạn có thể lấy diện tích của một căn phòng từ các tham số đối tượng phòng; Ngoài ra,
bạn có thể đặt số phòng bằng cách sử dụng các thông số đối tượng phòng. Tham số là một cách khác để cung cấp quyền truy cập vào thông tin thuộc tính không được
hiển thị trong đối tượng phần tử.

Nói chung, mọi thông số phần tử đều có một ID thông số được liên kết. ID tham số được đại diện bởi lớp ElementId. Đối với các tham số do người dùng tạo,
các ID tương ứng với các phần tử thực trong tài liệu. Tuy nhiên, hầu hết các tham số đều được tích hợp sẵn và ID của chúng là các hằng số được lưu trữ
trong các ElementIds.

Tham số là một dạng lưu trữ dữ liệu chung trong các phần tử. Trong API nền tảng Revit, tốt nhất là sử dụng ID thông số tích hợp để lấy thông số. Revit có
sẵn một số lượng lớn các tham số tích hợp bằng cách sử dụng kiểu liệt kê BuiltInParameter.

Để biết thêm chi tiết, hãy xem Thông số.


Machine Translated by Google

Tương tác cơ bản với các phần tử Revit

Lọc
API Revit cung cấp cơ chế lọc và lặp lại các phần tử trong tài liệu Revit. Đây là cách tốt nhất để lấy một tập hợp các yếu tố liên quan, chẳng hạn như tất cả
các bức tường hoặc cửa ra vào trong tài liệu. Bộ lọc cũng có thể được sử dụng để tìm một tập hợp các phần tử rất cụ thể, chẳng hạn như tất cả các chùm có kích
thước cụ thể.

Các bước cơ bản để đưa các phần tử vượt qua một bộ lọc được chỉ định như sau:

1. Tạo một FilteredElementCollector mới

2. Áp dụng một hoặc nhiều bộ lọc cho nó

3. Nhận các phần tử hoặc id phần tử đã lọc (sử dụng một trong một số phương pháp)

Mẫu sau bao gồm các bước cơ bản để lọc và lặp lại các phần tử trong tài liệu.

Vùng mã 6-1: Sử dụng tính năng lọc phần tử để lấy tất cả các phiên bản tường trong tài liệu

// Tìm tất cả các phiên bản Wall trong tài liệu bằng cách sử dụng bộ lọc danh mục
Bộ lọc ElementCategoryFilter = new ElementCategoryFilter (BuiltInCategory.OST_Walls);

// Áp dụng bộ lọc cho các phần tử trong tài liệu đang hoạt động
// Sử dụng phím tắt WhereElementIsNotElementType () để chỉ tìm các phiên bản tường
FilteredElementCollector collector = new FilteredElementCollector (tài liệu);
IList <Element> wall =

collector.WherePasses (bộ lọc) .WhereElementIsNotElementType (). ToElements ();


String prompt = "Thành trong tài liệu hiện tại là: \ n";
foreach (Phần tử e trong tường)
{
nhắc + = e.Name + "\ n";
}
TaskDialog.Show ("Revit", dấu nhắc);

Tạo một FilteredElementCollector


Lớp chính được sử dụng để lặp lại và lọc phần tử được gọi là FilteredElementCollector. Nó được xây dựng theo một trong ba cách:

1. Từ một tài liệu - sẽ tìm kiếm và lọc tập hợp các phần tử trong một tài liệu

2. Từ một tài liệu và tập hợp các ElementIds - sẽ tìm kiếm và lọc một tập hợp các phần tử cụ thể

3. Từ một tài liệu và một chế độ xem - sẽ tìm kiếm và lọc các phần tử hiển thị trong một chế độ xem

Lưu ýLuôn kiểm tra xem một dạng xem có hợp lệ để lặp lại phần tử khi lọc các phần tử trong một dạng xem được chỉ định hay không bằng cách sử
dụng static FilteredElementCollector.IsViewValidForElementIteration ().

Khi đối tượng được tạo lần đầu tiên, không có bộ lọc nào được áp dụng. Lớp này yêu cầu ít nhất một điều kiện được đặt trước khi cố gắng truy cập các phần tử, nếu
không một ngoại lệ sẽ được ném ra.

Áp dụng bộ lọc
Bộ lọc có thể được áp dụng cho FilteredElementCollector bằng cách sử dụng ElementFilters. ElementFilter là một lớp kiểm tra một phần tử để xem nó có đáp ứng một
tiêu chí nhất định hay không. Lớp cơ sở ElementFilter có ba lớp dẫn xuất chia các bộ lọc phần tử thành ba loại.

• ElementQuickFilter - Bộ lọc nhanh chỉ hoạt động trên ElementRecord, một lớp bộ nhớ thấp có giao diện hạn chế để đọc
thuộc tính phần tử. Các phần tử bị bộ lọc nhanh từ chối sẽ không được mở rộng trong bộ nhớ.

• ElementSlowFilter - Bộ lọc chậm yêu cầu phần tử phải được lấy và mở rộng trong bộ nhớ trước. Do đó, tốt hơn là kết hợp các bộ lọc chậm với ít nhất một
ElementQuickFilter, điều này sẽ giảm thiểu số lượng Phần tử được mở rộng để
đánh giá dựa trên các tiêu chí do bộ lọc này đặt ra.

• ElementLogicalFilter - Bộ lọc logic kết hợp hai hoặc nhiều bộ lọc một cách hợp lý. Các bộ lọc thành phần có thể được Revit sắp xếp lại thứ tự thành
khiến các bộ lọc hoạt động nhanh nhất được đánh giá đầu tiên.

Hầu hết các bộ lọc có thể được đảo ngược bằng cách sử dụng một hàm tạo quá tải lấy đối số Boolean chỉ ra để đảo ngược bộ lọc để các phần tử thường được bộ lọc chấp
nhận sẽ bị từ chối và các phần tử thường bị từ chối sẽ được chấp nhận. Các bộ lọc không thể đảo ngược được ghi chú trong các phần tương ứng của chúng bên dưới.
Machine Translated by Google

Có một tập hợp các bộ lọc được xác định trước có sẵn cho các mục đích sử dụng phổ biến. Nhiều bộ lọc tích hợp này cung cấp cơ sở cho các phương thức phím tắt
FilteredElementCollector được đề cập trong phần FilteredElementCollector ở trên. Ba phần tiếp theo cung cấp thêm thông tin về các bộ lọc tích hợp.

Khi một bộ lọc được tạo, nó cần được áp dụng cho FilteredElementCollector. Phương thức chung WherePasses () được sử dụng để áp dụng một ElementFilter duy nhất cho
FilteredElementCollector.

Bộ lọc cũng có thể được áp dụng bằng một số phương pháp tắt do FilteredElementCollector cung cấp. Một số áp dụng một bộ lọc cụ thể mà không cần thêm đầu vào, chẳng
hạn như WhereElementIsCurveDriven (), trong khi những người khác áp dụng một bộ lọc cụ thể với một phần đầu vào đơn giản, chẳng hạn như phương thức OfCategory () lấy
một BuiltInCategory làm tham số. Và cuối cùng có các phương thức như UnionWith () nối các bộ lọc lại với nhau. Tất cả các phương pháp này đều trả về cùng một bộ thu
cho phép các bộ lọc dễ dàng được xâu chuỗi lại với nhau.

Bộ lọc nhanh

Bộ lọc nhanh chỉ hoạt động trên ElementRecord, một lớp bộ nhớ thấp có giao diện hạn chế để đọc các thuộc tính của phần tử. Các phần tử bị bộ lọc nhanh từ chối sẽ không
được mở rộng trong bộ nhớ. Bảng sau đây tóm tắt các bộ lọc nhanh được tích hợp sẵn và một số ví dụ sau đây cho một số bộ lọc.

Bảng 13: Bộ lọc nhanh tích hợp

Bộ lọc tích hợp Những gì nó vượt qua (Các) Phương pháp Phím tắt

Phần tử BoundBoxContainsPointFilter có một hộp giới hạn chứa một Không có

điểm

BoundBoxIntersectsFilter Các phần tử có một hộp giới hạn giao với một đường viền nhất định Không có

BoundBoxIsInsideFilter Các phần tử có một hộp giới hạn bên trong một Không có

đề cương

ElementCategoryFilter Các phần tử khớp với id danh mục đầu vào OfCategoryId ()

ElementClassFilter Các phần tử phù hợp với lớp thời gian chạy đầu vào (hoặc các lớp Của Lớp()

dẫn xuất)

ElementDesignOptionFilter Các yếu tố trong một tùy chọn thiết kế cụ thể ContainedInDesignOption ()

ElementIsCurveDrivenFilter Các phần tử được điều khiển theo đường cong WhereElementIsCurveDriven ()

ElementIsElementTypeFilter Các phần tử là "Loại phần tử" WhereElementIsElementType ()

WhereElementIsNotElementType ()

ElementMulticategoryFilter Các phần tử phù hợp với bất kỳ tập hợp danh mục nào trong số các danh mục nhất định Không có

ElementMulticlassFilter Các phần tử phù hợp với một tập hợp các lớp nhất định (hoặc các Không có

lớp dẫn xuất)

ElementOwnerViewFilter Các phần tử dành riêng cho từng chế độ xem OwnedByView () WhereElementIsViewIndependent ()

ElementStructuralTypeFilter Các phần tử phù hợp với một kiểu cấu trúc nhất định Không có

Loại trừ Tất cả các phần tử ngoại trừ id phần tử được nhập vào bộ lọc Loại trừ ()

FamilySymbolFilter Biểu tượng của một gia đình cụ thể

Lưu ý Không thể đảo ngược FamilySymbolFilter.

Lưu ý Bộ lọc hộp giới hạn loại trừ tất cả các đối tượng có nguồn gốc từ Chế độ xem và các đối tượng bắt nguồn từ ElementType.

Ví dụ sau tạo một đường viền trong tài liệu và sau đó sử dụng một BoundBoxIntersectsFilter để tìm các phần tử trong tài liệu với một hộp giới hạn giao với đường viền đó.
Sau đó, nó chỉ ra cách sử dụng bộ lọc đảo ngược để tìm tất cả các bức tường có hộp giới hạn không giao với đường viền đã cho. Lưu ý rằng việc sử dụng phương thức OfClass
() cũng áp dụng ElementClassFilter cho bộ sưu tập.

Vùng mã 6-2: Ví dụ về BoundBoxIntersectsFilter

// Sử dụng bộ lọc BoundBoxIntersects để tìm các phần tử có hộp giới hạn giao nhau // Đường viền đã cho trong tài liệu.

// Tạo phác thảo, sử dụng điểm XYZ tối thiểu và tối đa để khởi tạo phác thảo.
Machine Translated by Google

Outline myOutLn = new Outline (new XYZ (0, 0, 0), new XYZ (100, 100, 100));

// Tạo bộ lọc BoundBoxIntersects với Outline này


Bộ lọc BoundBoxIntersectsFilter = mới BoundBoxIntersectsFilter (myOutLn);

// Áp dụng bộ lọc cho các phần tử trong tài liệu đang hoạt động // Bộ lọc
này loại trừ tất cả các đối tượng có nguồn gốc từ View và các đối tượng có nguồn gốc từ ElementType
FilteredElementCollector collector = new FilteredElementCollector (document); IList <Element> Elements =
collector.WherePasses (filter) .ToElements ();

// Tìm tất cả các bức tường không giao nhau với BoundBox: sử dụng bộ lọc đảo ngược // để khớp các
phần tử // Sử dụng lệnh tắt OfClass () để chỉ tìm các bức tường BoundBoxIntersectsFilter invertFilter

= new BidingBoxIntersectsFilter (myOutLn, true); collector = new FilteredElementCollector (tài liệu);


IList <Element> notIntersectWalls = collector.OfClass (typeof (Wall)). WherePasses (invertFilter) .ToElements ();

Ví dụ tiếp theo sử dụng bộ lọc loại trừ để tìm tất cả các bức tường hiện không được chọn trong tài liệu.

Vùng mã 6-3: Tạo bộ lọc loại trừ

// Tìm tất cả các bức tường hiện chưa được chọn, // Lấy tất
cả các id phần tử được người dùng chọn hiện tại, loại trừ các id này khi lọc ICollection <ElementId> removees = new
List <ElementId> (); ElementSetIterator elemIter = uiDocument.Selection.Elements.ForwardIterator (); elemIter.Reset
(); while (elemIter.MoveNext ()) {

Phần tử curElem = elemIter.Current as Element; loại trừ.Add


(curElem.Id);
}

// Tạo bộ lọc để loại trừ tất cả id phần tử đã chọn

Bộ lọc ExcludeFilter = new ExclusiveFilter (loại trừ);

// Áp dụng bộ lọc cho các phần tử trong tài liệu đang hoạt động, // Sử dụng
phương thức tắt OfClass () để tìm Walls only FilteredElementCollector
collector = new FilteredElementCollector (uiDocument.Document); IList <Element> wall = collector.WherePasses
(bộ lọc) .OfClass (typeof (Wall)). ToElements ();

Lưu ý rằng ElementClassFilter sẽ so khớp các phần tử có lớp là đối sánh chính xác với lớp đầu vào hoặc các phần tử có lớp được dẫn xuất từ lớp đầu vào. Ví dụ
sau sử dụng ElementClassFilter để tải tất cả các tải trong tài liệu.

Vùng mã 6-4: Sử dụng ElementClassFilter để tải

// Sử dụng ElementClassFilter để tìm tất cả các tải trong tài liệu

// Sử dụng typeof (LoadBase) sẽ mang lại tất cả AreaLoad, LineLoad và PointLoad


Bộ lọc ElementClassFilter = new ElementClassFilter (typeof (LoadBase));

// Áp dụng bộ lọc cho các phần tử trong tài liệu đang hoạt động
FilteredElementCollector collector = new FilteredElementCollector (document); ICollection
<Element> allLoads = collector.WherePasses (filter) .ToElements ();

Có một tập hợp nhỏ các lớp con Phần tử trong API không được bộ lọc lớp phần tử hỗ trợ. Các loại này tồn tại trong API, nhưng không tồn tại trong mô hình đối
tượng gốc của Revit, có nghĩa là bộ lọc này không hỗ trợ chúng. Để sử dụng bộ lọc lớp để tìm các phần tử của các loại này, cần phải sử dụng một lớp cấp cao hơn
và sau đó xử lý kết quả thêm để tìm các phần tử chỉ phù hợp với kiểu con. Lưu ý rằng các bộ lọc chuyên dụng tồn tại cho một số loại này. Các loại sau bị ảnh hưởng
bởi hạn chế này:
Machine Translated by Google

Loại hình Bộ lọc chuyên dụng

Các lớp con của Autodesk.Revit.DB.Material Không có

Các lớp con của Autodesk.Revit.DB.CurveElement CurveElementFilter

Các lớp con của Autodesk.Revit.DB.ConnectorElement Không có

Các lớp con của Autodesk.Revit.DB.HostedSweep Không có

Autodesk.Revit.DB.Architecture.Room RoomFilter

Autodesk.Revit.DB.Mechanical.Space SpaceFilter

Autodesk.Revit.DB.Area AreaFilter

Autodesk.Revit.DB.Architecture.RoomTag RoomTagFilter

Autodesk.Revit.DB.Mechanical.SpaceTag SpaceTagFilter

Autodesk.Revit.DB.AreaTag AreaTagFilter

Autodesk.Revit.DB.CombinableElement Không có

Autodesk.Revit.DB.Mullion Không có

Autodesk.Revit.DB.Panel Không có

Autodesk.Revit.DB.AnnotationSymbol Không có

Autodesk.Revit.DB.Structure.AreaReinforcementType Không có

Autodesk.Revit.DB.Structure.PathReinforcementType Không có

Autodesk.Revit.DB.AnnotationSymbolType Không có

Autodesk.Revit.DB.Architecture.RoomTagType Không có

Autodesk.Revit.DB.Mechanical.SpaceTagType Không có

Autodesk.Revit.DB.AreaTagType Không có

Autodesk.Revit.DB.Structure.TrussType Không có

Bộ lọc chậm

Bộ lọc chậm yêu cầu phần tử phải được lấy và mở rộng trong bộ nhớ trước. Vì vậy, tốt hơn là kết hợp các bộ lọc chậm với ít nhất một ElementQuickFilter, điều này sẽ giảm thiểu số lượng Phần

tử được mở rộng để đánh giá dựa trên các tiêu chí do bộ lọc này đặt ra. Bảng sau đây tóm tắt các bộ lọc chậm được tích hợp sẵn, trong khi một số ví dụ sau để cung cấp cái nhìn chuyên sâu về
một số bộ lọc.
Machine Translated by Google

Bảng 14: Bộ lọc chậm tích hợp sẵn

Bộ lọc tích hợp Những gì nó vượt qua (Các) Phương pháp Phím tắt

AreaFilter Khu vực Không có

AreaTagFilter Thẻ khu vực Không có

CurveElementFilter CurveElements Không có

ElementLevelFilter Các phần tử được liên kết với một id cấp nhất định Không có

ElementParameterFilter Các phần tử chuyển một hoặc nhiều quy tắc lọc tham số Không có

ElementPhaseStatusFilter Các phần tử có trạng thái pha nhất định trên một pha nhất định Không có

FamilyInstanceFilter Các phiên bản của một phiên bản gia đình cụ thể Không có

FamilyStructuralMaterialTypeFilter Các yếu tố gia đình của loại vật liệu kết cấu nhất định Không có

Phần tử PrimaryDesignOptionMemberFilter thuộc sở hữu của bất kỳ tùy chọn thiết kế chính nào Không có

RoomFilter Phòng Không có

RoomTagFilter Thẻ phòng Không có

SpaceFilter Dấu cách Không có

SpaceTagFilter Thẻ dấu cách Không có

StructuralInstanceUsageFilter Các trường hợp sử dụng cấu trúc nhất định Không có

StructuralMaterialTypeFilter Các đặc điểm của loại vật liệu kết cấu nhất định Không có

StructuralWallUsageFilter Tường sử dụng tường kết cấu nhất định Không có

ElementIntersectsElementFilter Các phần tử giao nhau giữa hình dạng khối của một phần tử nhất định Không có

ElementIntersectsSolidFilter Các phần tử giao nhau giữa hình khối đã cho Không có

Không thể đảo ngược các bộ lọc chậm sau:

• RoomFilter

• RoomTagFilter

• Bộ lọc vùng

• AreaTagFilter

• Bộ lọc không gian

• SpaceTagFilter

• FamilyInstanceFilter

Như đã đề cập trong phần bộ lọc nhanh, một số lớp không hoạt động với ElementClassFilter. Một số lớp đó, chẳng hạn như Room và RoomTag có bộ lọc chuyên dụng của
riêng chúng.

Vùng mã 6-5: Sử dụng bộ lọc Phòng


// Sử dụng RoomFilter để tìm tất cả các phần tử phòng trong tài liệu. Cần sử dụng // RoomFilter chứ không phải
ElementClassFilter hoặc phương thức tắt OfClass () vì lớp Room // không được các phương thức đó hỗ trợ.

Bộ lọc RoomFilter = new RoomFilter ();

// Áp dụng bộ lọc cho các phần tử trong tài liệu đang hoạt động
FilteredElementCollector collector = new FilteredElementCollector (tài liệu);
IList <Element> Rooms = collector.WherePasses (bộ lọc) .ToElements ();

ElementParameterFilter là một bộ lọc mạnh mẽ có thể tìm thấy các phần tử dựa trên các giá trị của thông số mà chúng có thể có. Nó có thể tìm các phần tử có giá
trị tham số khớp với một giá trị cụ thể hoặc lớn hơn hoặc nhỏ hơn một số giá trị. ElementParameterFilter cũng có thể được sử dụng để tìm các phần tử hỗ trợ một
tham số được chia sẻ cụ thể.
Machine Translated by Google

Ví dụ bên dưới sử dụng ElementParameterFilter để tìm các phòng có diện tích hơn 100 bộ vuông và các phòng có diện tích nhỏ hơn 100 bộ vuông.

Vùng mã 6-6: Sử dụng bộ lọc tham số

// Tạo bộ lọc ElementParameter để tìm các phòng có diện tích // lớn hơn giá trị đã chỉ

định
// Tạo bộ lọc theo nhà cung cấp và người đánh giá
BuiltInParameter areaParam = BuiltInParameter.ROOM_AREA;
// các nhà cung cấp

ParameterValueProvider pvp = new ParameterValueProvider (new ElementId ((int) areaParam));


// người đánh giá

FilterNumericRuleEvaluator fnrv = new FilterNumericGreater ();


// giá trị quy

tắc double ruleValue = 100.0f; // // phòng lọc có diện tích lớn hơn 100 SF
qui định

FilterRule fRule = new FilterDoubleRule (pvp, fnrv, ruleValue, 1E-6);

// Tạo bộ lọc ElementParameter

Bộ lọc ElementParameterFilter = new ElementParameterFilter (fRule);

// Áp dụng bộ lọc cho các phần tử trong tài liệu đang hoạt động
FilteredElementCollector collector = new FilteredElementCollector (tài liệu);
IList <Element> Rooms = collector.WherePasses (bộ lọc) .ToElements ();

// Tìm các phòng có diện tích nhỏ hơn hoặc bằng 100: // Sử dụng bộ lọc
đảo ngược để khớp các phần tử

ElementParameterFilter lessOrEqualFilter = new ElementParameterFilter (fRule, true); collector = new


FilteredElementCollector (tài liệu);
IList <Element> lessOrEqualFounds = collector.WherePasses (lessOrEqualFilter) .ToElements ();

Ví dụ sau đây cho thấy cách sử dụng FamilyStructuralMaterialTypeFilter để tìm tất cả các gia đình có loại vật liệu là gỗ. Nó cũng
cho biết cách sử dụng bộ lọc đảo ngược để tìm tất cả các gia đình có loại vật liệu không phải là gỗ.

Mã Vùng 6-7: Tìm tất cả các gia đình có chất liệu gỗ

// Sử dụng bộ lọc FamilyStructuralMaterialType để tìm các họ có loại vật liệu là Gỗ


Bộ lọc FamilyStructuralMaterialTypeFilter = new FamilyStructuralMaterialTypeFilter (StructuralMaterialType.Wood);

// Áp dụng bộ lọc cho các phần tử trong tài liệu đang hoạt động
FilteredElementCollector collector = new FilteredElementCollector (tài liệu);
ICollection <Element> woodFamiles = collector.WherePasses (bộ lọc) .ToElements ();

// Tìm các gia đình không phải là Gỗ: Sử dụng bộ lọc đảo ngược để so khớp các gia đình

FamilyStructuralMaterialTypeFilter notWoodFilter =
new FamilyStructuralMaterialTypeFilter (StructuralMaterialType.Wood, true);
collector = new FilteredElementCollector (tài liệu);
ICollection <Element> notWoodFamilies = collector.WherePasses (notWoodFilter) .ToElements ();

Hai bộ lọc chậm cuối cùng bắt nguồn từ ElementIntersectsFilter, là một lớp cơ sở cho các bộ lọc được sử dụng để đối sánh các phần tử giao nhau với

hình học. Xem Vùng mã: Tìm Tường lân cận trong phần Lớp tiện ích hình học cho một ví dụ về việc sử dụng loại bộ lọc này.

Bộ lọc logic

Bộ lọc logic kết hợp hai hoặc nhiều bộ lọc một cách hợp lý. Bảng sau đây tóm tắt các bộ lọc logic được tích hợp sẵn.

Bảng 15: Bộ lọc logic tích hợp

Bộ lọc tích hợp Những gì nó vượt qua (Các) Phương pháp Phím tắt

Phần tử LogicalAndFilter vượt qua 2 bộ lọc trở lên WherePasses () - thêm một bộ lọc bổ sung

IntersectWith () - kết hợp hai bộ lọc độc lập

LogicalOrFilter Các phần tử vượt qua ít nhất một trong 2 bộ lọc trở lên UnionWith () - tham gia hai bộ bộ lọc độc lập
Machine Translated by Google

Trong ví dụ bên dưới, hai bộ lọc nhanh được kết hợp bằng bộ lọc logic để lấy tất cả các phần tử FamilyInstance cửa trong tài liệu.

Vùng mã 6-8: Sử dụng LogicalAndFilter để tìm tất cả các trường hợp cửa

// Tìm tất cả các phiên bản cửa trong dự án bằng cách tìm tất cả các phần tử thuộc về
// danh mục cửa và là các trường hợp gia đình.
ElementClassFilter familyInstanceFilter = new ElementClassFilter (typeof (FamilyInstance));

// Tạo bộ lọc danh mục cho Cửa


ElementCategoryFilter doorCategoryfilter = new
ElementCategoryFilter (BuiltInCategory.OST_Doors);

// Tạo logic và bộ lọc cho tất cả các Door FamilyInstances


LogicalAndFilter doorInstancesFilter = new LogicalAndFilter (familyInstanceFilter,
cửa ra vào);

// Áp dụng bộ lọc cho các phần tử trong tài liệu đang hoạt động
FilteredElementCollector collector = new FilteredElementCollector (tài liệu);
IList <Element> door = collector.WherePasses (doorInstancesFilter) .ToElements ();

Nhận các phần tử hoặc id phần tử đã lọc


Khi một hoặc nhiều bộ lọc đã được áp dụng cho FilteredElementCollector, tập hợp phần tử đã lọc có thể được truy xuất theo một trong ba cách:

1. Lấy một bộ sưu tập các Phần tử hoặc Id Phần tử.

o ToElements () - trả về tất cả các phần tử vượt qua tất cả các bộ lọc được áp dụng

o ToElementIds () - trả về các ElementIds của tất cả các phần tử vượt qua tất cả các bộ lọc được áp dụng

2. Lấy Element hoặc ElementId đầu tiên phù hợp với bộ lọc.

o FirstElement () - trả về phần tử đầu tiên để vượt qua tất cả các bộ lọc được áp dụng

o FirstElementId () - trả về id của phần tử đầu tiên để vượt qua tất cả các bộ lọc được áp dụng

3. Lấy một ElementId hoặc trình vòng lặp Phần tử.

o GetElementIdIterator () - trả về FilteredElementIdIterator cho id phần tử chuyển qua các bộ lọc

o GetElementIterator () - trả về FilteredElementIterator cho các phần tử đi qua các bộ lọc

o GetEnumerator () - trả về một IEnumerator <Element> lặp qua tập hợp các phần tử đi qua

Bạn chỉ nên sử dụng một trong các phương pháp từ các nhóm này tại một thời điểm; bộ sưu tập sẽ đặt lại nếu bạn gọi một phương thức khác để trích xuất các phần tử.
Do đó, nếu trước đó bạn đã lấy được một trình lặp, nó sẽ bị dừng lại và không duyệt qua phần tử nào nữa nếu bạn gọi một phương thức khác để trích xuất các
phần tử.

Phương pháp nào là tốt nhất phụ thuộc vào ứng dụng. Nếu chỉ cần một phần tử phù hợp, FirstElement () hoặc FirstElementId () là lựa chọn tốt nhất. Nếu tất cả
các phần tử phù hợp là bắt buộc, hãy sử dụng ToElements (). Nếu cần một số biến, hãy sử dụng một trình lặp.

Nếu ứng dụng sẽ xóa các phần tử hoặc thực hiện các thay đổi đáng kể đối với các phần tử trong danh sách đã lọc, thì ToElementIds () hoặc một trình lặp id phần
tử là những lựa chọn tốt nhất. Điều này là do việc xóa các phần tử hoặc thực hiện các thay đổi quan trọng đối với một phần tử có thể làm mất hiệu lực của một
phần tử xử lý. Với id phần tử, lệnh gọi Document.GetElement () với ElementId sẽ luôn trả về Phần tử hợp lệ (hoặc tham chiếu rỗng nếu phần tử đã bị xóa).
Machine Translated by Google

Việc sử dụng phương thức ToElements () để nhận kết quả bộ lọc dưới dạng một tập hợp các phần tử cho phép sử dụng foreach để kiểm tra từng phần tử trong tập
hợp, như được hiển thị bên dưới:

Vùng mã 6-9: Sử dụng ToElements () để nhận kết quả lọc

1. // Sử dụng ElementClassFilter để tìm tất cả các tải trong tài liệu 2. // Sử


dụng typeof (LoadBase) sẽ mang lại tất cả AreaLoad, LineLoad và PointLoad 3. Bộ lọc
ElementClassFilter = new ElementClassFilter (typeof (LoadBase));
4.
5. // Áp dụng bộ lọc cho các phần tử trong tài liệu đang hoạt động 6.
FilteredElementCollector collector = new FilteredElementCollector (document); 7. bộ sưu tập.WherePasses
(bộ lọc); 8. ICollection <Element> allLoads = collector.ToElements (); 9.

10. String prompt = "Tải trong tài liệu hiện tại là: \ n"; 11. foreach (Phần tử
loadElem trong allLoads) 12. { 13.

LoadBase load = loadElem as LoadBase; prompt +


14. = load.GetType (). Name + ":" load.Name + "\ n"; +
15.
16. }
17.
18. TaskDialog.Show ("Revit", dấu nhắc);

Khi chỉ cần một phần tử đi qua, hãy sử dụng FirstElement ():

Vùng mã 6-10: Nhận phần tử vượt qua đầu tiên

1. // Tạo bộ lọc để tìm tất cả các cột 2.


StructuralInstanceUsageFilter columnFilter = new
StructuralInstanceUsageFilter (StructuralInstanceUsage.Column); 3.
4.
5. // Áp dụng bộ lọc cho các phần tử trong tài liệu đang hoạt động 6.
FilteredElementCollector collector = new FilteredElementCollector (document); 7. bộ sưu tập.WherePasses
(columnFilter); số 8.

9. // Lấy cột đầu tiên từ kết quả đã lọc 10. // Phần tử sẽ là


FamilyInstance 11. FamilyInstance column = collector.FirstElement
() as FamilyInstance;

Trong một số trường hợp, FirstElement () là không đủ. Ví dụ tiếp theo này cho thấy cách sử dụng các phương thức mở rộng để có được chế độ xem 3D không phải mẫu
đầu tiên (hữu ích cho việc nhập vào các hàm tạo ReferenceIntersector).

Vùng mã 6-11: Nhận phần tử chuyển đầu tiên bằng các phương pháp mở rộng

1. // Sử dụng bộ lọc để tìm chế độ xem 3D không phải mẫu


2. // Ví dụ này không sử dụng FirstElement () vì filterd view3D đầu tiên có thể là một mẫu 3. FilteredElementCollector
collector = new FilteredElementCollector (document); 4. Func <View3D, bool> isNotTemplate = v3 =>! (V3.IsTemplate);

5.
6. // áp dụng ElementClassFilter 7.
collector.OfClass (typeof (View3D)); 8. 9. //
sử dụng các phương thức mở rộng để lấy View3D
không phải mẫu đầu tiên 10. View3D view3D = collector.Cast <View3D> () .First
<View3D> (isNotTemplate);
Machine Translated by Google

Ví dụ sau minh họa việc sử dụng phương thức FirstElementId () để lấy một phần tử đi qua (chế độ xem 3d trong trường hợp này) và việc sử dụng ToElementIds ()
để nhận kết quả bộ lọc dưới dạng tập hợp id phần tử (để xóa một tập hợp của các phần tử trong trường hợp này).

Vùng mã 6-12: Sử dụng Nhận kết quả bộ lọc dưới dạng id phần tử

1. FilteredElementCollector collector = new FilteredElementCollector (tài liệu);


2.
3. // Sử dụng phím tắt OfClass để lấy các phần tử View 4.
collector.OfClass (typeof (View3D)); 5.

6. // Lấy Id của khung nhìn đầu tiên 7.


ElementId viewId = collector.FirstElementId (); số 8.

9. // Kiểm tra xem khung nhìn có hợp lệ để lọc phần tử không 10. if
(FilteredElementCollector.IsViewValidForElementIteration (document, viewId)) 11. { 12. 13.

FilteredElementCollector viewCollector = new FilteredElementCollector (tài liệu, viewId);

14. // Lấy tất cả các mục FamilyInstance trong khung nhìn


15. viewCollector.OfClass (typeof (FamilyInstance)); ICollection
16. <ElementId> familyInstanceIds = viewCollector.ToElementIds ();
17.
18. document.Delete (familyInstanceIds);
19. }

Phương thức GetElementIterator () được sử dụng trong ví dụ sau để lặp qua các phần tử được lọc để kiểm tra trạng thái dòng chảy của một số đường ống.

Vùng mã 6-13: Nhận kết quả dưới dạng một trình lặp phần tử

1. FilteredElementCollector collector = new FilteredElementCollector (tài liệu); 2.

3. // Áp dụng một bộ lọc để lấy tất cả các đường ống trong tài liệu
4. collector.OfClass (typeof (Autodesk.Revit.DB.Plumbing.Pipe)); 5.

6. // Nhận kết quả dưới dạng trình lặp phần tử và tìm kiếm một đường ống có 7. //
trạng thái luồng cụ thể 8. FilteredElementIterator elemItr = collector.GetElementIterator
(); 9. elemItr.Reset (); 10. trong khi (elemItr.MoveNext ()) 11. { 12. 13.

Pipe pipe = elemItr.Current as Pipe; if


(pipe.FlowState == PipeFlowState.LaminarState) {
14.
15. TaskDialog.Show ("Revit", "Mô hình có ít nhất một đường ống với trạng thái dòng chảy Laminar."); phá vỡ;
16.
17. }
18. }

Ngoài ra, kết quả bộ lọc có thể được trả về dưới dạng một trình lặp id phần tử:

Vùng mã 6-14: Nhận kết quả dưới dạng trình lặp id phần tử

1. // Sử dụng RoomFilter để tìm tất cả các phần tử phòng trong tài liệu.

2. Bộ lọc RoomFilter = new RoomFilter (); 3.

4. // Áp dụng bộ lọc cho các phần tử trong tài liệu đang hoạt động 5.
FilteredElementCollector collector = new FilteredElementCollector (document); 6. bộ sưu tập.WherePasses
(bộ lọc); 7.

8. // Lấy kết quả dưới dạng trình lặp ElementId 9.


FilteredElementIdIterator roomIdItr = collector.GetElementIdIterator (); 10. roomIdItr.Reset ();
11. trong khi (roomIdItr.MoveNext ()) 12. { 13.

ElementId roomId = roomIdItr.Current; // Cảnh


14. báo các phòng nhỏ hơn 50 SF Room room =
15. document.GetElement (roomId) as Room; if (room.Area <50.0) {
16.
17.
"
18. String prompt = "Phòng quá nhỏ: id = TaskDialog.Show + roomId.ToString ();
19. (" Revit ", prompt); break;
20.
21. }
22. }
Machine Translated by Google

Trong một số trường hợp, có thể hữu ích khi kiểm tra một phần tử duy nhất dựa trên một bộ lọc nhất định, thay vì lấy tất cả các phần tử vượt qua bộ lọc. Có hai quá tải cho

ElementFilter.PassesFilter () kiểm tra một Phần tử nhất định, hoặc ElementId, so với bộ lọc, trả về true nếu phần tử vượt qua bộ lọc.

Truy vấn LINQ

Trong .NET, lớp FilteredElementCollector hỗ trợ giao diện IEnumerable cho các phần tử. Bạn có thể sử dụng lớp này với các truy vấn và hoạt động LINQ để xử lý danh sách
các phần tử. Lưu ý rằng vì ElementFilters và các phương thức phím tắt được cung cấp bởi lớp này xử lý các phần tử trong mã gốc trước khi tạo trình bao bọc được quản
lý của chúng, nên hiệu suất tốt hơn sẽ đạt được bằng cách sử dụng càng nhiều bộ lọc gốc càng tốt trên bộ sưu tập trước khi cố gắng xử lý kết quả bằng cách sử dụng truy
vấn LINQ .

Ví dụ sau sử dụng ElementClassFilter để lấy tất cả các phần tử FamilyInstance trong tài liệu, sau đó sử dụng truy vấn LINQ để thu hẹp kết quả cho các FamilyInstance đó với
một tên cụ thể.

Vùng mã 6-15: Sử dụng truy vấn LINQ

// Sử dụng ElementClassFilter để tìm các phiên bản gia đình có tên là 60 "x 30" Student
Bộ lọc ElementClassFilter = new ElementClassFilter (typeof (FamilyInstance));

// Áp dụng bộ lọc cho các phần tử trong tài liệu đang hoạt động
FilteredElementCollector collector = new FilteredElementCollector (tài liệu);
bộ sưu tập.WherePasses (bộ lọc);

// Sử dụng truy vấn Linq để tìm các phiên bản gia đình có tên là 60 "x 30" Student
var query = from phần tử trong bộ sưu tập
where element.Name == "60 \" x 30 \ "Sinh viên"

chọn phần tử;

// Truyền các phần tử được tìm thấy đến các phiên bản
gia đình, // truyền dữ liệu này tới FamilyInstance là an toàn vì ElementClassFilter cho FamilyInstance đã được sử dụng
Danh sách <FamilyInstance> familyInstances = query.Cast <FamilyInstance> () .ToList <FamilyInstance> ();

Bộ lọc Bound Box

Bộ lọc BoundBox:

BoundBoxIsInsideFilter

BoundBoxIntersectsFilter

BoundBoxContainsPointFilter

giúp bạn tìm các phần tử có các hộp giới hạn đáp ứng một tiêu chí nhất định. Bạn có thể kiểm tra xem hộp giới hạn của mỗi phần tử có bên trong một tập nhất định, giao với một tập

nhất định hay chứa một điểm nhất định hay không. Bạn cũng có thể đảo ngược việc kiểm tra này để tìm các phần tử không giao nhau giữa một tập hoặc chứa một điểm nhất định.

Bộ lọc BoundBox sử dụng Outline làm đầu vào của chúng. Outline là một lớp đại diện cho một lăng trụ hình chữ nhật bên phải có các trục được căn chỉnh với tọa độ Revit world

hệ thống.

Các bộ lọc này hoạt động tốt nhất cho các hình có hình dạng thực tế khớp với hình dạng của hộp giới hạn của nó. Các ví dụ có thể bao gồm các bức tường tuyến tính có đường cong thẳng

hàng với hướng X hoặc Y, các phòng hình chữ nhật được tạo bởi các bức tường, sàn nhà hoặc mái nhà như vậy được căn chỉnh với các bức tường đó hoặc các đình hình chữ nhật hợp lý.

Nếu không, có khả năng dương tính giả vì hộp giới hạn của phần tử có thể lớn hơn nhiều so với hình dạng thực tế. (Trong những trường hợp này, bạn có thể sử dụng hình học thực tế của

phần tử để xác định xem phần tử có thực sự đáp ứng tiêu chí hay không).

Bộ lọc Giao nhau Phần tử

Các bộ lọc phần tử:

• ElementIntersectsElementFilter
• ElementIntersectsSolidFilter

vượt qua các phần tử có hình học 3D thực tế giao với hình học 3D của đối tượng đích.

Với ElementIntersectsElementFilter, đối tượng đích là một phần tử khác. Giao điểm được xác định với cùng một logic được Revit sử dụng để xác định xem có tồn tại nhiễu trong quá trình

tạo Báo cáo giao thoa hay không. (Điều này có nghĩa là một số tổ hợp các phần tử sẽ không bao giờ vượt qua bộ lọc này, chẳng hạn như các thành phần cụ thể được ghép tự động tại các

giao điểm của chúng). Ngoài ra, các phần tử không có hình dạng rắn, chẳng hạn như Rebar, sẽ không vượt qua bộ lọc này.
Machine Translated by Google

Với ElementIntersectsSolidFilter, đối tượng đích là bất kỳ vật rắn nào. Chất rắn này có thể được lấy từ một phần tử hiện có, được tạo từ đầu bằng cách sử dụng các quy trình trong GeometryCreationUtilities,

hoặc kết quả của một phép toán thứ cấp chẳng hạn như phép toán Boolean. Tương tự như ElementIntersectsElementFilter, bộ lọc này sẽ không chuyển các phần tử thiếu hình dạng rắn.

Cả hai bộ lọc đều có thể được đảo ngược để khớp với các phần tử bên ngoài khối lượng đối tượng mục tiêu.

Cả hai bộ lọc đều là bộ lọc chậm và do đó được kết hợp tốt nhất với một hoặc nhiều bộ lọc nhanh như bộ lọc lớp hoặc danh mục.

Vùng mã: sử dụng ElementIntersectsSolidFilter để khớp các phần tử chặn lối ra vào cửa bị vô hiệu hóa

1. /// <summary>
2. /// Tìm bất kỳ phần tử vật lý Revit nào cản trở mục tiêu 3. /// vùng rắn xung quanh cửa. </
summary> 4. /// <remarks> Quy trình này rất hữu ích để phát hiện các nhiễu 5. /// vi phạm Đạo
luật Người Mỹ Khuyết tật hoặc các mã truy cập 6. /// bị khuyết tật ở địa phương khác. </remarks>
7. /// <param name = "doorInstance"> Trường hợp cửa. </param> 8. /// <param name = "doorAccessibilityRegion">
Vùng khả năng tiếp cận được tính toán 9. /// để bao quanh lối tiếp cận của cánh cửa.

10. /// Bởi vì các tham số hình học của vùng này là mã và 11. /// cửa cụ thể, tính toán
hình học của vùng không phải là 12. /// được minh họa trong ví dụ này. </param> 13. ///
<returns> Tập hợp các id phần tử gây nhiễu. </returns> 14. private ICollection <ElementId>
FindElementsInterferingWithDoor (FamilyInstance doorInstance, Solid doorAccessibilityRegion)
15. { 16.

// Thiết lập bộ thu thập phần tử đã lọc cho tất cả các phần tử tài liệu.
17. FilteredElementCollector can thiệpCollector =
18. mới FilteredElementCollector (doorInstance.Document);
19.
20. // Chỉ chấp nhận các cá thể phần tử
21. interferingCollector.WhereElementIsNotElementType ();
22.
23. // Loại trừ các điểm giao cắt với cửa chính hoặc tường chủ đối với cửa.
24. Danh sách <ElementId> bị loại trừElements = new Danh sách <ElementId> ();
25. loại trừElements.Add (doorInstance.Id); loại trừElements.Add
26. (doorInstance.Host.Id); ExcludeFilter ExclusiveionFilter = new
27. ExclusiveFilter (loại trừ các công cụ này); interferingCollector.WherePasses (loại trừ bộ lọc);
28.
29.
30. // Thiết lập bộ lọc khớp với các phần tử có hình dạng rắn giao nhau // với vùng hỗ trợ tiếp cận
31.
32. Giao điểm ElementIntersectsSolidFilterFilter =
33. ElementIntersectsSolidFilter mới (doorAccessibilityRegion);
34. interferingCollector.WherePasses (Bộ lọc giao nhau);
35.
36. // Trả về tất cả các phần tử đi qua bộ sưu tập return
37. interferingCollector.ToElementIds ();
38. }
Machine Translated by Google

Lựa chọn

Bạn có thể lấy các đối tượng đã chọn từ tài liệu hoạt động hiện tại bằng cách sử dụng thuộc tính UIDocument.Selection.Elements. Các đối tượng được chọn nằm trong một ElementSet trong
Revit. Từ tập hợp Phần tử này, tất cả các Phần tử đã chọn sẽ được truy xuất. Đối tượng Selection cũng có thể được sử dụng để thay đổi lựa chọn hiện tại theo chương trình.

Ngoài ra, phương thức Selection.GetElementIds () truy xuất cùng một tập hợp các phần tử như thuộc tính Selection.Elements. Bộ sưu tập được trả về bởi phương thức này có thể được sử
dụng trực tiếp với FilteredElementCollector để lọc các phần tử đã chọn.

Thay đổi lựa chọn


Để sửa đổi Lựa chọn.

1. Tạo SelElementSet mới.

2. Đặt các phần tử trong đó.

3. Đặt Selection.Elements thành thể hiện SelElementSet mới.

Ví dụ sau minh họa cách thay đổi các Phần tử đã chọn.

Vùng mã 7-1: Thay đổi các phần tử đã chọn

1. private void ChangeSelection (Tài liệu tài liệu) 2. { 3.

// Lấy các phần tử đã chọn tạo thành tài liệu hiện tại.
4. UIDocument uidoc = new UIDocument (tài liệu); Bộ sưu tập
5. Autodesk.Revit.UI.Selection.SelElementSet = uidoc.Selection.Elements;
6.
7. // Hiển thị số phần tử được chọn hiện tại TaskDialog.Show
số 8.
("Revit", "Số phần tử được chọn:" + collection.Size.ToString ());
9.
10. // Tạo một SelElementSet SelElementSet
11. newSelectedElementSet = SelElementSet.Create ();
12.
13. // Thêm tường vào tập phần tử đã tạo. foreach (Các
14. phần tử Autodesk.Revit.DB.Element trong bộ sưu tập) {
15.
16. if (các phần tử là Wall) {
17.
18. newSelectedElementSet.Add (phần tử);
19. }
20. }
21.
22. // Đặt tập hợp phần tử đã tạo thành tập hợp phần tử chọn hiện tại.
23. uidoc.Selection.Elements = newSelectedElementSet;
24.
25. // Cung cấp cho người dùng một số thông
26. tin. if (0! = newSelectedElementSet.Size) {
27.
28. TaskDialog.Show ("Revit", uidoc.Selection.Elements.Size.ToString () + "Tường được
29. chọn!");
30.
31. }
32. khác {
33. TaskDialog.Show ("Revit", "Không có Tường nào được chọn!");
34. }
35. }

Lựa chọn người dùng

Lớp Selection cũng có các phương thức cho phép người dùng chọn các đối tượng mới, hoặc thậm chí một điểm trên màn hình. Điều này cho phép người dùng chọn một hoặc nhiều Phần tử (hoặc các
đối tượng khác, chẳng hạn như cạnh hoặc mặt) bằng cách sử dụng con trỏ và sau đó trả lại quyền điều khiển cho ứng dụng của bạn. Các chức năng này không tự động thêm vùng chọn mới vào bộ sưu
tập vùng chọn đang hoạt động.

• Phương thức PickObject () nhắc người dùng chọn một đối tượng trong mô hình Revit.

• Phương thức PickObjects () nhắc người dùng chọn nhiều đối tượng trong mô hình Revit.

• Phương thức PickElementsByRectangle () nhắc người dùng chọn nhiều phần tử bằng cách sử dụng một hình chữ nhật.

• Phương thức PickPoint () nhắc người dùng chọn một điểm trong mặt phẳng phác thảo đang hoạt động.

• Phương thức PickBox () gọi một trình soạn thảo bằng hai cú nhấp chuột cho mục đích chung cho phép người dùng chỉ định một vùng hình chữ nhật trên màn hình.

Loại đối tượng được chọn được chỉ định khi gọi PickObject () hoặc PickObjects. Các loại đối tượng có thể được chỉ định là: Element, PointOnElement, Edge hoặc Face.
Machine Translated by Google

Thuộc tính StatusbarTip hiển thị thông báo trên thanh trạng thái khi ứng dụng của bạn nhắc người dùng chọn đối tượng hoặc phần tử. Mỗi hàm Pick có quá tải
có tham số Chuỗi trong đó có thể cung cấp thông báo trạng thái tùy chỉnh.

Vùng mã 7-2: Thêm các phần tử đã chọn với PickObject () và PickElementsByRectangle ()

1. UIDocument uidoc = new UIDocument (tài liệu); 2. Lựa chọn


lựa chọn = uidoc.Selection; 3. // Chọn một đối tượng từ Revit.

4. Tham chiếu hasPickOne = options.PickObject (ObjectType.Element); 5. if (hasPickOne!


= Null) 6. { 7. 8. } 9. 10. int selectCount = options.Elements.Size ; 11. // Chọn các
đối tượng từ Revit.
TaskDialog.Show ("Revit", "Đã thêm một phần tử vào Vùng chọn.");

12. IList <Element> hasPickSome = styles.PickElementsByRectangle ("Chọn theo hình chữ nhật"); 13. if (hasPickSome.Count>
0) 14. {

15. int newSelectionCount = options.Elements.Size; string prompt


16. = string.Format ("{0} phần tử được thêm vào Vùng chọn.",
17. newSelectionCount - Số tiền lựa chọn);
18. TaskDialog.Show ("Revit", dấu nhắc);
19. }

Phương thức PickPoint () có 2 quá tải với tham số ObjectSnapTypes được sử dụng để chỉ định loại kiểu snap được sử dụng cho vùng chọn. Nhiều hơn một có
thể được chỉ định, như được hiển thị trong ví dụ tiếp theo.

Vùng mã 7-3: Điểm chốt

1. public void PickPoint (UIDocument uidoc) 2. { 3. 4.

ObjectSnapTypes snapTypes = ObjectSnapTypes.Endpoints | ObjectSnapTypes.Intersection; XYZ point =


uidoc.Selection.PickPoint (snapTypes, "Chọn điểm cuối hoặc giao điểm");
5. 6.

string strCoords = "Điểm được chọn là" + point.ToString ();


7. 8.

TaskDialog.Show ("Revit", strCoords);


9. 10. }

Phương thức PickBox () nhận một liệt kê PickBoxStyle. Các tùy chọn là Chéo, kiểu được sử dụng khi chọn các đối tượng hoàn toàn hoặc một phần bên trong
hộp, Bao bọc, kiểu được sử dụng để chọn các đối tượng được bao bọc hoàn toàn bởi hộp và Hướng, trong đó kiểu của hộp phụ thuộc vào hướng hộp đang được
vẽ. Nó sử dụng kiểu Chéo nếu nó được vẽ từ phải sang trái hoặc kiểu Bao quanh khi được vẽ theo hướng ngược lại.
Machine Translated by Google

PickBox () trả về một PickedBox chứa các điểm Tối thiểu và Tối đa được chọn. Ví dụ sau minh họa việc sử dụng PickBox () trong lựa chọn Point Cloud.

Vùng mã: PickBox


1. public void PromptForPointCloudSelection (UIDocument uiDoc, PointCloudInstance pcInstance) 2. { 3.

Ứng dụng ứng dụng = uiDoc.Application.Application; Lựa chọn


4. currentSel = uiDoc.Selection;
5.
PickedBox pickBox = currentSel.PickBox (PickBoxStyle.Enclosing, "Chọn vùng đám mây để làm nổi bật");
6. 7.

XYZ min = pickBox.Min; XYZ max


8. 9. = pickBox.Max;
10.
11. // Chuyển các điểm thành bộ lọc View
12. view = uiDoc.ActiveView; XYZ right =
13. view.RightDirection; XYZ up =
14. view.UpDirection;
15.
16. List <Plane> plane = new List <Plane> ();
17.
18. // X ranh giới bool
19. hướngCorrect = IsPointAbovePlane (right, min, max); plane.Add
20. (app.Create.NewPlane (right, directionCorrect? min: max)); plane.Add (app.Create.NewPlane
21. (-right, directionCorrect? max: min));
22.
23. // Y ranh giới
24. hướngCorrect = IsPointAbovePlane (up, min, max); Plane.Add
25. (app.Create.NewPlane (up, directionCorrect? min: max)); plane.Add (app.Create.NewPlane
26. (-up, directionCorrect? max: min));
27.
28. // Tạo bộ lọc
29. PointCloudFilter filter = PointCloudFilterFactory.CreateMultiPlaneFilter (các mặt phẳng); Giao dịch t =
30. Giao dịch mới (uiDoc.Document, "Đánh dấu"); t.Start (); pcInstance.SetSelectionFilter (bộ lọc);
31. pcInstance.FilterAction = SelectionFilterAction.Highlight; t.Commit (); uiDoc.RefreshActiveView ();
32.
33.
34.
35.

36. }
37.

38. bool tĩnh riêng IsPointAbovePlane (XYZ normal, XYZ planePoint, XYZ point) 39. { 40.

XYZ chênh lệch = point - planePoint; chênh


41. lệch = khác biệt.Normalize (); dấu chấm
42. képProduct = khác biệt.DotProduct (bình thường); trả về
43. dotProduct> 0;

Lựa chọn người dùng được lọc

PickObject (), PickObjects () và PickElementsByRectangle () đều có quá tải lấy ISelectionFilter làm tham số. ISelectionFilter là một giao diện có thể được
thực hiện để lọc các đối tượng trong một hoạt động lựa chọn. Nó có hai phương thức có thể được ghi đè: AllowElement () được sử dụng để chỉ định xem một phần
tử có được phép chọn hay không và AllowReference () được sử dụng để chỉ định xem có cho phép chọn một tham chiếu đến một phần hình học hay không.
Machine Translated by Google

Ví dụ sau minh họa cách sử dụng giao diện ISelectionFilter để giới hạn lựa chọn của người dùng đối với các phần tử trong danh mục Khối lượng. Nó không cho phép bất kỳ
tham chiếu nào đến hình học được chọn.

Vùng mã 7-4: Sử dụng ISelectionFilter để giới hạn lựa chọn phần tử

public static IList <Element> GetManyRefByRectangle (tài liệu UIDocument) {

ReferenceArray ra = new ReferenceArray ();


ISelectionFilter selFilter = new MassSelectionFilter (); IList <Element>
eList = doc.Selection.PickElementsByRectangle (selFilter,
"Chọn nhiều khuôn mặt") as IList <Element>;
trả lại eList;

public class MassSelectionFilter: ISelectionFilter {

public bool AllowElement (Phần tử phần tử) {if


(element.Category.Name == "Mass") {

trả về true;

} trả về false; }

public bool AllowReference (Tham chiếu tham chiếu, điểm XYZ) {

trả về sai;

}
}

Ví dụ tiếp theo minh họa việc sử dụng ISelectionFilter để cho phép chỉ các mặt phẳng được chọn.

Vùng mã 7-5: Sử dụng ISelectionFilter để giới hạn lựa chọn hình học

public void SelectPlanarFaces (tài liệu Autodesk.Revit.DB.Document) {

UIDocument uidoc = new UIDocument (tài liệu);


ISelectionFilter selFilter = new PlanarFacesSelectionFilter (tài liệu); IList <Reference>
face = uidoc.Selection.PickObjects (ObjectType.Face, selFilter, "Chọn nhiều mặt phẳng");

lớp công khai PlanarFacesSelectionFilter: ISelectionFilter {

Tài liệu doc = null;

public PlanarFacesSelectionFilter (Tài liệu tài liệu) {

doc = tài liệu;

public bool AllowElement (Phần tử phần tử) {

trả về true;

public bool AllowReference (Tham chiếu tham chiếu, điểm XYZ) {

if (doc.GetElement (tham khảo) .GetGeometryObjectFromReference (tham khảo) là PlanarFace) {

// Chỉ trả về true cho các mặt phẳng. Các mặt không phẳng sẽ không thể chọn được trả về true;

} trả về false;

}
}

Để biết thêm thông tin về cách truy xuất các Phần tử từ các Phần tử đã chọn, hãy xem Hướng dẫn: Lấy các Phần tử đã Chọn trong phần Bắt đầu tiết diện.
Machine Translated by Google

Thông số

Revit cung cấp một cơ chế chung để cung cấp cho mỗi phần tử một tập hợp các tham số mà bạn có thể chỉnh sửa. Trong giao diện người dùng Revit, các thông số
hiển thị trong hộp thoại Thuộc tính phần tử. Chương này mô tả cách lấy và sử dụng các thông số tích hợp bằng API nền tảng Revit. Để biết thêm thông tin về
thông số được chia sẻ do người dùng xác định, hãy xem Thông số được chia sẻ.

Trong API nền tảng Revit, các Tham số được quản lý trong lớp Phần tử. Bạn có thể truy cập Tham số theo những cách sau:

• Bằng cách lặp qua bộ sưu tập Element.Parameters của tất cả các tham số cho một Phần tử (ví dụ: xem mã mẫu trong
Hướng dẫn Nhận thông số phần tử đã chọn).

• Bằng cách truy cập trực tiếp tham số thông qua thuộc tính Element.Parameter đã được nạp chồng. Nếu Tham số không tồn tại, thuộc tính
trả về null.

• Bằng cách truy cập một tham số theo tên thông qua bộ sưu tập Element.ParametersMap.

Bạn có thể truy xuất đối tượng Tham số từ một Phần tử nếu bạn biết chuỗi tên, ID tích hợp, định nghĩa hoặc GUID. Quá tải thuộc tính Parameter [String] nhận
một tham số dựa trên tên bản địa hóa của nó, vì vậy mã của bạn phải xử lý các ngôn ngữ khác nhau nếu nó sẽ tìm kiếm các tham số theo tên và cần chạy ở nhiều
ngôn ngữ.

Quá tải thuộc tính Parameter [GUID] nhận một tham số được chia sẻ dựa trên ID duy nhất toàn cầu (GUID) của nó, được gán cho tham số được chia sẻ khi nó
được tạo.

Hướng dẫn: Nhận các thông số phần tử đã chọn

Các Tham số Phần tử được truy xuất bằng cách lặp lại Thông qua Bộ Tham số Phần tử. Mẫu mã sau đây minh họa cách lấy Tham số từ một phần tử đã chọn.

Lưu ý Ví dụ này sử dụng một số thành viên Tham số, chẳng hạn như AsValueString và StorageType, được đề cập ở phần sau của chương này.
Machine Translated by Google

Vùng mã 8-1: Nhận các thông số phần tử đã chọn

void GetElementParameterInformation (Tài liệu tài liệu, Phần tử phần tử)


{
// Định dạng chuỗi thông tin lời nhắc
String prompt = "Hiển thị các tham số trong Phần tử đã chọn:";

StringBuilder st = new StringBuilder ();


// lặp lại các tham số của phần tử
foreach (Tham số tham số trong phần tử. Tham số)
{
st.AppendLine (GetParameterInformation (para, document));
}

// Cung cấp cho người dùng một số thông tin

MessageBox.Show (dấu nhắc, "Revit", MessageBoxButtons.OK);


}

Chuỗi GetParameterInformation (Tham số tham số, Tài liệu tài liệu)


{
string defName = para.Definition.Name + @ "\ t";
// Sử dụng phương thức khác để lấy dữ liệu tham số theo kiểu lưu trữ
chuyển đổi (para.StorageType)
{
trường hợp StorageType.Double:
// giấu số thành Metric
" "
defName + = : + para.AsValueString ();
phá vỡ;
case StorageType.ElementId:
// tìm ra tên của phần tử

ElementId id = para.AsElementId ();


if (id.Value> = 0)
{
" "
defName + = : + document.GetElement (id ref) .Name;
}
khác

{
" "
defName + = : + id.Value.ToString ();
}
phá vỡ;
case StorageType.Integer:
if (ParameterType.YesNo == para.Definition.ParameterType)
{
if (para.AsInteger () == 0)
{
" "
defName + = : + "Sai";
}
khác

{
" "
defName + = : + "Đúng";
}
}
khác

{
" "
defName + = : + para.AsInteger (). toString ();
}
phá vỡ;
case StorageType.String:
" "
defName + = : + para.AsString ();
phá vỡ;
mặc định:

defName = "Tham số không phơi sáng.";


phá vỡ;
}

trả về defName;
}
Machine Translated by Google

Hình 26: Nhận kết quả thông số tường

Lưu ý Trong Revit , một số tham số có giá trị trong danh sách thả xuống trong hộp thoại Thuộc tính phần tử. Bạn có thể nhận các giá trị số tương ứng với
kiểu liệt kê cho Tham số bằng cách sử dụng API nền tảng Revit, nhưng bạn không thể lấy biểu diễn chuỗi cho các giá trị bằng phương thức Parameter.AsValueString
().

Sự định nghĩa

Đối tượng Định nghĩa mô tả kiểu dữ liệu, tên và các chi tiết Tham số khác. Có hai loại đối tượng định nghĩa bắt nguồn từ đối tượng này.

• InternalDefinition đại diện cho tất cả các loại định nghĩa tồn tại hoàn toàn trong cơ sở dữ liệu Revit.

• ExternalDefinition đại diện cho các định nghĩa được lưu trữ trên đĩa trong một tệp tham số được chia sẻ.

Bạn nên viết mã để sử dụng lớp cơ sở Định nghĩa để mã có thể áp dụng cho cả Định nghĩa tham số bên trong và bên ngoài.
Mẫu mã sau đây cho thấy cách tìm một tham số cụ thể bằng cách sử dụng kiểu định nghĩa.

Vùng mã 8-2: Tìm một tham số dựa trên kiểu định nghĩa

1. // Tìm tham số bằng kiểu định nghĩa của Tham số. 2. public Parameter
FindParameter (Phần tử phần tử) 3. { 4.

Tham số tìm thấyParameter = null; //


Thao tác này sẽ tìm tham số đầu tiên đo độ dài foreach (Tham số tham số
5. 6. trong element.Parameters) {

7. 8. if (tham số.Definition.ParameterType == ParameterType.Length) {

9. 10. foundParameter = tham số; phá vỡ;


11.
12. }
13.
14. } trả về foundParameter;
15. }

ParameterType

Thuộc tính này trả về kiểu dữ liệu tham số, loại dữ liệu này ảnh hưởng đến cách tham số được hiển thị trong giao diện người dùng Revit. Các thành viên liệt kê
ParameterType là:

Tên thành viên Sự mô tả

Con số Dữ liệu tham số phải được hiểu là một số thực, có thể bao gồm cả dấu thập phân.

Khoa ng khăc Giá trị dữ liệu sẽ được biểu diễn dưới dạng thời điểm.

AreaForce Giá trị dữ liệu sẽ được biểu diễn dưới dạng lực diện tích.

LinearForce Giá trị dữ liệu sẽ được biểu diễn dưới dạng lực tuyến tính.

Lực lượng Giá trị dữ liệu sẽ được biểu diễn dưới dạng lực lượng.
Machine Translated by Google

Có không Một giá trị boolean sẽ được biểu thị là Có hoặc Không.

Vật chất Giá trị của tài sản này được coi là vật chất.

URL Một chuỗi văn bản đại diện cho một địa chỉ web.

Góc Dữ liệu tham số đại diện cho một góc. Biểu diễn bên trong sẽ tính bằng radian. Phần trình bày người dùng có thể nhìn thấy sẽ ở trong

đơn vị mà người dùng đã chọn.

Âm lượng Dữ liệu tham số đại diện cho một khối lượng. Biểu diễn bên trong sẽ ở dạng feet khối thập phân. Phần trình bày người dùng có thể nhìn

thấy sẽ nằm trong các đơn vị mà người dùng đã chọn.

Diện tích Dữ liệu tham số đại diện cho một khu vực. Biểu diễn bên trong sẽ ở dạng bộ vuông thập phân. Phần trình bày người dùng có thể nhìn thấy

sẽ nằm trong các đơn vị mà người dùng đã chọn.

Số nguyên Dữ liệu tham số phải được hiểu là một số nguyên, dương hoặc âm.

Không hợp lệ Loại tham số không hợp lệ. Giá trị này không nên được sử dụng.

Chiều dài Dữ liệu tham số đại diện cho độ dài. Biểu diễn bên trong sẽ ở dạng bộ thập phân. Biểu diễn hiển thị của người dùng sẽ nằm trong hệ thống đơn vị mà

người dùng đã chọn.

Chữ Dữ liệu tham số phải được hiểu là một chuỗi văn bản.

Để biết thêm chi tiết về ParameterType.Material, hãy xem Material.

ParameterGroup

Thuộc tính ParameterGroup lớp Định nghĩa trả về ID nhóm định nghĩa tham số. BuildInParameterGroup là một kiểu liệt kê liệt kê tất cả các nhóm tham số tích hợp
được Revit hỗ trợ. Nhóm tham số được sử dụng để sắp xếp các tham số trong hộp thoại Thuộc tính phần tử.

VariesAcrossGroups

Thuộc tính này, dành riêng cho lớp con InternalDefinition và phương thức SetAllowVaryBetweenGroups () tương ứng xác định liệu các giá trị của tham số này có
thể khác nhau giữa các thành viên liên quan của các trường hợp nhóm hay không. Nếu Sai, các giá trị sẽ nhất quán giữa các thành viên liên quan trong các trường
hợp nhóm. Điều này chỉ có thể được đặt cho các tham số không được tích hợp sẵn.

BuiltInParameter
API nền tảng Revit có một số lượng lớn các tham số tích hợp, được định nghĩa trong kiểu liệt kê Autodesk.Revit.Parameters.BuiltInParameter (xem tệp RevitAPI
Help.chm để biết định nghĩa về kiểu liệt kê này). Bảng liệt kê này đã tạo ra tài liệu có thể nhìn thấy từ Visual Studio intellisense như được hiển thị bên
dưới. Tài liệu cho mỗi id bao gồm tên tham số, như được tìm thấy trong hộp thoại Thuộc tính phần tử trong phiên bản tiếng Anh của Autodesk Revit. Lưu ý rằng
nhiều id tham số riêng biệt có thể ánh xạ đến cùng một tên tiếng Anh; trong những trường hợp đó, bạn phải kiểm tra các tham số được liên kết với một phần tử cụ
thể để xác định id tham số nào sẽ sử dụng.

ID tham số được sử dụng để truy xuất tham số cụ thể từ một phần tử, nếu nó tồn tại, bằng cách sử dụng thuộc tính Element.Parameter. Tuy nhiên, không phải tất
cả các tham số đều có thể được truy xuất bằng ID. Ví dụ: các thông số gia đình không được hiển thị trong API nền tảng Revit, do đó, bạn không thể lấy chúng
bằng cách sử dụng ID thông số tích hợp sẵn.

Mẫu mã sau đây cho thấy cách lấy tham số cụ thể bằng Id BuiltInParameter:

Vùng mã 8-3: Nhận một tham số dựa trên BuiltInParameter

1. public Parameter FindWithBuiltinParameterID (Wall wall) 2. { 3.

// Sử dụng paramametId WALL_BASE_OFFSET // để lấy


4. tham số bù cơ bản của tường.
5. BuiltInParameter paraIndex = BuiltInParameter.WALL_BASE_OFFSET; Tham số tham số =
6. wall.get_Parameter (paraIndex);

tham số trả về ;
7. 8. 9. }

Lưu ý Với quá tải tham số, bạn có thể sử dụng kiểu Enumerated BuiltInParameter làm tham số phương thức. Ví dụ: sử dụng BuiltInParameter.GENERIC_WIDTH.
Machine Translated by Google

Nếu bạn không biết ID BuiltInParameter chính xác, hãy lấy tham số bằng cách lặp lại bộ sưu tập ParameterSet. Một cách tiếp cận khác cho các mục đích kiểm
tra hoặc nhận dạng là kiểm tra từng BuiltInParameter bằng cách sử dụng phương thức get_Parameter (). Khi bạn sử dụng phương pháp này, có thể bộ sưu tập
ParameterSet có thể không chứa tất cả các tham số được trả về từ phương thức get_Parameter (), mặc dù điều này là không thường xuyên.

Loại lưu trữ

StorageType mô tả loại giá trị tham số được lưu trữ bên trong.

Dựa trên giá trị thuộc tính, sử dụng các phương thức get và set tương ứng để truy xuất và đặt giá trị dữ liệu tham số.

StorageType là một kiểu liệt kê liệt kê tất cả các kiểu lưu trữ dữ liệu thông số nội bộ được Revit hỗ trợ:

Bảng 16: Loại lưu trữ

Tên thành viên Mô tả

Sợi dây Dữ liệu nội bộ được lưu trữ dưới dạng một chuỗi ký tự.

ElementId Kiểu dữ liệu đại diện cho một phần tử và được lưu trữ dưới dạng ID phần tử.

Kép Dữ liệu được lưu trữ bên trong dưới dạng số dấu phẩy động 8 byte.

Số nguyên Dữ liệu nội bộ được lưu trữ dưới dạng số nguyên 32 bit có dấu.

Không có Không có nào đại diện cho một loại lưu trữ không hợp lệ. Chỉ sử dụng nội bộ.

Trong hầu hết các trường hợp, giá trị ElementId là một số dương. Tuy nhiên, nó có thể là một số âm. Khi giá trị ElementId là âm, nó không đại diện cho một Phần tử mà có
một ý nghĩa khác. Ví dụ, tham số kiểu lưu trữ cho Phép chiếu dọc của chùm là ElementId. Khi giá trị tham số là Mức 1 hoặc Mức 2, giá trị ElementId là dương và tương ứng
với ElementId của mức đó.
Tuy nhiên, khi giá trị tham số được đặt thành Tự động phát hiện, Trung tâm của chùm hoặc Đầu chùm, giá trị ElementId là âm.

Hình 27: Mẫu kiểu lưu trữ

Mẫu mã sau đây cho thấy cách kiểm tra xem giá trị của một tham số có thể được đặt thành giá trị kép hay không, dựa trên StorageType của nó:

Vùng mã 8-4: Kiểm tra Loại lưu trữ của tham số

public bool SetParameter (Tham số tham số, giá trị kép)


{
kết quả bool = false;

// nếu tham số chỉ đọc, bạn không thể thay đổi giá trị của nó
if (null! = tham số &&! tham số.IsReadOnly)
{
StorageType tham sốType = tham số.StorageType;
if (StorageType.Double! = parameterType)
{
ném ngoại lệ mới ("Các kiểu lưu trữ của giá trị và tham số là khác nhau!");
}

// Nếu thành công, kết quả là true

result = tham số.Set (giá trị);


}

trả về kết quả;

}
Machine Translated by Google

Giá trị trả về của phương thức Set () chỉ ra rằng giá trị Tham số đã được thay đổi. Phương thức Set () trả về true nếu giá trị Tham số đã được thay đổi, nếu không, nó
trả về false.

Không phải tất cả các Tham số đều có thể ghi được. Một Ngoại lệ được ném ra nếu Tham số ở chế độ chỉ đọc.

AsValueString () và SetValueString ()
AsValueString () và SetValueString () là các phương thức của lớp Tham số. Hai phương pháp này chỉ được áp dụng cho các tham số kiểu giá trị, là các tham số kép hoặc số
nguyên đại diện cho một đại lượng được đo.

Sử dụng phương thức AsValueString () để nhận giá trị tham số là một chuỗi với đơn vị đo lường. Ví dụ, giá trị Base Offset, một tham số tường, là một giá trị Double.
Thông thường giá trị được hiển thị dưới dạng chuỗi như -20'0 "trong hộp thoại Thuộc tính phần tử:

Hình 28: Mẫu AsValueString và SetValueString

Sử dụng phương thức AsValueString (), bạn nhận trực tiếp giá trị chuỗi -20'0 ". Nếu không, bạn sẽ nhận được giá trị kép như -20 mà không có đơn vị đo lường nếu bạn
sử dụng phương thức AsDouble ().

Sử dụng phương thức SetValueString () để thay đổi giá trị của một tham số kiểu giá trị thay vì sử dụng phương thức Set (). Mẫu mã sau minh họa cách thay đổi giá
trị tham số bằng phương thức SetValueString ():

Vùng mã 8-5: Sử dụng Parameter.SetValueString ()

public bool SetWithValueString (Tham số tìm thấy Tham số)


{
kết quả bool = false;

if (! foundParameter.IsReadOnly)
{
// Nếu thành công, kết quả là true

result = foundParameter.SetValueString ("- 22 \ '3 \" ");


}
trả về kết quả;

Mối quan hệ tham số


Có các mối quan hệ giữa các Tham số trong đó giá trị của một Tham số có thể ảnh hưởng đến:

• liệu một Thông số khác có thể được đặt hay ở chế độ chỉ đọc

• tham số nào hợp lệ cho phần tử

• giá trị được tính toán của một tham số khác

Ngoài ra, một số tham số luôn ở chế độ chỉ đọc.


Machine Translated by Google

Một số thông số được tính toán trong Revit, chẳng hạn như thông số Chiều dài và Diện tích tường. Các tham số này luôn ở chế độ chỉ đọc vì chúng phụ thuộc vào trạng
thái bên trong của phần tử.

Hình 29: Các thông số tính toán của tường

Trong mẫu mã này, thông số Chiều cao ống cho lỗ mở được điều chỉnh, dẫn đến thông số Chiều cao đầu được tính toán lại:

Vùng mã 8-6: Ví dụ về mối quan hệ tham số

// mở phải là một lỗ mở chẳng hạn như cửa sổ hoặc cửa ra vào


public void ShowParameterRelationship (FamilyInstance open)
{
// lấy thông số Chiều cao ống và Chiều cao đầu ban đầu cho phần mở
Tham số sillPara = opens.get_Parameter (BuiltInParameter.INSTANCE_SILL_HEIGHT_PARAM);
Tham số headPara = opens.get_Parameter (BuiltInParameter.INSTANCE_HEAD_HEIGHT_PARAM);
double sillHeight = sillPara.AsDouble ();
double origHeadHeight = headPara.AsDouble ();

// Chỉ thay đổi Chiều cao đầu ống và lưu ý rằng Chiều cao đầu được tính toán lại
sillPara.Set (sillHeight + 2.0);
double newHeadHeight = headPara.AsDouble ();
MessageBox.Show ("Chiều cao đầu cũ:" + origHeadHeight + "; chiều cao đầu mới:" + newHeadHeight);

Thêm thông số vào phần tử

Trong API Nền tảng Revit, bạn có thể sử dụng tất cả các thông số đã xác định và bạn có thể thêm các thông số tùy chỉnh mà bạn xác định bằng cách sử dụng giao diện
người dùng Revit và API Nền tảng Revit.

Để biết thêm chi tiết, hãy tham khảo Thông số được chia sẻ.

Bộ sưu tập

Hầu hết các thuộc tính và phương thức API Nền tảng Revit sử dụng các lớp thu thập .NET Framework khi cung cấp quyền truy cập vào một nhóm các mục có liên quan.

Các giao diện IEnumerable và IEnumerator được triển khai trong các loại bộ sưu tập Revit được định nghĩa trong không gian tên System.Collection.

Giao diện

Các phần sau đây thảo luận về các loại bộ sưu tập liên quan đến giao diện.

IEnumerable

Giao diện IEnumerable nằm trong không gian tên System.Collections. Nó hiển thị trình điều tra, hỗ trợ một phép lặp đơn giản trên một tập hợp không chung chung. Phương
thức GetEnumerator () nhận một điều tra viên triển khai giao diện này. IEnumerator được trả lại đối tượng được lặp lại trong suốt bộ sưu tập. Phương thức GetEnumerator
() được sử dụng ngầm bởi các vòng lặp foreach trong C #.

IEnumerator

Giao diện IEnumerator nằm trong không gian tên System.Collections. Nó hỗ trợ lặp lại đơn giản trên một tập hợp không chung chung. IEnumerator là giao diện cơ sở cho tất cả
các điều tra viên không chung chung. Câu lệnh foreach trong C # ẩn tính phức tạp của điều tra viên.

Lưu ý Nên sử dụng foreach thay vì thao tác trực tiếp với điều tra viên.

Điều tra viên được sử dụng để đọc dữ liệu thu thập, nhưng chúng không thể được sử dụng để sửa đổi tập hợp cơ bản. Sử dụng IEnumerator như sau:
Machine Translated by Google

• Ban đầu, điều tra viên được định vị trước phần tử đầu tiên trong tập hợp. Tuy nhiên, bạn nên luôn gọi Reset ()
khi bạn có được điều tra viên lần đầu tiên.

o Phương thức Reset () di chuyển điều tra viên trở lại vị trí ban đầu. Tại vị trí này, gọi thuộc tính Hiện tại ném
một ngoại lệ.

o Gọi phương thức MoveNext () để nâng cao trình điều tra đến phần tử đầu tiên của bộ sưu tập trước khi đọc trình lặp hiện tại
giá trị.

• Thuộc tính Hiện tại trả về cùng một đối tượng cho đến khi phương thức MoveNext () hoặc phương thức Reset () được gọi. MoveNext ()
phương thức đặt trình vòng lặp hiện tại thành phần tử tiếp theo.

• Nếu MoveNext đi qua phần cuối của bộ sưu tập, thì điều tra viên sẽ được đặt sau phần tử cuối cùng trong bộ sưu tập và MoveNext
trả về false.

o Khi điều tra viên ở vị trí này, các lệnh gọi tiếp theo tới MoveNext cũng trả về false.

o Nếu lần gọi cuối cùng tới MoveNext trả về false, việc gọi thuộc tính Hiện tại sẽ ném ra một ngoại lệ.

o Để thiết lập lại trình lặp hiện tại thành phần tử đầu tiên trong bộ sưu tập, hãy gọi phương thức Reset () theo sau là MoveNext ().

• Điều tra viên vẫn có giá trị miễn là việc thu thập không thay đổi.

o Nếu các thay đổi được thực hiện đối với tập hợp, chẳng hạn như thêm, sửa đổi hoặc xóa các phần tử, thì điều tra viên sẽ bị vô hiệu và
lệnh gọi tiếp theo tới MoveNext () hoặc phương thức Reset () ném ra một lỗi không hợp lệ.

o Nếu tập hợp được sửa đổi giữa MoveNext và trình vòng lặp hiện tại, thuộc tính Hiện tại sẽ trở về phần tử được chỉ định, ngay cả khi trình điều tra đã bị vô hiệu.

Lưu ý Tất cả các lệnh gọi đến phương thức Reset () phải dẫn đến cùng một trạng thái cho điều tra viên. Cách triển khai ưu tiên là di chuyển điều tra viên đến đầu tập hợp,

trước phần tử đầu tiên. Điều này làm mất hiệu lực của điều tra viên nếu tập hợp được sửa đổi sau khi điều tra viên được tạo, điều này phù hợp với thuộc tính MoveNext () và hiện

tại.

Bộ sưu tập và Trình lặp lại

Trong API nền tảng Revit, Bộ sưu tập và Trình lặp lại là chung và loại an toàn. Ví dụ, ElementSet luôn chứa Element và có thể được sử dụng như sau:

Vùng mã 9-1: Sử dụng ElementSet


1. UIDocument uidoc = new UIDocument (tài liệu); 2. ElementSet
elems = uidoc.Selection.Elements; 3. 4. string info = "Các phần
tử được chọn: \ n"; 5. foreach (Autodesk.Revit.DB.Element elem
trong elem) 6. { 7. 8. } 9.

info + = elem.Name + "\ n";

10. TaskDialog.Show ("Revit", thông tin);


11. 12. info = "Các cấp độ trong tài liệu:
\ n"; 13.

14. FilteredElementCollector collector = new FilteredElementCollector (tài liệu); 15. ICollection


<Element> collection = collector.OfClass (typeof (BoundaryConditions)). ToElements (); 16. foreach (Phần tử trong bộ sưu tập)
17. { 18.

// bạn không cần kiểm tra null cho thông tin


19. elem + = elem.Name + "\ n";
20. }
21.
22. TaskDialog.Show ("Revit", thông tin);

Tất cả các tập hợp triển khai giao diện IEnumerable và tất cả các trình vòng lặp có liên quan triển khai giao diện IEnumerator. Do đó, tất cả các phương pháp và thuộc tính đều được triển
khai trong API Nền tảng Revit và có thể đóng một vai trò nào đó trong các bộ sưu tập có liên quan.
Machine Translated by Google

Thực hiện tất cả các bộ sưu tập là tương tự. Ví dụ sau sử dụng ElementSet và ModelCurveArray để trình bày cách sử dụng các thuộc tính bộ sưu tập chính:

Vùng mã 9-2: Sử dụng bộ sưu tập

1. UIDocument uidoc = new UIDocument (tài liệu);


2. Lựa chọn SelElementSet = uidoc.Selection.Elements; 3. // Lưu trữ
các tham chiếu ModelLine 4. ModelCurveArray lineArray = new
ModelCurveArray (); 5.

6. //… Hoạt động của cửa hàng


7. Autodesk.Revit.DB.ElementId id = new Autodesk.Revit.DB.ElementId (131943); // giả sử 131943 là id phần tử dòng mô hình 8. lineArray.Append
(document.GetElement (id) as ModelLine); 9. 10. // sử dụng thuộc tính Size của Array 11. TaskDialog.Show ("Revit", "Before Insert: 12. 13. // sử dụng thuộc
tính IsEmpty của Array 14. if (! LineArray.IsEmpty) 15. { 16.

"
+ lineArray.Size + "trong lineArray.");

// sử dụng thuộc tính Item (int) của Array


17. ModelCurve modelCurve = lineArray.get_Item (0) as ModelCurve;
18.
19. // xóa phần tử cụ thể khỏi tập hợp phần tử selection.Erase (modelCurve);
20.
21.
22. // tạo một dòng mô hình mới và chèn vào mảng dòng mô hình SketchPlane
23. sketchPlane = modelCurve.SketchPlane;
24.
25. XYZ startPoint = new XYZ (0, 0, 0); // điểm bắt đầu của dòng XYZ endPoint = new XYZ
26. (10, 10, 0); // điểm cuối của dòng // tạo đường hình học Dòng hình họcLine =
27. Line.CreateBound (startPoint, endPoint);
28.
29.
30. // tạo dòng ModelLine
31. ModelLine =
32. document.Create.NewModelCurve (nticryLine, sketchPlane) là ModelLine;
33.
34. lineArray.Insert (line, lineArray.Size - 1);
35. }
36.
"
37. TaskDialog.Show ("Revit", "After Insert: 38. + lineArray.Size + "trong lineArray.");
39. // sử dụng phương thức Clear () để loại bỏ tất
cả các phần tử trong lineArray 40. lineArray.Clear ();

41.
42. TaskDialog.Show ("Revit

Phần tử chỉnh sửa

Trong Revit, bạn có thể di chuyển, sao chép, xoay, căn chỉnh, xóa, nhân bản, nhóm và mảng một phần tử hoặc một tập hợp các phần tử với API Nền tảng Revit.
Sử dụng chức năng chỉnh sửa trong API tương tự như các lệnh trong Revit UI.

Các yếu tố chuyển động

Lớp ElementTransformUtils cung cấp hai phương thức tĩnh để di chuyển một hoặc nhiều phần tử từ nơi này sang nơi khác.

Bảng 19: Phương thức di chuyển

Thành viên Sự mô tả

MoveElement (Tài liệu, ElementId, XYZ) Di chuyển một phần tử trong tài liệu theo một vectơ được chỉ định.

MoveElements (Document, ICollection <ElementId>, XYZ) Di chuyển một số phần tử theo một tập hợp các ID trong tài liệu bằng một vectơ được chỉ định.

Lưu ý Khi bạn sử dụng phương thức MoveElement () hoặc MoveElements (), các quy tắc sau sẽ được áp dụng.

• Các phương thức không thể di chuyển một phần tử dựa trên cấp độ lên hoặc xuống so với cấp độ. Khi phần tử dựa trên mức, bạn không thể thay đổi giá trị
tọa độ Z. Tuy nhiên, bạn có thể đặt phần tử ở bất kỳ vị trí nào trong cùng một cấp. Ngoài ra, một số phần tử dựa trên mức có tham số phiên bản offset
mà bạn có thể sử dụng để di chuyển chúng theo hướng Z.

Ví dụ: nếu bạn tạo một cột mới tại vị trí ban đầu (0, 0, 0) trong Cấp độ 1, rồi di chuyển nó đến vị trí mới (10, 20, 30), cột sẽ được đặt tại vị
trí (10, 20 , 0) thay vì (10, 20, 30).
Machine Translated by Google

Vùng mã 10-1: Sử dụng MoveElement ()

1. public void MoveColumn (tài liệu Autodesk.Revit.DB.Document, cột FamilyInstance) 2. { 3. 4.

// lấy vị trí hiện tại của cột LocationPoint


columnLocation = column.Location as LocationPoint;

5. 6. XYZ oldPlace = columnLocation.Point;

7. 8. // Di chuyển cột đến vị trí mới.


9. XYZ newPlace = new XYZ (10, 20, 30);
10. ElementTransformUtils.MoveElement (tài liệu, column.Id, newPlace);
11.
12. // bây giờ lấy vị trí mới của cột columnLocation
13. = column.Location as LocationPoint; XYZ newActual =
14. columnLocation.Point;
15.
16. string info = "Vị trí Z ban đầu:" "\ n Vị trí + oldPlace.Z +
17. Z mới:" + newActual.Z;
18.
19. TaskDialog.Show ("Revit", thông tin);
20. }

• Khi bạn di chuyển một hoặc nhiều phần tử, các phần tử liên quan sẽ được di chuyển. Ví dụ, nếu một bức tường có cửa sổ bị di chuyển, thì cửa sổ
cũng được di chuyển.

• Các phần tử được ghim không thể di chuyển.

Một cách khác để di chuyển một phần tử trong Revit là sử dụng Vị trí và các đối tượng phái sinh của nó. Trong API Nền tảng Revit, đối tượng Vị trí cung cấp khả năng dịch và xoay các phần tử. Có thêm

thông tin vị trí và kiểm soát bằng cách sử dụng các dẫn xuất của đối tượng Vị trí như LocationPoint hoặc LocationCurve. Nếu phần tử Vị trí được chiếu xuống đối tượng LocationCurve hoặc đối tượng

LocationPoint, hãy di chuyển trực tiếp đường cong hoặc điểm đến một vị trí mới.

Vùng mã 10-2: Di chuyển bằng Vị trí

1. bool MoveUsingLocationCurve (Ứng dụng Autodesk.Revit.ApplicationServices.Application, Tường tường) 2. { 3. 4.

LocationCurve wallLine = wall.Location as LocationCurve; XYZ dịchVec =


new XYZ (10, 20, 0); return (wallLine.Move (dịchVec));

5. 6. }

Khi bạn di chuyển phần tử, hãy lưu ý rằng vectơ (10, 20, 0) không phải là điểm đến mà là phần bù. Hình sau minh họa vị trí tường trước và sau khi di chuyển.

Hình 30: Di chuyển một bức tường bằng LocationCurve

Ngoài ra, bạn có thể sử dụng thuộc tính LocationCurve Curve hoặc thuộc tính LocationPoint Point để di chuyển một phần tử trong Revit.

Sử dụng thuộc tính Curve để di chuyển phần tử hướng theo đường cong đến bất kỳ vị trí cụ thể nào. Nhiều yếu tố được định hướng theo đường cong, chẳng hạn như tường, dầm và nẹp. Cũng sử dụng

thuộc tính để thay đổi kích thước độ dài của phần tử.
Machine Translated by Google

Vùng mã 10-3: Di chuyển bằng Curve

1. void MoveUsingCurveParam (Ứng dụng Autodesk.Revit.ApplicationServices.Application, Tường tường) 2. { 3.

LocationCurve wallLine = wall.Location as LocationCurve; XYZ p1 =


4. XYZ.Zero; XYZ p2 = new XYZ (10, 20, 0); Dòng newWallLine =
5. Line.CreateBound (p1, p2);
6.
7.
số 8.
// Thay đổi dòng tường thành một dòng mới.
wallLine.Curve = newWallLine;
9. 10. }

Bạn cũng có thể lấy hoặc đặt các thuộc tính nối của phần tử dựa trên đường cong với thuộc tính LocationCurve.JoinType.

Sử dụng thuộc tính Điểm LocationPoint để đặt vị trí thực của phần tử.

Vùng mã 10-4: Di chuyển bằng điểm

1. void LocationMove (cột FamilyInstance) 2. { 3. 4.

LocationPoint columnPoint = column.Location as LocationPoint; if (null ! =


columnPoint) {

5. 6. XYZ newLocation = new XYZ (10, 20, 0); // Di


chuyển cột đến vị trí mới columnPoint.Point =
7. 8. newLocation;
9. }

Sao chép các phần tử

Lớp ElementTransformUtils cung cấp một số phương thức tĩnh để sao chép một hoặc nhiều phần tử từ nơi này sang nơi khác, trong cùng một tài liệu hoặc dạng xem, hoặc sang một tài liệu hoặc dạng

xem khác.

Bảng: Phương pháp sao chép

Thành viên Sự mô tả

Sao chép một phần tử và đặt bản sao tại một vị trí được chỉ ra bởi một phép biến đổi
CopyElement (Tài liệu, ElementId, XYZ)
nhất định ..

Sao chép một tập hợp các phần tử và đặt các bản sao tại một vị trí được chỉ định bởi

bản dịch đã cho.


CopyElements (Tài liệu, ICollection <ElementId>, XYZ)

CopyElements (Tài liệu, ICollection <ElementId>, Tài liệu, Chuyển đổi,


Sao chép một tập hợp các phần tử từ tài liệu nguồn sang tài liệu đích.
CopyPasteOptions)

CopyElements (View, ICollection <ElementId>, View, Transform,


Sao chép một tập hợp các phần tử từ chế độ xem nguồn sang chế độ xem đích.
CopyPasteOptions)

Tất cả các phương thức trả về một tập hợp các ElementIds của các phần tử mới được tạo, bao gồm CopyElement (). Bộ sưu tập bao gồm bất kỳ phần tử nào được tạo ra do phụ thuộc.

Phương pháp sao chép từ tài liệu này sang tài liệu khác chỉ có thể được sử dụng để sao chép các phần tử cụ thể không xem. Các bản sao được đặt tại vị trí ban đầu tương ứng của chúng hoặc các

vị trí được chỉ định bởi sự chuyển đổi tùy chọn.

Các phần tử dành riêng cho chế độ xem phải được sao chép bằng phương pháp sao chép từ chế độ xem này sang chế độ xem khác. Phương pháp đó có thể được sử dụng cho cả các phần tử mô hình và

chế độ xem cụ thể, tuy nhiên, các khung nhìn phác thảo không thể được sử dụng làm đích cho các phần tử mô hình. Các phần tử đã dán được định vị lại để đảm bảo vị trí thích hợp trong chế độ

xem đích. Ví dụ, độ cao bị thay đổi khi sao chép từ cấp độ này sang cấp độ khác. Một phép chuyển đổi bổ sung trong dạng xem đích có thể được thực hiện bằng cách cung cấp đối số Biến đổi tùy

chọn. Phép biến đổi bổ sung này phải nằm trong mặt phẳng của khung nhìn đích.

Khi sao chép từ chế độ xem này sang chế độ xem khác, cả chế độ xem nguồn và đích phải là chế độ xem đồ họa 2D có khả năng vẽ chi tiết và các yếu tố dành riêng cho chế độ xem, chẳng hạn

như sơ đồ sàn và trần, độ cao, mặt cắt hoặc chế độ xem phác thảo. Phương thức ElementTransformUtils.GetTransformFromViewToView () sẽ trả về phép biến đổi được áp dụng cho các phần tử

khi sao chép từ chế độ xem nguồn sang chế độ xem đích.
Machine Translated by Google

Khi sao chép giữa các dạng xem hoặc giữa các tài liệu, một tham số CopyPasteOptions tùy chọn có thể được đặt để ghi đè cài đặt sao chép / dán mặc định. Theo mặc định, trong

trường hợp tên loại trùng lặp trong quá trình dán, Revit sẽ hiển thị hộp thoại phương thức với các tùy chọn để sao chép các loại chỉ có tên duy nhất hoặc để hủy thao tác.

CopyPasteOptions có thể được sử dụng để chỉ định một trình xử lý tùy chỉnh, sử dụng giao diện IDuplicateTypeNamesHandler, để xử lý loại trùng lặp
những cái tên.

Xem mẫu Chế độ xem trùng lặp trong Revit SDK để biết ví dụ chi tiết về việc sao chép giữa các tài liệu và giữa các chế độ xem.

Phần tử xoay
Lớp ElementTransformUtils cung cấp hai phương thức tĩnh để xoay một hoặc một số phần tử trong dự án.

Bảng 20: Các phương pháp xoay vòng

Thành viên Sự mô tả

RotateElement (Document, ElementId, Line, double) Xoay một phần tử trong tài liệu theo một số radian được chỉ định xung quanh một trục nhất định.

RotateElements (Document, ICollection <ElementId>, Line, double) Xoay một số phần tử theo ID trong dự án theo một số radian được chỉ định xung quanh một trục

nhất định.

Trong các phương pháp này, góc quay tính bằng radian. Radian dương có nghĩa là quay ngược chiều kim đồng hồ quanh trục xác định, trong khi radian âm có nghĩa là
theo chiều kim đồng hồ, như các hình sau minh họa.

Hình 31: Xoay ngược chiều kim đồng hồ


Machine Translated by Google

Hình 32: Vòng quay theo chiều kim đồng hồ

Lưu ý rằng các phần tử được ghim không thể xoay được.

Vùng mã 10-5: Sử dụng RotateElement ()

1. public void RotateColumn (tài liệu Autodesk.Revit.DB.Document, phần tử Autodesk.Revit.DB.Element) 2. { 3.

XYZ point1 = new XYZ (10, 20, 0); XYZ


4. point2 = new XYZ (10, 20, 30); // Trục phải
5. là một đường giới hạn.
6. Trục đường = Line.CreateBound (point1, point2);
ElementTransformUtils.RotateElement (document, element.Id, axis, Math.PI / 3.0);
7. 8. }

Nếu phần tử Vị trí có thể được đưa xuống LocationCurve hoặc LocationPoint, bạn có thể xoay trực tiếp đường cong hoặc điểm.

Vùng mã 10-6: Xoay vòng dựa trên đường cong vị trí

1. bool LocationRotate (ứng dụng Autodesk.Revit.ApplicationServices.Application, phần tử Autodesk.Revit.DB.Element) 2. { 3.

bool quay = false; // Xoay


4. phần tử qua đường cong vị trí của nó.
5. LocationCurve curve = element.Location as LocationCurve; if (null ! =
curve) {
6. 7.

Curve line = đường cong.Curve;


8. 9. XYZ aa = line.GetEndPoint (0); XYZ cc
10. = new XYZ (aa.X, aa.Y, aa.Z + 10); Trục đường =
11. Line.CreateBound (aa, cc); Rotated = curve.Rotate
12. (axis, Math.PI / 2.0);
13. }
14.
15. quay trở lại xoay vòng;

16. }

Vùng mã 10-7: Xoay vòng dựa trên điểm vị trí

1. bool LocationRotate (ứng dụng Autodesk.Revit.ApplicationServices.Application, phần tử Autodesk.Revit.Element) 2. { 3.

bool quay = false; Vị trí


4. LocationPoint = element.Location as LocationPoint;
5.
6. if (null ! = location) {
7.
số 8. XYZ aa = location.Point; XYZ cc
= new XYZ (aa.X, aa.Y, aa.Z + 10); Trục đường =
9. 10. Line.CreateBound (aa, cc); rotated = location.Rotate
11. (axis, Math.PI / 2.0);
12. }
13.
14. quay trở lại xoay vòng;
Machine Translated by Google
Machine Translated by Google

Các yếu tố căn chỉnh

Phương thức ItemFactoryBase.NewAlignment () có thể tạo một liên kết bị khóa mới giữa hai tham chiếu. Hai tham chiếu này phải là một trong những nội dung sau
kết hợp:

• 2 mặt phẳng

• 2 dòng

• đường thẳng và điểm

• đường thẳng và mặt phẳng tham chiếu

• 2 vòng cung

• 2 mặt hình trụ

Các tham chiếu này phải được căn chỉnh về mặt hình học vì chức năng này sẽ không buộc chúng phải được căn chỉnh. Nếu căn chỉnh có thể được tạo, một đối tượng

Thứ nguyên mới sẽ được trả về đại diện cho căn chỉnh bị khóa. Nếu không, một ngoại lệ sẽ được ném ra.

Phương thức NewAlignment () cũng yêu cầu một dạng xem sẽ xác định hướng của căn chỉnh.

Xem ví dụ CreateTruss trong thư mục FamilyCreation đi kèm với Mẫu SDK. Nó có một số ví dụ về việc sử dụng NewAlignment (), chẳng hạn như khóa hợp âm dưới cùng của giàn

mới với mặt phẳng tham chiếu dưới cùng.

Các yếu tố phản chiếu

Lớp ElementTransformUtils cung cấp hai phương thức tĩnh để phản chiếu một hoặc nhiều phần tử trong dự án.

Bảng 21: Phương pháp phản chiếu

Thành viên Sự mô tả

MirrorElement (Document, ElementId, Plane) Phản chiếu một phần tử về một mặt phẳng hình học.

MirrorElements (Document, ICollection <ElementId>, Plane) Phản chiếu một số phần tử về một mặt phẳng hình học.

Sau khi thực hiện thao tác nhân bản, bạn có thể truy cập các phần tử mới từ Bộ phần tử lựa chọn.

ElementTransformUtils.CanMirrorElement () và ElementTransformUtils.CanMirrorElements () có thể được sử dụng để xác định xem một hoặc nhiều phần tử có thể được sao chép trước khi
cố gắng sao chép một phần tử.

Đoạn mã sau đây minh họa cách phản chiếu một bức tường bằng cách sử dụng một mặt phẳng được tính toán dựa trên một mặt bên của bức tường.

Vùng mã 10-8: Phản chiếu một bức tường

1. public void MirrorWall (tài liệu Autodesk.Revit.DB.Document, Tường tường) 2. { 3.

Tham chiếu tham chiếu = HostObjectUtils.GetSideFaces (wall, ShellLayerType.Exterior) .First ();


4.
5. // lấy một trong các mặt bên chính của bức tường Face
6. face = wall.GetGeometryObjectFromReference (tham chiếu) là Face;
7.
số 8.
UV bboxMin = face.GetBidingBox (). Min; // tạo một
mặt phẳng dựa trên mặt bên này với độ lệch 10 theo hướng X & Y
9. 10.
11. Plane plane = new Plane (face.ComputeNormal (bboxMin), face.Evaluate
12. (bboxMin) .Add (new XYZ (10, 10, 0)));
13.
14. ElementTransformUtils.MirrorElement (tài liệu, tường.Id, mặt phẳng);
15. }

Mỗi FamilyInstance đều có thuộc tính Mirrored. Nó cho biết liệu FamilyInstance (ví dụ một cột) có được sao chép hay không.
Machine Translated by Google

Nhóm các yếu tố


API nền tảng Revit sử dụng phương thức Creation.Document.NewGroup () để chọn một phần tử hoặc nhiều phần tử hoặc nhóm rồi kết hợp chúng. Với mỗi phiên bản của một nhóm mà
bạn đặt, có sự liên kết giữa chúng với nhau. Ví dụ: bạn tạo một nhóm với giường, tường và cửa sổ, sau đó đặt nhiều phiên bản của nhóm vào dự án của bạn. Nếu bạn sửa đổi
tường trong một nhóm, nó sẽ thay đổi đối với tất cả các trường hợp của nhóm đó. Điều này làm cho việc sửa đổi mô hình tòa nhà của bạn dễ dàng hơn nhiều vì bạn có thể thay đổi
một số trường hợp của một nhóm trong một thao tác.

Vùng mã 10-9: Tạo nhóm


1. Nhóm nhóm = null; 2.
UIDocument uidoc = new UIDocument (tài liệu); 3. Lựa chọn
ElementSet = uidoc.Selection.Elements; 4. if (lựa chọn. Kích thước>
0) 5. {

6. // Nhóm tất cả các phần tử đã chọn


group = document.Create.NewGroup (uidoc.Selection.GetElementIds ());
7. 8. }

Ban đầu, nhóm có tên chung, chẳng hạn như Nhóm 1. Có thể sửa đổi tên này bằng cách thay đổi tên của loại nhóm như sau:

Vùng mã 10-10: Đặt tên nhóm


1. // Thay đổi tên nhóm mặc định thành tên mới "MyGroup" 2. group.GroupType.Name
= "MyGroup";

Có ba loại nhóm trong Revit; Nhóm mô hình, Nhóm chi tiết và Nhóm chi tiết đính kèm. Tất cả đều được tạo bằng phương thức NewGroup (). Loại của Nhóm được tạo phụ thuộc
vào các Phần tử được truyền vào.

• Nếu không có Phần tử chi tiết nào được chuyển, Nhóm Mô hình sẽ được tạo.

• Nếu tất cả các Phần tử là các phần tử chi tiết, thì một Nhóm chi tiết sẽ được tạo.

• Nếu cả hai loại Phần tử được bao gồm, một Nhóm mô hình có chứa Nhóm chi tiết đính kèm sẽ được tạo và trả về.
Lưu ý Khi các phần tử được nhóm lại, chúng có thể bị xóa khỏi dự án.

• Khi một phần tử mô hình trong nhóm mô hình bị xóa, nó vẫn hiển thị khi con trỏ chuột di chuột qua hoặc nhấp vào nhóm, ngay cả khi ứng dụng trả về Giao diện người dùng
thành công. Trên thực tế, phần tử mô hình bị xóa và bạn không thể chọn hoặc truy cập phần tử đó.

• Khi thành viên cuối cùng của một cá thể nhóm bị xóa, bị loại trừ hoặc bị loại bỏ khỏi dự án, cá thể nhóm mô hình sẽ bị xóa.

Khi các phần tử được nhóm lại, chúng không thể được di chuyển hoặc xoay. Nếu bạn thực hiện các thao tác này trên các phần tử được nhóm, không có gì xảy ra với các phần tử, mặc
dù phương thức Move () hoặc Rotate () trả về true.

Bạn không thể nhóm các thứ nguyên và thẻ mà không nhóm các phần tử mà chúng tham chiếu. Nếu bạn làm vậy, lệnh gọi API sẽ không thành công.

Bạn có thể nhóm các thứ nguyên và thẻ tham chiếu đến các phần tử mô hình trong một nhóm mô hình. Kích thước và thẻ được thêm vào một nhóm chi tiết đính kèm. Nhóm chi tiết đính
kèm không thể được di chuyển, sao chép, xoay, phân mảng hoặc nhân bản mà không thực hiện tương tự với nhóm mẹ.

Tạo mảng các phần tử


API nền tảng Revit cung cấp hai lớp, LinearArray và RadialArray để tạo mảng một hoặc nhiều phần tử trong dự án. Các lớp này cung cấp các phương thức tĩnh để tạo một mảng
tuyến tính hoặc xuyên tâm của một hoặc nhiều thành phần được chọn. Mảng tuyến tính đại diện cho một mảng được tạo dọc theo một đường từ một điểm, trong khi mảng xuyên tâm đại
diện cho một mảng được tạo dọc theo một cung.

Ví dụ về việc sử dụng một mảng, bạn có thể chọn một cửa ra vào và các cửa sổ nằm trong cùng một bức tường, sau đó tạo nhiều phiên bản của cấu hình cửa, tường và cửa sổ.

Cả LinearArray và RadialArray cũng cung cấp các phương thức để mảng một hoặc một số phần tử mà không cần được nhóm và liên kết. Mặc dù tương tự như các phương thức Create
() để sắp xếp các phần tử, mỗi phần tử kết quả là độc lập với các phần tử khác và có thể được thao tác mà không ảnh hưởng đến các phần tử khác. Xem bảng bên dưới để biết thêm
thông tin về các phương pháp có sẵn để tạo mảng tuyến tính hoặc mảng xuyên tâm.
Machine Translated by Google

Bảng 22: Phương thức LinearArray

Thành viên Sự mô tả

Tạo (Document, View, ElementId, int, XYZ, ArrayAnchorMember) Mảng một phần tử trong dự án theo một số cụ thể.

Tạo (Document, View, ICollection <ElementId>, int, XYZ, ArrayAnchorMember) Mảng một tập hợp các phần tử trong dự án theo một số xác định.

ArrayElementWithoutAssosystem (Document, View, ElementId, int, XYZ, Mảng một phần tử trong dự án theo một số cụ thể. Các phần tử kết quả

ArrayAnchorMember) không được liên kết với một mảng tuyến tính.

ArrayElementsWithoutAssinity (Document, View, ICollection <ElementId>, int, Mảng một tập hợp các phần tử trong dự án theo một số xác định. Các phần tử

XYZ, ArrayAnchorMember) kết quả không được liên kết với một mảng tuyến tính.

Bảng 23: Phương thức RadialArray

Thành viên Sự mô tả

Tạo (Document, View, ElementId, int, Line, double, ArrayAnchorMember) Mảng một phần tử trong dự án dựa trên trục xoay đầu vào.

Tạo (Document, View, ICollection <ElementId>, int, Line, double, Mảng một tập hợp các phần tử trong dự án dựa trên một trục xoay đầu vào.

ArrayAnchorMember)

ArrayElementWithoutAssosystem (Document, View, ElementId, int, Line, double, Mảng một phần tử trong dự án dựa trên trục xoay đầu vào .. Các phần tử

ArrayAnchorMember) kết quả không được liên kết với một mảng tuyến tính.

ArrayElementsWithoutAssinity (Document, View, ICollection <ElementId>, int, Mảng một tập hợp các phần tử trong dự án dựa trên trục xoay đầu vào ..

Dòng, đôi, ArrayAnchorMember) Các phần tử kết quả không được liên kết với một mảng tuyến tính.

Các phương pháp sắp xếp các phần tử rất hữu ích nếu bạn cần tạo một số thể hiện của một thành phần và thao tác chúng đồng thời.
Mọi cá thể trong một mảng có thể là thành viên của một nhóm.

Lưu ý Khi sử dụng các phương pháp để sắp xếp các phần tử, các quy tắc sau sẽ được áp dụng:

• Khi thực hiện các phép toán Mảng tuyến tính và Mảng hướng tâm, các phần tử phụ thuộc vào các phần tử được mảng cũng được phân mảng.

• Một số phần tử không thể được phân chia thành mảng vì chúng không thể được nhóm lại. Xem Hướng dẫn sử dụng Revit để biết thêm thông tin về
hạn chế đối với nhóm và mảng.

• Mảng không được hỗ trợ bởi hầu hết các ký hiệu chú thích.

Xóa các phần tử


API Nền tảng Revit cung cấp các phương thức Delete () để xóa một hoặc nhiều phần tử trong dự án.

Bảng 23: Xóa thành viên

Thành viên Sự mô tả

Xóa (ElementId) Xóa một phần tử khỏi dự án bằng cách sử dụng ID phần tử

Xóa (ICollection <ElementId>) Xóa một số yếu tố khỏi dự án theo ID của chúng.
Machine Translated by Google

Phương pháp đầu tiên xóa một phần tử duy nhất dựa trên Id của nó, như được hiển thị trong ví dụ bên dưới.

Vùng mã: Xóa một phần tử dựa trên ElementId

1. private void DeleteElement (tài liệu Autodesk.Revit.DB.Document, phần tử Element) 2. { 3.

// Xóa một phần tử thông qua id của nó


4. Autodesk.Revit.DB.ElementId elementId = element.Id; ICollection
5. <Autodesk.Revit.DB.ElementId> deleteIdSet = document.Delete (elementId);
6.
7. if (0 == deleteIdSet.Count) {
số 8.

9. ném ngoại lệ mới ("Không xóa được phần tử đã chọn trong Revit.");
10. }
11.
12. String prompt = "Phần tử được chọn đã bị xóa và "; nhắc + = deleteIdSet.Count
13. - 1; nhiều phần tử phụ thuộc hơn cũng đã bị loại bỏ. "; prompt + =
"
14.
15.
16. // Cung cấp cho người dùng một số thông
17. tin TaskDialog.Show ("Revit", prompt);
18. }

Lưu ýKhi một phần tử bị xóa, bất kỳ phần tử con nào được liên kết với phần tử đó cũng bị xóa, như được chỉ ra trong mẫu ở trên.

API cũng cung cấp một cách để xóa một số phần tử.

Vùng mã: Xóa nhiều phần tử dựa trên Id

1. // Xóa tất cả các phần tử đã chọn thông qua tập hợp các id phần tử.
2. ICollection <Autodesk.Revit.DB.ElementId> idSelection = null ; 3. UIDocument
uidoc = new UIDocument (tài liệu); 4. foreach (Autodesk.Revit.DB.Element elem
trong uidoc.Selection.Elements) 5. {

6. Autodesk.Revit.DB.ElementId id = elem.Id;
idSelection.Add (id);
7.
8. } 9.
10. ICollection <Autodesk.Revit.DB.ElementId> deleteIdSet = document.Delete (idSelection); 11. 12. if (0 ==
deleteIdSet.Count) 13. { 14. 15. } 16.

ném ngoại lệ mới ("Không xóa được các phần tử đã chọn trong Revit.");

17. TaskDialog.Show ("Revit", "Phần tử được chọn đã bị xóa.");

Lưu ý Sau khi bạn xóa các phần tử, bất kỳ tham chiếu nào đến các phần tử đã xóa sẽ trở nên không hợp lệ và ném ra một ngoại lệ nếu chúng được truy cập.

Các phần tử được ghim

Các phần tử có thể được ghim để ngăn chúng di chuyển. Thuộc tính Element.Pinned có thể được sử dụng để kiểm tra xem một Phần tử được ghim hay để ghim hoặc bỏ ghim

một phần tử.

Khi Element.Pinned được đặt thành true, không thể di chuyển hoặc xoay phần tử.

Lượt xem

Chế độ xem là hình ảnh được tạo ra từ mô hình Revit với quyền truy cập đặc quyền vào dữ liệu được lưu trữ trong tài liệu. Chúng có thể là đồ họa, chẳng hạn như
kế hoạch hoặc văn bản, chẳng hạn như lịch trình. Mỗi tài liệu dự án có một hoặc nhiều dạng xem khác nhau. Cửa sổ tập trung cuối cùng là chế độ xem đang hoạt động.

Lớp Autodesk.Revit.DB.View là lớp cơ sở cho tất cả các kiểu xem trong tài liệu Revit. Lớp Autodesk.Revit.UI.UIView đại diện cho dạng xem cửa sổ trong giao diện người
dùng Revit.

Trong các phần tiếp theo, bạn tìm hiểu cách tạo các khung nhìn, các loại khung nhìn được Revit hỗ trợ, các tính năng cho mỗi chế độ xem, cũng như chức năng có sẵn
cho các cửa sổ chế độ xem trong giao diện người dùng.
Machine Translated by Google

Về lượt xem

Phần này là tổng quan cấp cao thảo luận về những điều sau:

• Cách tạo lượt xem

• Xem các loại

• Thiết lập hiển thị

• Chế độ xem tạm thời

• Khả năng hiển thị phần tử

• Tạo và xóa các dạng xem.


Xem quy trình

Hình sau minh họa cách tạo một dạng xem.

Hình 94: Tạo quy trình xem

Mỗi khung nhìn được tạo ra bằng cách chiếu một vật thể ba chiều lên một mặt phẳng hình chiếu hai chiều. Phép chiếu được chia thành hai lớp cơ bản:

• Luật xa gần

• Song song

Sau khi loại hình chiếu được xác định, bạn phải chỉ định các điều kiện mà theo đó mô hình 3D là cần thiết và cảnh sẽ được hiển thị. Để biết thêm
thông tin về phép chiếu, hãy tham khảo View3D tiết diện.

Các tọa độ trên thế giới bao gồm các điểm sau:

• Vị trí mắt của người xem

• Vị trí mặt phẳng quan sát nơi hình chiếu được hiển thị.

Revit sử dụng hai hệ tọa độ:

• Tọa độ toàn cầu hoặc không gian mô hình nơi tòa nhà tồn tại

• Hệ tọa độ quan sát.

Hệ tọa độ quan sát biểu thị cách mô hình được trình bày trong tầm nhìn của người quan sát. Điểm gốc của nó là vị trí mắt của người xem có tọa độ trong
không gian mô hình được truy xuất bởi thuộc tính View.Origin. Các trục X, Y và Z được đại diện bởi các thuộc tính View.RightDirection, View.UpDirection và
View.ViewDirection tương ứng.

• View.RightDirection hướng về phía bên phải của màn hình.

• View.UpDirection về phía trên của màn hình.

• View.ViewDirection từ màn hình đến trình xem.

Hệ thống tọa độ xem là thuận tay phải. Để biết thêm thông tin, hãy xem hình ảnh Phép chiếu Phối cảnh và hình chiếu song song trong View3D.
Machine Translated by Google

Một số phần của không gian mô hình 3D không hiển thị, chẳng hạn như phần ở phía sau người xem hoặc quá xa để hiển thị rõ ràng, sẽ bị loại trừ trước khi được
chiếu lên mặt phẳng chiếu. Hành động này yêu cầu cắt chế độ xem. Các quy tắc sau áp dụng cho việc cắt xén:

• Các phần tử bên ngoài vùng cắt không còn trong chế độ xem.

• Phương thức View.GetCropRegionShapeManager trả về một ViewCropRegionShapeManager cung cấp thông tin ranh giới cho
vùng cây trồng, có thể có hoặc không có hình chữ nhật.

• Thuộc tính View.CropBoxVosystem xác định xem hộp cắt có hiển thị trong dạng xem hay không.

• Thuộc tính View.CropBoxActive xác định xem hộp cắt có thực sự được sử dụng để cắt chế độ xem hay không.

Sau khi cắt, mô hình được chiếu lên mặt phẳng chiếu. Các quy tắc sau áp dụng cho phép chiếu:

• Nội dung chiếu được ánh xạ tới cổng xem màn hình để hiển thị.

• Trong quá trình lập bản đồ, nội dung chiếu được chia tỷ lệ để chúng được hiển thị chính xác trên màn hình.

• Thuộc tính View.Scale là tỷ lệ giữa kích thước mô hình thực tế với kích thước khung nhìn.

• Ranh giới xem trên giấy là vùng cắt, là hình chiếu của hình cắt trên mặt phẳng hình chiếu.

• Kích thước và vị trí của vùng cắt được xác định bởi thuộc tính View.OutLine.

Thiết lập hiển thị


Lớp chế độ xem có các thuộc tính để lấy và đặt cài đặt kiểu hiển thị và cài đặt mức chi tiết. Thuộc tính View.DisplayStyle sử dụng kiểu liệt kê DisplayStyle và
tương ứng với các tùy chọn hiển thị có sẵn ở cuối cửa sổ Revit như hình dưới đây.

Bởi vì việc đặt kiểu hiển thị của chế độ xem thành raytrace đi vào chế độ hạn chế đặc biệt với các khả năng hạn chế, nên không được phép chỉ định trực tiếp
kiểu hiển thị cho giá trị này.

Thuộc tính View.DetailLevel sử dụng kiểu liệt kê ViewDetailLevel và tương ứng với các tùy chọn mức chi tiết có sẵn ở cuối cửa sổ Revit như được hiển thị bên
dưới.

Liệt kê ViewDetailLevel bao gồm Không xác định trong trường hợp Chế độ xem đã cho không sử dụng mức chi tiết.
Machine Translated by Google

Chế độ xem tạm thời

Lớp View cho phép kiểm soát các chế độ xem tạm thời. Phương thức View.EnableRevealHiddenMode () bật chế độ hiển thị các phần tử ẩn cho chế độ xem.
View.EnableTemporaryAnalyticalDisplayMode () chỉ cho phép hiển thị tạm thời các danh mục Mô hình phân tích.
Và View.DisableTemporaryViewMode () sẽ tắt chế độ xem tạm thời được chỉ định. Phương thức DisableTemporaryViewMode () nhận một enum TemporaryViewMode. Các tùy chọn khả
thi được hiển thị bên dưới.

Tên thành viên Sự mô tả

RevealHiddenElements Chế độ tiết lộ các yếu tố ẩn

TemporaryHideIsolate Chế độ ẩn / cô lập tạm thời

WorksharingDisplay Một trong những chế độ hiển thị chia sẻ công việc

AnalyticalModel Chế độ cô lập mô hình phân tích

Rayrace Chế độ hiển thị mô hình trong raytracing tương tác

Phương thức View.IsInTemporaryViewMode có thể được sử dụng để xác định xem chế độ xem hiện đang ở trong Chế độ xem tạm thời được chỉ định hay không.

Phần tử hiển thị trong một chế độ xem

Chế độ xem theo dõi các yếu tố hiển thị. Tất cả các phần tử có dạng đồ họa và hiển thị trong dạng xem có thể được truy xuất bằng cách sử dụng FilteredElementCollector được
tạo bằng tài liệu và id của dạng xem. Tuy nhiên, một số phần tử trong tập hợp có thể bị ẩn hoặc bị che bởi các phần tử khác. Bạn có thể nhìn thấy chúng bằng cách xoay chế
độ xem hoặc loại bỏ các phần tử che chúng. Việc truy cập các phần tử hiển thị này có thể yêu cầu Revit xây dựng lại hình dạng của khung nhìn. Lần đầu tiên mã của bạn sử
dụng hàm tạo này cho một chế độ xem nhất định hoặc lần đầu tiên mã của bạn sử dụng hàm tạo này cho một chế độ xem có cài đặt hiển thị vừa được thay đổi, bạn có thể bị giảm
hiệu suất đáng kể.

Các phần tử được hiển thị hoặc ẩn trong chế độ xem theo danh mục.

• Phương thức View.GetVisiblility () truy vấn một danh mục để xác định xem nó có thể nhìn thấy hay không nhìn thấy trong khung nhìn.

• Phương thức View.SetVisibility () đặt tất cả các phần tử trong một danh mục cụ thể thành hiển thị hoặc không nhìn thấy.

FilteredElementCollector dựa trên một dạng xem sẽ chỉ chứa các phần tử hiển thị trong dạng xem hiện tại. Bạn không thể truy xuất các phần tử không
đồ họa hoặc các yếu tố không nhìn thấy được. FilteredElementCollector dựa trên một tài liệu sẽ truy xuất tất cả các phần tử trong tài liệu bao gồm các phần tử vô hình
và các phần tử phi đồ họa. Ví dụ: khi tạo chế độ xem 3D mặc định trong một dự án trống, không có phần tử nào trong chế độ xem nhưng có nhiều phần tử trong tài liệu, tất
cả đều ẩn.

Mẫu mã sau đây đếm số lượng phần tử danh mục tường trong tài liệu hiện hoạt và chế độ xem hiện hoạt. Số phần tử trong chế độ xem hiện hoạt khác với số phần tử trong tài
liệu vì tài liệu chứa các phần tử danh mục tường không phải đồ họa.

Vùng mã: Đếm các phần tử trong chế độ xem hiện hoạt

1. private void CountElements (tài liệu Autodesk.Revit.DB.Document) 2. {

3. Thông báo StringBuilder = new StringBuilder ();


4. FilteredElementCollector viewCollector = new
5. FilteredElementCollector (tài liệu, tài liệu.ActiveView.Id);
6. viewCollector.OfCategory (BuiltInCategory.OST_Walls); message.AppendLine
(" Phần tử danh mục tường trong Chế độ xem đang hoạt động:" + viewCollector.ToElementIds
7. 8. (). Count);

9. 10. FilteredElementCollector docCollector = new FilteredElementCollector (tài liệu); docCollector.OfCategory


11. (BuiltInCategory.OST_Walls); message.AppendLine (" Phần tử danh mục tường trong tài liệu:" +
12. docCollector.ToElementIds (). Count);
13.
14.
15. TaskDialog.Show ("Revit", message.ToString ());
16. }

Chế độ xem tạm thời có thể ảnh hưởng đến khả năng hiển thị của phần tử. Phương thức View.IsInTemporaryViewMode () có thể được sử dụng để xác định xem một Chế độ xem có
ở chế độ xem tạm thời hay không. Phương thức View.IsElementVosystemInTemporaryViewMode () xác định xem một phần tử có nên hiển thị trong chế độ xem được chỉ định hay
không. Điều này chỉ áp dụng cho chế độ xem TemporaryHideIsolate và AnalyticalModel. Các chế độ khác sẽ dẫn đến một ngoại lệ.

Tạo và xóa chế độ xem


Machine Translated by Google

API Nền tảng Revit cung cấp nhiều phương pháp để tạo các phần tử chế độ xem tương ứng có nguồn gốc từ lớp Autodesk.Revit.DB.View.
Hầu hết các kiểu xem được tạo bằng cách sử dụng các phương thức tĩnh của các lớp chế độ xem dẫn xuất. Nếu một dạng xem được tạo thành công, các phương thức
này trả về một tham chiếu đến dạng xem, nếu không chúng sẽ trả về null. Các phương thức được mô tả trong các phần sau cụ thể cho từng lớp chế độ xem.

Các khung nhìn cũng có thể được tạo bằng phương thức View.Duplicate (). Chế độ xem mới có thể được tạo từ chế độ xem hiện có với các tùy chọn cho chế độ xem
mới phụ thuộc hoặc có chi tiết.

Xóa một dạng xem bằng cách sử dụng phương pháp Document.Delete với ID dạng xem. Bạn cũng có thể xóa các phần tử được liên kết với một dạng xem. Ví dụ: việc xóa
phần tử mức khiến Revit xóa hình chiếu bằng tương ứng hoặc xóa phần tử máy ảnh khiến Revit xóa chế độ xem 3D tương ứng.

Xem các loại

Các loại khung nhìn Revit khác nhau được đại diện bởi các lớp khác nhau trong API Revit. Xem các chủ đề sau để biết thêm thông tin về từng loại chế độ xem.

Tổng quan

Một mô hình dự án có thể có một số kiểu xem. Hình sau minh họa các kiểu xem khác nhau trong trình duyệt Dự án.

Hình 95: Các khung nhìn khác nhau trong trình duyệt Dự án

Trong API, có ba cách để phân loại các chế độ xem. Cách đầu tiên là sử dụng thuộc tính View.ViewType của phần tử chế độ xem. Nó trả về một giá trị được liệt kê cho

biết kiểu xem. Bảng sau liệt kê tất cả các kiểu xem có sẵn.
Machine Translated by Google

Bảng 44: Autodesk.Revit.DB.ViewType

Tên thành viên Sự mô tả

AreaPlan Xem khu vực.

CeilingPlan Mặt bằng phản chiếu mặt bằng trần.

Chế độ xem lịch biểu ColumnSchedule Coulmn.

CostReport Xem báo cáo chi phí.

Chi tiết Góc nhìn chi tiết.

DraftingView Chế độ xem soạn thảo.

DrawingSheet Chế độ xem bản vẽ.

Độ cao Xem độ cao.

EngineeringPlan Chế độ xem kỹ thuật.

Kế hoạch sàn Hình chiếu mặt bằng.

Nội bộ Chế độ xem bên trong của Revit.

Truyền thuyết Chế độ xem chú giải.

Tải trọng Chế độ xem báo cáo tải trọng.

PanelSchedule Bảng điều khiển lịch trình xem.

Chế độ xem Báo cáo tổn thất áp suất PressureLossReport.

Kết xuất Chế độ xem kết xuất.

Báo cáo Chế độ xem báo cáo.

Lịch trình Lịch trình xem.

Tiết diện Hình chiếu cắt ngang.

ThreeD Chế độ xem 3-D.

Chưa xác định Chế độ xem không xác định / không xác định.

Hướng dẫn Chế độ xem hướng dẫn.

Cách thứ hai để phân loại các khung nhìn là theo loại lớp.

Bảng sau liệt kê các kiểu xem và các dạng xem tương ứng trong trình duyệt Dự án.
Machine Translated by Google

Bảng 45: Lượt xem trình duyệt dự án

Chế độ xem trình duyệt dự án Dạng xem Loại lớp

Kế hoạch khu vực ViewType.AreaPlan Elements.ViewPlan

Kế hoạch trần nhà ViewType.CeilingPlan Elements.ViewPlan

Lịch biểu cột đồ họa ViewType.ColumnSchedule Elements.View

Xem chi tiết ViewType.Detail Elements.ViewSection

Soạn thảo Chế độ xem ViewType.DraftingView Elements.ViewDrafting

Trang tính ViewType.DrawingSheet Elements.ViewSheet

Độ cao ViewType.Elevation Elements.ViewSection

Kế hoạch kết cấu (Revit Structure) ViewType.EngineeringPlan Elements.ViewPlan

Sơ đồ tầng ViewType.FloorPlan Elements.ViewPlan

Huyền thoại ViewType.Legend Elements.View

Báo cáo (Revit MEP) ViewType.LoadsReport Elements.View

Báo cáo (Revit MEP) ViewType.PanelSchedule Elements.PanelScheduleView

Báo cáo (Revit MEP) ViewType.PresureLossReport Elements.View

Kết xuất ViewType.Rendering Elements.ViewDrafting

Báo cáo ViewType.Report Elements.View

Lịch trình / Số lượng ViewType.Schedule Elements.ViewSchedule

Phần ViewType.Section Elements.ViewSection

Chế độ xem 3D ViewType.ThreeD Elements.View3D

Hướng dẫn ViewType.Walkthrough Elements.View3D

Ví dụ này cho thấy cách sử dụng thuộc tính ViewType của một dạng xem để xác định kiểu của dạng xem.
Machine Translated by Google

Vùng mã: Xác định kiểu xem


1. public void GetViewType (Autodesk.Revit.DB.View view) 2. { 3.

// Lấy kiểu xem của dạng xem đã cho và định dạng chuỗi lời nhắc
4. String prompt = "Chế độ xem là ";
5.
6. switch (view.ViewType) {
7.

case ViewType.AreaPlan: prompt


8. 9. + = "một chế độ xem khu vực.";
10. phá vỡ; case ViewType.CeilingPlan:
11. prompt + = "chế độ xem mặt bằng trần
12. phản chiếu."; phá vỡ; case ViewType.ColumnSchedule:
13. prompt + = "một dạng xem lịch biểu cột."; phá vỡ; case
14. ViewType.CostReport: prompt + = "một chế độ xem báo cáo chi
15. phí."; phá vỡ; case ViewType.Detail: prompt + = "một
16. dạng xem chi tiết."; phá vỡ; case ViewType.DraftingView:
17.
18.
19.
20.
21.
22.
23.
24. prompt + = "một dạng xem soạn thảo.";
25. phá vỡ; case ViewType.DrawingSheet:
26. prompt + = "một dạng xem trang bản vẽ."; phá
27. vỡ; case ViewType.Elevation: prompt + = "một
28. chế độ xem độ cao."; phá vỡ; case
29. ViewType.EngineeringPlan:
30.
31.
32.
33. prompt + = "một chế độ xem kỹ thuật."; phá
34. vỡ; case ViewType.FloorPlan: prompt + = "sơ
35. đồ mặt bằng."; phá vỡ; // ... default: break;
36.
37.
38.
39.
40.
41. }
42. // Cung cấp cho người dùng một số thông tin
43. MessageBox.Show (prompt, "Revit", MessageBoxButtons.OK);
44. }

Cách thứ ba để phân loại các khung nhìn là sử dụng lớp ViewFamilyType. Hầu hết các phương pháp tạo chế độ xem đều yêu cầu Id của ViewFamilyType cho
chế độ xem mới. Id của ViewFamilyType có thể được truy xuất từ phương thức View.GetTypeId (). Thuộc tính ViewFamilyType.ViewFamily trả về một kiểu
liệt kê ViewFamily chỉ định họ của ViewFamilyType và tương tự như enum ViewType đã nêu ở trên. Ví dụ sau đây cho thấy cách lấy ViewFamily từ một
View.

Vùng mã: Xác định kiểu xem từ ViewFamilyType


1. public ViewFamily GetViewFamily (Doc tài liệu, View view) 2. { 3. 4.

ViewFamily viewFamily = ViewFamily.Invalid;

ElementId viewTypeId = view.GetTypeId (); if


5. 6. (viewTypeId.IntegerValue> 1) // một số chế độ xem có thể không có ViewFamilyType {

7. 8. ViewFamilyType viewFamilyType = doc.GetElement (viewTypeId) as ViewFamilyType; viewFamily =


viewFamilyType.ViewFamily;
9. 10. }
11.
12. trả về viewFamily;
Machine Translated by Google

View3D
View3D là một chế độ xem ba chiều được định hướng tự do. Có hai loại chế độ xem 3D, phối cảnh và isometric, còn được gọi là orthographic trong
giao diện người dùng Revit. Sự khác biệt dựa trên quan hệ tia chiếu. Thuộc tính View3D.IsPerspective cho biết chế độ xem 3D là phối cảnh hay isometric.

Chế độ xem phối cảnh

Hình ảnh sau đây minh họa cách tạo một chế độ xem phối cảnh.

Hình 96: Hình chiếu phối cảnh

• Các tia chiếu thẳng đi qua từng điểm trong mô hình và cắt mặt phẳng hình chiếu để tạo thành nội dung hình chiếu.

• Để tạo điều kiện thuận lợi cho việc chuyển đổi từ tọa độ thế giới lên mặt phẳng xem, hệ tọa độ xem dựa trên người xem.

• Nguồn gốc của nó, được đại diện bởi thuộc tính View.Origin, là vị trí của người xem.

• Tọa độ thế giới của người xem được truy xuất bằng cách sử dụng thuộc tính ViewOrientation3D.EyePosition (truy xuất từ
View3D.GetOrientation ()). Do đó, trong các chế độ xem 3D, View.Origin luôn bằng ViewOrientation3D.EyePosition tương ứng.

• Như đã mô tả, hệ tọa độ quan sát được xác định như sau:

o Trục X được xác định bởi View.RightDirection.

o Trục Y được xác định bởi View.UpDirection.

o Trục Z được xác định bởi View.ViewDirection.

• Hướng xem là từ điểm đích đến người xem trong không gian 3D và từ màn hình đến người xem trong không gian màn hình.

Phương thức tĩnh Phương thức View3D.CreatePerspective () có thể được sử dụng để tạo các khung nhìn phối cảnh mới.

Vùng mã: View3D.CreatePerspective ()


1. công khai tĩnh View3D View3D.CreatePerspective (Tài liệu tài liệu, ElementId viewFamilyTypeId;

Tham số viewFamilyTypeId cần phải là một ViewType ba chiều.

Mẫu mã sau minh họa cách tạo chế độ xem 3D phối cảnh.
Machine Translated by Google

Vùng mã: Tạo chế độ xem Phối cảnh 3D

1. // Tìm kiểu xem 3D 2.


IEnumerable <ViewFamilyType> viewFamilyTypes = from elem trong new FilteredElementCollector (document) .OfClass (typeof (ViewFamilyType)) let type = elem as ViewFamilyType 3. 4.
where type.ViewFamily == ViewFamily .Loại chọn .reeDimensional;

5. 6.

7. // Tạo một phối cảnh mới View3D 8. View3D


view3D = View3D.CreatePerspective (document, viewFamilyTypes.First (). Id); 9. if (null ! = View3D) 10. { 11.

// Theo mặc định, chế độ xem 3D sử dụng hướng mặc định.


12. // Thay đổi hướng bằng cách tạo và thiết lập mắt ViewOrientation3D XYZ = new XYZ (0, -100,
13. 10); XYZ up = new XYZ (0, 0, 1); XYZ tiến = mới XYZ (0, 1, 0); view3D.SetOrientation
14. (newViewOrientation3D (eye, up, forward));
15.
16.
17.
18.
19.
20.
21. // tắt mặt phẳng clip xa với API tham số tiêu chuẩn
22.
23. Tham số farClip = view3D.get_Parameter ("Far Clip Active"); farClip.Set (0);
24.
25. }

Hộp cắt chế độ xem phối cảnh là một phần của hình chóp với đỉnh ở vị trí của người xem. Nó là hình học giữa hai mặt phẳng clip song song. Hộp xén giới hạn
phần của mô hình được cắt ra và chiếu lên mặt phẳng xem.

• Hộp cắt xén được đại diện bởi thuộc tính View.CropBox, trả về một đối tượng BoundBoxXYZ.

• Các điểm CropBox.Min và CropBox.Max được đánh dấu trong hình trước. Lưu ý rằng điểm CropBox.Min trong chế độ xem phối cảnh
được tạo ra bằng cách chiếu mặt phẳng clip trước của hộp cắt lên mặt phẳng clip sau.

Tọa độ hộp cắt dựa trên hệ tọa độ xem. Sử dụng Transform.OfPoint () để chuyển đổi CropBox.Min và CropBox.Max sang hệ tọa độ thế giới. Để biết thêm chi tiết về
Transform, hãy tham khảo Geometry.Transform trong Hình học tiết diện.

Mặt phẳng dự án cộng với mặt phẳng clip phía trước và mặt sau đều phù hợp với hướng xem. Đường giữa CropBox.Max và CropBox.Min song song với hướng xem. Với
những yếu tố này, có thể tính toán được hình dạng hộp cắt xén.

Hình 97: Hình chiếu phối cảnh 3D

Hình trước cho thấy mặt phẳng chiếu trên màn hình sau khi cắt. Vùng cắt là giao điểm hình chữ nhật của mặt phẳng chiếu và hộp cắt.

• Thông tin hình học được truy xuất bằng thuộc tính View.CropRegion. Thuộc tính này trả về một phiên bản BoundBoxUV.

• Thuộc tính View.OutLine.Max trỏ đến góc trên bên phải.

• Thuộc tính View.OutLine.Min trỏ đến góc dưới bên trái.


Machine Translated by Google

• Giống như hộp cắt, tọa độ vùng cắt dựa trên hệ tọa độ xem. Các biểu thức sau đây là bằng nhau.
View.CropBox.Max.X (Y) / View.OutLine.Max.X (Y) == View.CropBox.Min.X (Y) / View.OutLine.Min.X (Y)

Vì kích thước của hình chiếu phối cảnh của một vật thể thay đổi tỷ lệ nghịch với khoảng cách từ vật thể đó đến tâm của hình chiếu, nên tỷ lệ là vô nghĩa đối với
các hình chiếu phối cảnh. Chế độ xem 3D phối cảnh Thuộc tính tỷ lệ luôn trả về 0.

Isometric View

Một chế độ xem isometric mới có thể được tạo bằng phương thức View3D.CreateIsometric () tĩnh.

Hình 98: Phép chiếu song song

Hình chiếu đẳng áp được tạo ra bằng cách sử dụng các tia chiếu song song bằng cách chiếu mô hình lên một mặt phẳng pháp tuyến với các tia. Hệ tọa độ xem
tương tự như hình chiếu phối cảnh, nhưng hộp cắt là một hình song song với các mặt song song hoặc pháp tuyến với các tia chiếu. Thuộc tính View.CropBox
trỏ đến hai góc chéo có tọa độ dựa trên hệ tọa độ xem.

Hình 99: Chia tỷ lệ cửa sổ trên mặt phẳng xem thành chế độ xem màn hình

Mô hình được chiếu lên một mặt phẳng xem và sau đó được thu nhỏ trên màn hình. Thuộc tính View.Scale đại diện cho tỷ lệ giữa kích thước mô hình thực tế với
kích thước chế độ xem. Các biểu thức liên quan như sau:

View.CropBox.Max.X (Y) / View.OutLine.Max.X (Y) == View.CropBox.Min.X (Y) / View.OutLine.Min.X (Y) == View.Scale

Vùng mã: View3D.CreateIsometric ()


1. public static View3D View3D.CreateIsometric (Tài liệu tài liệu, ElementId viewFamilyTypeId;
Machine Translated by Google

Tham số viewFamilyTypeId cần phải là một ViewType ba chiều. Revit xác định những điều sau:

• Vị trí của người xem.

• Cách tạo hệ tọa độ xem bằng hướng xem.

• Cách tạo hộp cắt xén mô hình.

Khi chế độ xem được tạo, bạn có thể thay đổi kích thước hộp cắt để xem các phần khác nhau của mô hình. Bạn cũng có thể thay đổi hướng mặc định.
API không hỗ trợ sửa đổi hệ tọa độ xem.

Mẫu mã sau đây minh họa cách tạo chế độ xem 3D đẳng hướng.

Vùng mã: Tạo chế độ xem Isometric 3D

1. // Tìm kiểu xem 3D 2.

3. IEnumerable <ViewFamilyType> viewFamilyTypes = from elem in newFilteredElementCollector (document) .OfClass (typeof (ViewFamilyType)) 4. let type = elem as
ViewFamilyType where type.ViewFamily == ViewFamily.ThreeDimensional chọn loại;
5.
6.
7.
8. // Tạo một View3D mới 9.
View3D view3D = View3D.CreateIsometric (document, viewFamilyTypes.First (). Id); 10. if (null ! =
View3D) 11. { 12. 13.

// Theo mặc định, chế độ xem 3D sử dụng hướng mặc định.


// Thay đổi hướng bằng cách tạo và thiết lập mắt ViewOrientation3D XYZ = new XYZ (10,
14. 10, 10); XYZ up = new XYZ (0, 0, 1); XYZ tiến = mới XYZ (0, 1, 0);
15.
16.
17.
18. ViewOrientation3D viewOrientation3D = newViewOrientation3D (mắt, lên, về phía trước);
19. view3D.SetOrientation (viewOrientation3D);
20. }

Khung Chế độ xem 3D

Mỗi chế độ xem có một hộp cắt. Hộp cắt tập trung vào một phần của mô hình để chiếu và hiển thị trong chế độ xem. Đối với chế độ xem 3D, có một hộp khác có
tên là hộp phần.

• Hộp phần xác định phần mô hình nào xuất hiện trong chế độ xem 3D.

• Hộp phần được sử dụng để cắt phần có thể nhìn thấy của mô hình 3D.

• Phần bên ngoài hộp không thể nhìn thấy ngay cả khi nó nằm trong hộp cắt.

• Hộp phần khác với hộp cắt ở chỗ nó có thể được xoay và di chuyển cùng với mô hình.

Hộp phần đặc biệt hữu ích cho các mô hình lớn. Ví dụ: nếu bạn muốn kết xuất một tòa nhà lớn, hãy sử dụng hộp mặt cắt. Hộp phần giới hạn phần mô hình được sử dụng để tính toán. Để hiển
thị hộp phần, trong hộp thoại Thuộc tính phần tử chế độ xem 3D, hãy chọn Phần
Hộp trong phần Extents. Bạn cũng có thể đặt nó bằng cách sử dụng API:

Vùng mã: Hiển thị Hộp Phần

1. private void ShowHideSectionBox (Autodesk.Revit.DB.View3D view3D) 2. { 3.

foreach (Tham số p trong view3D.Parameters) {


4.
5. // Lấy tham số Section Box if
(p.Definition.Name.Equals ("Section Box")) {
6. 7.

// Hiển thị Hộp mục p.Set


8. 9. (1); // Ẩn ô mục // p.Set
10. (0); phá vỡ;
11.
12.
13. }
14. }
15. }
Machine Translated by Google

Hình 100: Hộp mặt cắt

Thuộc tính View3D.SectionBox được sử dụng để lấy và thay đổi các phạm vi của hộp. Trong một số trường hợp, việc đặt View3D.SectionBox có thể có tác dụng
phụ. Đặt thuộc tính thành các giá trị nhất định có thể thay đổi dung lượng hộp và hiển thị nó trong dạng xem. Tuy nhiên, bạn có thể gán giá trị null cho
SectionBox để giữ giá trị đã sửa đổi và làm cho hộp section ẩn trong dạng xem. Để tránh hiển thị hộp phần, hãy thay đổi giá trị hộp phần, sau đó đặt hộp phần
thành rỗng. Mẫu mã sau đây minh họa quá trình này. Lưu ý rằng nó chỉ hoạt động khi hộp kiểm Section Box được chọn trong hộp thoại thuộc tính View.

Vùng mã: Ẩn Hộp Phần

1. private void ExpandSectionBox (dạng xem View3D) 2. { 3.

// Hộp phần gốc BoundBoxXYZ


4. sectionBox = view.SectionBox;
5.
6. // Mở rộng hộp phần XYZ deltaXYZ
7. = sectionBox.Max - sectionBox.Min; sectionBox.Max + =
deltaXYZ / 2; sectionBox.Min - = deltaXYZ / 2;
8. 9.
10.
11. // Sau khi gửi lại hộp phần, nó sẽ được hiển thị trong khung nhìn.
12. // Nó chỉ hoạt động khi hộp kiểm Section Box được chọn // trong
13. hộp thoại thuộc tính View. view.SectionBox = sectionBox;
14.
15.
16. // Đặt hộp phần thành null sẽ làm cho nó bị ẩn. view.SectionBox =
17. null; // dòng x
18. }

Lưu ý Nếu bạn đặt view.SectionBox thành null, nó có tác dụng tương tự như ẩn hộp phần bằng tham số Hộp phần. Hộp phần hiện tại được lưu trữ theo
dạng xem và được khôi phục khi bạn hiển thị hộp phần bằng tham số SectionBox.

Tọa độ các điểm Tối đa và Tối thiểu của BoundBoxXYZ được trả về từ thuộc tính SectionBox không phải là WCS. Để chuyển đổi tọa độ của Max và Min thành WCS, bạn
cần chuyển đổi điểm thông qua phép biến đổi thu được từ thuộc tính BoundBoxXYZ.Transform.

Vùng mã: Chuyển đổi Max và Min sang WCS

private void ConvertMaxMinToWCS (View3D view, out XYZ max, out XYZ min)
{BoundBoxXYZ sectionbox = view.SectionBox; Biến đổi biến
đổi = sectionbox.Transform; max = biến đổi.OfPoint
(sectionbox.Max); min = biến đổi.OfPoint
(sectionbox.Min);
}
Machine Translated by Google

Xem khóa

Lớp View3D có các phương thức và thuộc tính tương ứng với tính năng khóa có sẵn trong giao diện người dùng Revit.

Phương thức View3D.SaveOrientationAndLock () sẽ lưu hướng và khóa chế độ xem trong khi View3D.RestoreOrientationAndLock () sẽ khôi phục hướng của chế độ
xem và khóa nó. View3D.Unlock () sẽ mở khóa chế độ xem nếu nó hiện đang bị khóa. Thuộc tính IsLocked sẽ trả về cho dù chế độ xem 3D hiện đang bị khóa.

ViewPlan
Chế độ xem kế hoạch dựa trên cấp độ. Có ba loại chế độ xem mặt bằng, chế độ xem mặt bằng, chế độ xem mặt bằng trần và chế độ xem mặt bằng khu vực.

• Nói chung, dạng xem sơ đồ mặt bằng là dạng xem mặc định được mở trong một dự án mới.

• Hầu hết các dự án đều có ít nhất một mặt bằng tầng và một mặt bằng trần.

• Dạng xem kế hoạch thường được tạo sau khi thêm các cấp mới vào dự án.

Việc thêm các cấp độ mới bằng cách sử dụng API không tự động thêm các chế độ xem kế hoạch. Sử dụng phương thức ViewPlan.Create () tĩnh để tạo các khung
nhìn sơ đồ sàn và trần mới. Sử dụng phương thức ViewPlan.CreateAreaPlan () tĩnh để tạo một dạng xem sơ đồ khu vực mới.

Vùng mã: Tạo chế độ xem kế hoạch

1. công khai tĩnh ViewPlan ViewPlan.Create (Tài liệu tài liệu, ElementId viewFamilyTypeId, ElementId levelId); 2.

3. public static ViewPlan ViewPlan.CreateAreaPlan (Document document, ElementId areaSchemeId, ElementId levelId);

Tham số viewFamilyTypeId trong ViewPlan.Create () cần phải là một FloorPlan, CeilingPlan, AreaPlan hoặc StructuralPlan ViewType. Tham số levelId đại diện
cho Id của phần tử mức trong dự án mà chế độ xem kế hoạch được liên kết.

Đoạn mã sau tạo sơ đồ mặt bằng và sơ đồ trần dựa trên một cấp độ nhất định.

Vùng mã: Tạo sơ đồ mặt bằng và sơ đồ trần

1. // Tìm kiểu xem sơ đồ tầng 2. IEnumerable


<ViewFamilyType> viewFamilyTypes = from elem trong new FilteredElementCollector (document) .OfClass (typeof (ViewFamilyType)) 3. let type = elem as ViewFamilyType 4.
where type.ViewFamily == ViewFamily.FloorPlan 5. chọn loại; 6.

7. // Tạo Mặt bằng và Sơ đồ tầng dựa trên nó 8. double elevation


= 10.0; 9. Mức level1 = document.Create.NewLevel (độ cao); 10.
ViewPlan floorView = ViewPlan.Create (document, viewFamilyTypes.First
(). Id, level1.Id); 11.

12. // Tạo một Tầng khác và một Sơ đồ trần dựa trên nó 13. // Tìm kiểu
xem sơ đồ trần 14. viewFamilyTypes = from elem trong new
FilteredElementCollector (document) .OfClass (typeof (ViewFamilyType)) 15. let type = elem as ViewFamilyType 16. where type.ViewFamily
== ViewFamily.CeilingPlan 17. select type; 18.

19. độ cao + = 10,0; 20.


Cấp độ level2 = document.Create.NewLevel (độ cao); 21. ViewPlan
trầnView = ViewPlan.Create (document, viewFamilyTypes.First (). Id, level2.Id);
Machine Translated by Google

Sau khi tạo chế độ xem kế hoạch mới, có thể đặt Kỷ luật cho chế độ xem bằng cách sử dụng tham số Kỷ luật là loại ViewDiscipline. Các tùy chọn bao gồm Kiến trúc, Kết cấu, Cơ khí, Điện, Hệ

thống ống nước và Điều phối.

Đối với các khung nhìn mặt bằng cấu trúc, hướng xem có thể được đặt thành Lên hoặc Xuống bằng cách sử dụng thuộc tính ViewFamilyType.PlanViewDirection.

Mặc dù nó là một thuộc tính của lớp ViewFamilyType, một ngoại lệ sẽ được ném ra nếu thuộc tính được truy cập cho các khung nhìn không phải là các khung nhìn StructuralPlan.

Phạm vi chế độ xem cho các chế độ xem kế hoạch có thể được truy xuất thông qua phương thức ViewPlan.GetViewRange (). Đối tượng PlanViewRange trả về có thể được sử dụng để tìm các mức mà một

mặt phẳng có liên quan và độ lệch của mỗi mặt phẳng từ mức đó. Đó là thông tin tương tự có sẵn trong hộp thoại Phạm vi xem trong giao diện người dùng Revit:

Ví dụ sau đây cho thấy cách lấy mặt phẳng clip trên cùng và độ lệch được liên kết cho chế độ xem mặt bằng

Vùng mã: Nhận thông tin về phạm vi xem

1. private void ViewRange (Doc tài liệu, View view) 2. { 3. 4.

if (chế độ xem là ViewPlan)


{
5. ViewPlan viewPlan = xem dưới dạng ViewPlan;
6. PlanViewRange viewRange = viewPlan.GetViewRange ();

7. 8. ElementId topClipPlane = viewRange.GetLevelId (PlanViewPlane.TopClipPlane); double dOffset


9. = viewRange.GetOffset (PlanViewPlane.TopClipPlane);
10.
11. if (topClipPlane.IntegerValue> 0) {
12.
13. Mức phần tửAbove = doc.GetElement (topClipPlane);
14. TaskDialog.Show (view.Name, "Top Clip Plane:" + levelAbove.Name
+ "\ r \ nTop Offset:" + dOffset + "ft");
15. }
16. }

ViewDrafting
Chế độ xem soạn thảo không được liên kết với mô hình. Nó cho phép người dùng tạo các bản vẽ chi tiết không có trong mô hình.

• Trong dạng xem soạn thảo, người dùng có thể tạo các chi tiết ở các thang dạng xem khác nhau (thô, mịn hoặc trung bình).

• Bạn có thể sử dụng các công cụ chi tiết 2D, bao gồm:

• Dòng chi tiết • Mặt phẳng tham chiếu


• Kích thước
• Khu vực chi tiết
• Biểu tượng
• Các thành phần chi tiết
• Văn bản
• Cách nhiệt

Những công cụ này giống như những công cụ được sử dụng để tạo một dạng xem chi tiết.

• Chế độ xem soạn thảo không hiển thị các phần tử mô hình.

Sử dụng phương thức Autodesk.Revit.Creation.NewViewDrafting () để tạo dạng xem soạn thảo. Các phần tử mô hình không được hiển thị trong dạng xem soạn thảo.
Machine Translated by Google

ImageView

Lớp ImageView có nguồn gốc từ ViewDrafting. Nó có thể được sử dụng để tạo các khung nhìn kết xuất có chứa hình ảnh được nhập từ đĩa. Sử dụng phương thức ImageView.Create () tĩnh để tạo
các khung nhìn kết xuất mới.

ViewSection
Lớp ViewSection có thể được sử dụng để tạo dạng xem phần, dạng xem chi tiết, dạng xem chú thích, chú thích tham chiếu và các phần tham chiếu. Nó cũng đại diện cho các chế độ xem độ
cao.

Chế độ xem phần và các phần tham chiếu

Hình chiếu mặt cắt cắt qua mô hình để lộ cấu trúc bên trong. Phương thức ViewSection.CreateSection () tạo dạng xem mặt cắt.

Vùng mã: ViewSection.CreateSection ()


1. public ViewSection ViewSection.CreateSection (Tài liệu tài liệu, ElementId viewFamilyTypeId, BoundBoxXYZ sectionBox);

Tham số viewFamilyTypeId là Id cho ViewFamilyType sẽ được ViewSection mới sử dụng. Loại cần phải là một Section ViewFamily. Tham số sectionBox là hộp cắt chế độ xem phần. Nó cung
cấp hướng và phạm vi cần thiết cho chế độ xem mặt cắt. Thông thường, hộp cắt của chế độ xem khác được sử dụng làm tham số. Bạn cũng có thể xây dựng một phiên bản BoundBoxXYZ tùy chỉnh
để đại diện cho hướng và phạm vi.
Machine Translated by Google

Đoạn mã sau đây cho biết cách tạo dạng xem phần. Một hộp giới hạn cho chế độ xem mặt cắt được tạo ở tâm của một bức tường. Chế độ xem mặt cắt kết quả sẽ nằm trong
nút Phần (Phần xây dựng) trong Trình duyệt dự án.

Vùng mã: Tạo chế độ xem phần

1. // Tìm kiểu xem phần 2. IEnumerable


<ViewFamilyType> viewFamilyTypes = from elem trong new FilteredElementCollector (document) .OfClass (typeof (ViewFamilyType)) 3. 4.
let type = elem as ViewFamilyType where
type.ViewFamily == ViewFamily.Section chọn loại;

5. 6.

7. // Tạo một cá thể BoundBoxXYZ tập trung vào bức tường 8. LocationCurve
lc = wall.Location as LocationCurve; 9. Transform curveTransform =
lc.Curve.ComputeDeriuctor (0,5, true); 10. // sử dụng 0,5 và "true" (để chỉ định rằng tham
số được chuẩn hóa) 11. // đặt điểm gốc của biến đổi ở tâm của đường cong vị trí)

12.

13. XYZ origin = curveTransform.Origin; // điểm giữa của đường cong vị trí 14. XYZ
viewDirection = curveTransform.BasisX.Normalize (); // vector tiếp tuyến dọc theo đường cong vị trí 15. XYZ normal =
viewDirection.CrossProduct (XYZ.BasisZ) .Normalize (); // đường cong vị trí normal @ mid-point
16.

17. Biến đổi Transform = Transform.Identity; 18. biến


đổi.Origin = nguồn gốc; 19. biến đổi.BasisX = bình thường;
20. biến đổi.BasisY = XYZ.BasisZ; 21.

22. // có thể sử dụng đơn giản hóa này vì "lên" của bức tường là thẳng đứng.
23. // Đối với tình huống không thẳng đứng (chẳng hạn như mặt cắt qua sàn dốc, bề mặt bình thường sẽ là cần thiết) 24. biến đổi.BasisZ =
normal.CrossProduct (XYZ.BasisZ);
25.
26. BoundBoxXYZ sectionBox = new BoundBoxXYZ (); 27. sectionBox.Transform
= biến đổi; 28. sectionBox.Min = new XYZ (-10,0,0); 29. sectionBox.Max
= new XYZ (10,12,5); 30. // Các giá trị Min & Max X (-10 & 10) xác
định chiều dài đoạn thẳng trên mỗi cạnh của bức tường 31. // Max Y
(12) là chiều cao của hộp tiết diện // Max Z (5) là độ lệch clip xa 32.

33. // Tạo một phần xem mới.


34. ViewSection viewSection = ViewSection.CreateSection (tài liệu, viewFamilyTypes.First (). Id, sectionBox);

Phần tham chiếu là các phần tham chiếu đến một dạng xem hiện có. Revit không thêm một dạng xem mới khi bạn tạo một phần tham chiếu mới.

Vùng mã: ViewSection.CreateReferenceSection ()

1. public ViewSection ViewSection.CreateReferenceSection (Tài liệu tài liệu, ElementId parentViewId,


2. 3.
ElementId viewIdToReference, XYZ
4. headPoint, XYZ tailPoint);
5.

Tham số parentViewId là Id của chế độ xem trong đó điểm đánh dấu phần tham chiếu mới sẽ xuất hiện. Các phần tham chiếu có thể được tạo trong các dạng xem
FloorPlan, CeilingPlan, StructuralPlan, Section, Elevation, Drafting và Detail. ViewIdToReference có thể là Id của dạng xem Chi tiết, Bản thảo hoặc Phần.
ViewFamilyType của dạng xem được tham chiếu sẽ được phần tham chiếu mới sử dụng. Hai điểm XYZ sẽ xác định vị trí của đầu điểm đánh dấu phần trong chế độ xem chính.

Xem chi tiết

Chế độ xem chi tiết là chế độ xem mô hình xuất hiện dưới dạng chú thích hoặc phần trong các chế độ xem khác. Loại chế độ xem này thường đại diện cho mô hình tại
tỷ lệ chi tiết tốt hơn so với trong chế độ xem gốc. Nó được sử dụng để bổ sung thêm thông tin cho các phần cụ thể của mô hình. Binh yên
Phương thức ViewSection.CreateDetail () được sử dụng để tạo một ViewSection chi tiết mới.

Vùng mã: ViewSection.CreateDetail ()

1. public ViewSection ViewSection.CreateDetail (Tài liệu tài liệu, ElementId viewFamilyTypeId, BoundBoxXYZ sectionBox);
Machine Translated by Google

Tham số viewFamilyTypeId là Id cho ViewFamilyType sẽ được ViewSection mới sử dụng. Loại cần phải là Detail ViewFamily. Cũng giống như đối với chế độ xem mặt cắt chuẩn, tham
số sectionBox là hộp cắt xén của chế độ xem mặt cắt. Nó cung cấp hướng và phạm vi cần thiết cho chế độ xem mặt cắt.

Khi một ViewSection chi tiết mới được thêm vào, nó sẽ xuất hiện trong nút Detail Views (Chi tiết) trong Project Browser.

Chế độ xem độ cao

Chế độ xem độ cao là một mặt cắt của mô hình nơi các đường cao độ được hiển thị. Chế độ xem độ cao được biểu diễn bởi lớp ViewSection.
Tuy nhiên, không giống như các kiểu mặt cắt khác, bạn không thể tạo dạng xem độ cao bằng phương thức tĩnh trên lớp ViewSection. Để tạo chế độ xem độ cao, trước tiên hãy tạo
điểm đánh dấu độ cao, sau đó sử dụng điểm đánh dấu để tạo chế độ xem độ cao. Chế độ xem độ cao mới được tạo sẽ xuất hiện trong nút Độ cao (Độ cao tòa nhà) trong Trình duyệt dự án.
Nó sẽ được chỉ định một tên duy nhất.

Ví dụ sau đây tạo chế độ xem độ cao dựa trên vị trí của chùm tia.

Vùng mã: Tạo chế độ xem độ cao

1. ViewSection CreateElevationView (Tài liệu tài liệu, chùm FamilyInstance) 2. { 3.

// Tìm kiểu xem độ cao IEnumerable


4. <ViewFamilyType> viewFamilyTypes = from elem trong new FilteredElementCollector (document) .OfClass (typeof (ViewFamilyType)) let type = elem as ViewFamilyType where
5. type.ViewFamily == ViewFamily.Elevation chọn loại;

6. 7.

8. 9. LocationCurve lc = beam.Location as LocationCurve; XYZ xyz =


10. lc.Curve.GetEndPoint (0); Đánh dấu ElevationMarker =
11. ElevationMarker.CreateElevationMarker (tài liệu, viewFamilyTypes.First (). Id, xyz, 1); ViewSection elevationView = marker.CreateElevation
12. (tài liệu, tài liệu.ActiveView.Id, 1);
13.
14. trả về elevationView;
15. }

Phương thức ElevationMarker.CreateElevation () lấy một id của ViewPlan làm tham số. Đó là ViewPlan trong đó ElevationMarker được hiển thị. ViewSection độ cao mới sẽ lấy các phạm
vi của nó và kế thừa các cài đặt từ ViewPlan. Tham số cuối cùng là chỉ mục trên ElevationMarker nơi chế độ xem độ cao mới sẽ được đặt. Chỉ mục trên ElevationMarker phải hợp lệ và
không được sử dụng. Quan điểm
hướng được xác định bởi chỉ số.

Chú thích và Chú thích Tham chiếu

Chú thích hiển thị một phần của chế độ xem khác ở quy mô lớn hơn. Các dạng xem chú thích có thể được tạo bằng phương thức tĩnh ViewSection.CreateCallout ().
Chú thích có thể được tạo trong các chế độ xem FloorPlan, CeilingPlan, StructuralPlan, Section, Elevation, Drafting và Detail. Dạng xem kết quả sẽ là ViewSection, ViewPlan
hoặc ViewDetail tùy thuộc vào ViewFamilyType được sử dụng và sẽ xuất hiện trong nút tương ứng trong Trình duyệt dự án.

Vùng mã: ViewSection.CreateCallout ()

1. Public ViewSection ViewSection.CreateCallout (Tài liệu tài liệu, 2.


ElementId parentViewId,
3. ElementId viewFamilyTypeId,
4. XYZ point1,
5. Điểm XYZ2);

Tham số Id chế độ xem chính có thể là Id của bất kỳ loại Chế độ xem nào có thể tạo chú thích. Các tham số điểm xác định phạm vi của biểu tượng chú thích trong chế độ xem

chính.

Chú thích tham chiếu là chú thích đề cập đến chế độ xem hiện có. Khi bạn thêm chú thích tham chiếu, Revit không tạo một dạng xem trong dự án.
Thay vào đó, nó tạo một con trỏ đến một dạng xem hiện có, được chỉ định. Nhiều chú thích tham chiếu có thể trỏ đến cùng một chế độ xem.

Vùng mã: ViewSection.CreateReferenceCallout ()

1. Public ViewSection ViewSection.CreateReferenceCallout (Tài liệu tài liệu, 2.


ElementId parentViewId,
ElementId viewIdToReference, XYZ
3. 4. point1, XYZ point2);
5.

Tạo chú thích tham chiếu tương tự như tạo chú thích. Nhưng thay vì có Id của ViewFamilyType cho chú thích dưới dạng tham số, phương thức CreateReferenceCallout () lấy Id
của khung nhìn để tham chiếu. ViewFamilyType của dạng xem được tham chiếu sẽ được sử dụng bởi chú thích tham chiếu mới.
Machine Translated by Google

Chỉ các chế độ xem đã cắt mới có thể được tham chiếu, trừ khi chế độ xem được tham chiếu là chế độ xem Soạn thảo. Chế độ xem soạn thảo luôn có thể được tham chiếu bất
kể loại chế độ xem chính là gì. Chế độ xem độ cao có thể được tham chiếu từ chế độ xem phụ huynh Độ cao và Soạn thảo. Các dạng xem phần có thể được tham chiếu từ các
dạng xem cha của Phần và Soạn thảo. Chế độ xem chi tiết có thể được tham chiếu từ tất cả các chế độ xem gốc ngoại trừ trong các chế độ xem chính FloorPlan, CeilingPlan
và StructuralPlan nơi chỉ có thể tham chiếu các chế độ xem Chi tiết được định hướng theo chiều ngang. Các chế độ xem FloorPlan, CeilingPlan và StructuralPlan có thể
được tham chiếu từ các chế độ xem chính của FloorPlan, CeilingPlan và StructuralPlan.

Ví dụ sau tạo chú thích mới bằng cách sử dụng Detail ViewFamilyType và sau đó sử dụng chế độ xem chú thích mới để tạo chú thích tham chiếu.

Vùng mã: Tạo chú thích và chú thích tham chiếu

1. public void CreateCalloutView (Document document, View parentView) 2. { 3. 4.

// Tìm kiểu xem chi tiết


IEnumerable <ViewFamilyType> viewFamilyTypes = from elem trong new FilteredElementCollector (document) .OfClass (typeof (ViewFamilyType)) let type = elem as
ViewFamilyType trong đó type.ViewFamily == ViewFamily.Detail chọn loại;
5. 6.

7. 8.

ElementId viewFamilyTypeId = viewFamilyTypes.First (). Id; XYZ point1 =


9. 10. new XYZ (2, 2, 2); XYZ point2 = new XYZ (30, 30, 30); ElementId
11. parentViewId = parentView.Id; // một ViewPlan View view =
12. ViewSection.CreateCallout (document, parentViewId, viewFamilyTypeId,
13. point1, point2);
14.
15. ViewSection.CreateReferenceCallout (tài liệu, parentViewId, view.Id, point1, point2);

ViewSheet
Một trang tính chứa các dạng xem và một khối tiêu đề. Khi tạo dạng xem trang tính bằng phương thức ViewSheet.Create (), ký hiệu họ khối tiêu đề Id là tham số bắt buộc
cho phương thức. Thuộc tính Autodesk.Revit.Document TitleBlocks chứa tất cả các khối tiêu đề trong tài liệu. Chọn một khối tiêu đề để tạo trang tính.

Vùng mã: ViewSheet.Create ()

1. công khai tĩnh ViewSheet ViewSheet.Create (Tài liệu tài liệu, ElementId titleBlockTypeId);

Trang tính mới tạo không có chế độ xem. Phương thức Viewport.Create () được sử dụng để thêm các khung nhìn. Lớp Viewport được sử dụng để thêm các dạng xem thông thường
vào một dạng xem, tức là mặt bằng, độ cao, bản phác thảo và ba chiều. Để thêm lịch biểu vào một dạng xem, hãy sử dụng ScheduleInstance.Create () để thay thế.

Vùng mã: Thêm chế độ xem vào trang tính

1. công khai tĩnh Viewport Viewport.Create (Tài liệu tài liệu, ElementId viewSheetId, ElementId viewId, điểm XYZ); 2.

• Tham số vị trí XYZ xác định vị trí của các khung nhìn được thêm vào. Nó trỏ đến tọa độ trung tâm của chế độ xem đã thêm (được đo
theo số inch).

• Các tọa độ, [0, 0], có liên quan đến góc dưới bên trái của trang tính.

Mỗi trang tính có một số trang duy nhất trong tập bản vẽ hoàn chỉnh. Số được hiển thị trước tên trang tính trong Trình duyệt Dự án.
Thật tiện lợi khi sử dụng số trang trong tiêu đề dạng xem để tham chiếu chéo các trang trong tập bản vẽ của bạn. Bạn có thể truy xuất hoặc sửa đổi số bằng thuộc tính
SheetNumber. Số phải là duy nhất; nếu không, một ngoại lệ sẽ được đưa ra khi bạn đặt số thành một giá trị trùng lặp.
Machine Translated by Google

Ví dụ sau minh họa cách tạo và in dạng xem trang tính. Bắt đầu bằng cách tìm một khối tiêu đề có sẵn trong tài liệu (sử dụng bộ lọc trong trường hợp này) và sử dụng nó
để tạo chế độ xem trang tính. Tiếp theo, thêm chế độ xem 3D. Chế độ xem được đặt với góc dưới bên trái của nó ở giữa trang tính. Cuối cùng, in trang tính bằng cách gọi
phương thức View.Print ().

Vùng mã: Tạo chế độ xem trang tính

1. private void CreateSheetView (tài liệu Autodesk.Revit.DB.Document, View3D view3D) 2. { 3.

4. // Lấy một khối tiêu đề có sẵn từ tài liệu


5. IEnumerable <FamilySymbol> familyList = from elem trong FilteredElementCollector mới (tài liệu)
.OfClass (typeof (FamilySymbol))
6. 7. .OfCategory (BuiltInCategory.OST_TitleBlocks) let type =
elem as FamilySymbol trong đó type.Name.Contains ("E1") chọn
8. 9. loại;
10.
11.
12. // Tạo dạng xem trang tính
13. ViewSheet viewSheet = ViewSheet.Create (document, familyList.First (). Id); if (null ==
14. viewSheet) {
15.
16. ném ngoại lệ mới ("Không thể tạo ViewSheet mới.");
17. }
18.
19. // Thêm chế độ xem đã chuyển vào giữa trang tính if
20. (Viewport.CanAddViewToSheet (document, viewSheet.Id, view3D.Id)) {
21.
22. BoundBoxUV sheetBox = viewSheet.Outline; double
23. yPosition = (sheetBox.Max.V - sheetBox.Min.V) / 2 + sheetBox.Min.V; double xPosition =
24. (sheetBox.Max.U - sheetBox.Min.U) / 2 + sheetBox.Min.U;
25.
26. XYZ origin = new XYZ (xPosition, yPosition, 0); Viewport
27. viewport = Viewport.Create (document, viewSheet.Id, view3D.Id, origin);
28. }
29.
30. // In trang tính ra if
31. (viewSheet.CanBePrinted) {
32.
33. TaskDialog taskDialog = new TaskDialog ("Revit");
34. taskDialog.MainContent = "In trang tính?"; Các nút
35. TaskDialogCommonButtons = TaskDialogCommonButtons.Yes | TaskDialogCommonButtons.No; taskDialog.CommonButtons = các
36. nút; Kết quả TaskDialogResult = taskDialog.Show ();
37.
38.
39. if (result == TaskDialogResult.Yes) {
40.
41. viewSheet.Print ();
42. }
43. }
44. }

Lưu ý Bạn không thể thêm dạng xem trang tính vào một trang tính khác và bạn không thể thêm dạng xem vào nhiều hơn một trang tính; nếu không thì một ngoại lệ đối số
xảy ra.

Thiết lập máy in

Bạn có thể muốn thay đổi cài đặt của máy in trước khi in trang tính. API hiển thị các cài đặt cho máy in với lớp PrintManager và các lớp Autodesk.Revit.DB
liên quan:

Lớp Chức năng

Autodesk.Revit.DB.PrintManager Biểu diễn thông tin In trong Hộp thoại In (Tệp-> In) trong Giao diện người dùng Revit.

Autodesk.Revit.DB.PrintParameters Một đối tượng chứa các cài đặt được sử dụng để in tài liệu.

Autodesk.Revit.DB.PrintSetup Đại diện cho Thiết lập In (Tệp-> Thiết lập In ...) trong Revit UI.

Autodesk.Revit.DB.PaperSize Một đối tượng đại diện cho Khổ giấy của Thiết lập In trong dự án Autodesk Revit.

Autodesk.Revit.DB.PaperSizeSet Một tập hợp có thể chứa bất kỳ số lượng đối tượng kích thước giấy nào.

Autodesk.Revit.DB.PaperSource Một đối tượng đại diện cho Nguồn giấy của Thiết lập In trong dự án Autodesk Revit.

Autodesk.Revit.DB.PaperSourceSet Một tập hợp có thể chứa bất kỳ số lượng đối tượng nguồn giấy nào.

Autodesk.Revit.DB.ViewSheetSetting đại diện cho View / Sheet Set (File-> Print) trong Revit UI.

Autodesk.Revit.DB.PrintSetting Đại diện cho Thiết lập In (Tệp-> Thiết lập In ...) trong Revit UI.
Machine Translated by Google

Để biết ví dụ về mã sử dụng các đối tượng này, hãy xem ứng dụng mẫu ViewPrinter được bao gồm trong Revit Platform SDK.

ViewSchedule
Lịch biểu là một biểu diễn dữ liệu dạng bảng. Một lịch biểu điển hình hiển thị tất cả các phần tử của một danh mục (cửa, phòng, v.v.) với mỗi hàng đại diện cho một

phần tử và mỗi cột đại diện cho một tham số.

Lớp ViewSchedule đại diện cho lịch biểu và các dạng xem giống như lịch biểu khác, bao gồm lịch biểu một danh mục và nhiều danh mục, lịch biểu chính, xuất

vật liệu, danh sách xem, danh sách trang tính, chú thích chính, lịch sửa đổi và khối ghi chú.

Phương thức ViewSchedule.Export () sẽ xuất dữ liệu lịch biểu sang tệp văn bản.

Đặt lịch biểu trên trang tính

Phương thức ScheduleSheetInstance.Create () tĩnh tạo ra một thể hiện của một lịch biểu trên một trang tính. Nó yêu cầu ID của trang tính nơi lịch trình sẽ

được đặt, ID của chế độ xem lịch biểu và vị trí XYZ trên trang tính nơi lịch trình sẽ được đặt. Đối tượng ScheduleSheetInstance có các thuộc tính để truy

cập ID của lịch biểu "chính" tạo ra ScheduleSheetInstance này, vòng quay của lịch biểu trên trang tính, vị trí trên trang tính nơi đặt lịch biểu (trong tọa độ trang

tính), cũng như cờ xác định xem ScheduleSheetInstance có phải là một lịch trình sửa đổi trong họ khối tiêu đề hay không.

Tạo lịch biểu


Lớp ViewSchedule có một số phương thức để tạo lịch biểu mới tùy thuộc vào loại lịch biểu. Tất cả các phương thức đều có tham số Tài liệu là tài liệu mà lịch

biểu mới hoặc dạng xem lịch biểu sẽ được thêm vào. Các dạng xem lịch biểu mới được tạo sẽ xuất hiện dưới nút Lịch biểu / Số lượng trong Trình duyệt dự án.

Có thể tạo lịch biểu một danh mục hoặc nhiều danh mục tiêu chuẩn bằng phương thức ViewSchedule.CreateSchedule () tĩnh.

Vùng mã: ViewSchedule.CreateSchedule ()


1. Public ViewSchedule ViewSchedule.CreateSchedule (Tài liệu tài liệu, ElementId categoryId);

Tham số thứ hai là ID của danh mục có các phần tử sẽ được bao gồm trong lịch biểu, hoặc InvalidElementId cho lịch biểu nhiều danh mục.

Phương thức CreateSchedule () thứ hai có thể được sử dụng để tạo một lịch trình vùng và nhận một tham số bổ sung là ID của lược đồ vùng cho lịch biểu.

Khu vực mã: Tạo lịch trình khu vực


1. FilteredElementCollector collector1 = new FilteredElementCollector (doc); 2. collector1.OfCategory
(BuiltInCategory.OST_AreaSchemes); 3. // Lấy ElementId đầu tiên của AreaScheme.

4. Khu vực ElementIdSchemeId = collector1.FirstElementId ();


5.
6. // Nếu bạn muốn tạo một lịch trình vùng, bạn phải sử dụng phương thức CreateSchedule với ba đối số.
7. // Đầu vào của đối số thứ hai phải là ElementId của thể loại BuiltInCategory.OST_Areas và đầu vào của đối số thứ ba phải là ElementId
của một khu vực
8. ViewSchedule areaSchedule = Autodesk.Revit.DB.ViewSchedule.CreateSchedule (doc, new ElementId (BuiltInCategory.OST_Areas), areaSchemeId);

Một lịch khóa hiển thị các phần tử "khóa" trừu tượng có thể được sử dụng để điền các tham số của các phần tử mô hình thông thường và có thể được tạo

bằng phương thức ViewSchedule.CreateKeySchedule () tĩnh có tham số thứ hai là ID của danh mục phần tử mà các khóa của lịch trình sẽ sử dụng. Được liên kết.

Vật liệu cất cánh là một lịch trình hiển thị thông tin về các vật liệu tạo nên các phần tử trong mô hình. Không giống như lịch trình thông thường trong đó

mỗi hàng (trước khi nhóm) đại diện cho một phần tử duy nhất, mỗi hàng trong lần cất cánh vật liệu đại diện cho một cặp <phần tử, vật liệu> duy nhất. Phương thức

ViewSchedule.CreateMaterialTakeoff () có các tham số giống như phương thức ViewSchedule.CreateSchedule () và cho phép cả lịch trình cất cánh vật liệu đơn và

nhiều loại.

Danh sách xem, danh sách trang tính và chú thích chính được liên kết với một danh mục được chỉ định và do đó các phương pháp tạo của chúng lấy ID danh mục làm

tham số. Một danh sách chế độ xem là một lịch trình của các chế độ xem trong dự án. Nó là một lịch biểu của danh mục Chế độ xem và được tạo bằng

ViewSchedule.CreateViewList ().
Machine Translated by Google

Danh sách trang tính là lịch trình của các trang tính trong dự án. Nó là một lịch biểu của danh mục Trang tính và được tạo bằng phương thức
ViewSchedule.CreateSheetList ().

Chú giải bài phát biểu chính là lịch biểu của danh mục Thẻ bài phát biểu và được tạo bằng ViewSchedule.CreateKeynoteLegend ().

Lịch sửa đổi được thêm vào họ tiêu đề và hiển thị như một phần của tiêu đề trên trang tính. Phương thức
ViewSchedule.CreateRevisionSchedule () sẽ ném ra một ngoại lệ nếu tài liệu được truyền vào không phải là một họ tiêu đề.

Khối ghi chú là một lịch biểu của danh mục Chú thích chung hiển thị các phần tử của một họ thay vì tất cả các phần tử trong một danh mục.

Vùng mã: ViewSchedule.CreateNoteBlock ()


1. public ViewSchedule ViewSchedule.CreateNoteBlock (Tài liệu tài liệu, ElementId familyId);

Tham số thứ hai là ID của họ có các phần tử sẽ được đưa vào lịch biểu.

Vùng mã: Tạo lịch khối ghi chú


1. // Lấy ElementId đầu tiên của họ AnnotationSymbolType.
2. ElementId annotationSymbolTypeId = ElementId.InvalidElementId; 3.
if (! Doc.AnnotationSymbolTypes.IsEmpty) 4. { 5. 6.

foreach (Loại AnnotationSymbolType trong doc.AnnotationSymbolTypes) {

annotationSymbolTypeId = type.Family.Id;
7. 8. phá vỡ;
}
9.
10. } 11.
12. // Tạo lịch xem noteblock.
13. ViewSchedule noteBlockSchedule = ViewSchedule.CreateNoteBlock (doc, annotationSymbolTypeId);

Làm việc với ViewSchedule


Lớp ScheduleDefinition chứa các cài đặt khác nhau xác định nội dung của dạng xem lịch biểu, bao gồm:

• Danh mục của lịch biểu và các thuộc tính cơ bản khác xác định loại lịch trình.
• Một tập hợp các trường trở thành các cột của lịch biểu.

• Các tiêu chí sắp xếp và phân nhóm.


• Bộ lọc hạn chế tập hợp các phần tử hiển thị trong lịch biểu.

Hầu hết các lịch trình đều chứa một ScheduleDefinition duy nhất được truy xuất thông qua thuộc tính ViewSchedule.Definition. Trong Revit MEP, lịch trình
của một số danh mục nhất định có thể chứa một "lịch trình nhúng" chứa các phần tử được liên kết với các phần tử trong lịch biểu chính, ví dụ: lịch trình
phòng hiển thị các phần tử bên trong mỗi phòng hoặc lịch trình hệ thống ống dẫn hiển thị các phần tử được liên kết với mỗi hệ thống. Một lịch biểu được
nhúng có danh mục, trường, bộ lọc riêng của nó, v.v. Những cài đặt đó được lưu trữ trong đối tượng ScheduleDefinition thứ hai. Khi hiện tại,
ScheduleDefinition được nhúng sẽ được lấy từ thuộc tính ScheduleDefinition.EmbeddedDefinition.

Thêm trường

Khi một ViewSchedule được tạo, các trường có thể được thêm vào. Phương thức ScheduleDefinition.GetSchedulableFields () sẽ trả về danh sách các đối
tượng SchedulableField đại diện cho các trường không được tính toán có thể có trong lịch biểu. Một trường mới có thể được thêm vào từ một đối tượng
SchedulableField hoặc sử dụng một ScheduleFieldType. Bảng sau đây mô tả các tùy chọn có sẵn từ kiểu liệt kê ScheduleFieldType.
Machine Translated by Google

Tên thành viên Sự mô tả

Một tham số cá thể của các phần tử đã lên lịch. Tất cả các thông số được chia sẻ cũng sử dụng kiểu này, bất kể chúng là phiên bản hay kiểu
Ví dụ
thông số.

Loại nguyên tố Một tham số kiểu của các phần tử đã lên lịch.

Đếm Số phần tử xuất hiện trên hàng lịch biểu.

Một loại trường chuyên biệt được sử dụng cho một số tham số có giá trị được hiển thị có thể thay đổi dựa trên cài đặt của chế độ xem:

ROOM_AREA và ROOM_PERIMETER trong lịch phòng và không gian.


ViewBased
PROJECT_REVISION_REVISION_NUM trong lịch sửa đổi.

KEYNOTE_NUMBER trong chú giải bài phát biểu được đánh số theo trang tính.

Công thức Một công thức được tính toán từ các giá trị của các trường khác trong lịch biểu.

Phần trăm Một giá trị cho biết phần trăm của tổng số trường khác mà mỗi phần tử đại diện.

Phòng Tham số của phòng chứa một phần tử đã lên lịch.

FromRoom Một thông số của phòng ở phía "từ" của cửa ra vào hoặc cửa sổ.

Tới phòng Một thông số của phòng ở phía "tới" của cửa ra vào hoặc cửa sổ.

Một tham số của phần tử Thông tin dự án trong dự án mà phần tử đã lên lịch thuộc về, có thể là một tệp được liên kết. Chỉ được phép trong lịch trình bao gồm
ProjectInfo
các phần tử từ các tệp được liên kết.

Vật chất Trong một lần cất cánh vật liệu, một tham số của một trong những vật liệu của phần tử đã lên lịch.

Trong quá trình cất cánh vật liệu, một giá trị đại diện cho cách một vật liệu cụ thể được sử dụng trong một phần tử đã lên lịch. ID thông số có thể là
Chất lượng
MATERIAL_AREA, MATERIAL_VOLUME hoặc MATERIAL_ASPAINT.

Một tham số của RevitLinkInstance mà một phần tử trong tệp được liên kết thuộc về. Hiện tại RVT_LINK_INSTANCE_NAME là thông số duy nhất được hỗ trợ. Chỉ được phép
RevitLinkInstance
trong lịch trình bao gồm các phần tử từ các tệp được liên kết.

Một tham số của RevitLinkType mà một phần tử trong tệp được liên kết thuộc về. Hiện tại RVT_LINK_FILE_NAME_WITHOUT_EXT là thông số duy nhất được hỗ trợ. Chỉ
RevitLinkType
được phép trong lịch trình bao gồm các phần tử từ các tệp được liên kết.

StructuralMaterial Một tham số của vật liệu cấu trúc của một phần tử đã lên lịch.

Không gian Một tham số của không gian mà một phần tử đã lên lịch thuộc về.

Sử dụng một trong các phương thức ScheduleDefinition.AddField () sẽ thêm trường vào cuối danh sách trường. Để đặt một trường mới vào một vị trí cụ thể trong danh sách

trường, hãy sử dụng một trong các phương thức ScheduleDefinition.InsertField (). Các trường cũng có thể được sắp xếp theo thứ tự bằng cách sử dụng

ScheduleDefinition.SetFieldOrder ().
Machine Translated by Google

Sau đây là một ví dụ đơn giản cho thấy cách thêm các trường vào dạng xem nếu chúng chưa có trong lịch xem.

Vùng mã: Thêm trường vào lịch biểu

1. /// <summary>
2. /// Thêm trường để xem lịch biểu. 3. ///
</summary> 4. /// <param name = "boards ">
Danh sách lịch xem. </param> 5. public void AddFieldToSchedule (List
<ViewSchedule> Schedule) 6. { 7.

IList <SchedulableField> SchedulableFields = null;

8. 9. foreach (ViewSchedule so với trong lịch trình) {


10.
11. // Nhận tất cả các trường có thể lập lịch từ định nghĩa lịch xem.
12. SchedulableFields = vs.Definition.GetSchedulableFields ();
13.
14. foreach (SchedulableField sf trong SchedulableField ) {
15.
16. bool fieldAlreadyAdded = false; // Lấy
17. tất cả id trường lịch IList
18. <ScheduleFieldId> ids = vs.Definition.GetFieldOrder (); foreach (Id
19. ScheduleFieldId trong id) {
20.
21. // Nếu phương thức GetSchedulableField () của trường lịch biểu gotten trả về cùng một trường có thể lập lịch, // điều
22. đó có nghĩa là trường đã được thêm vào lịch xem. if (so với.Definition.GetField (id) .GetSchedulableField () == sf) {
23.
24.
25. fieldAlreadyAdded = true; phá vỡ;
26.
27. }
28. }
29.
30. // Nếu trường có thể lập lịch không tồn tại trong lịch xem, hãy thêm trường
31. đó. if (fieldAlreadyAdded == false) {
32.
33. vs.Definition.AddField (sf);
34. }
35. }
36. }
37. }

Lớp ScheduleField đại diện cho một trường duy nhất trong danh sách các trường của ScheduleDefinition. Mỗi trường (không ẩn) sẽ trở thành một cột trong lịch biểu.

Thông thường nhất, một trường đại diện cho một thể hiện hoặc tham số kiểu của các phần tử xuất hiện trong lịch biểu. Một số trường đại diện cho các tham số của các

phần tử liên quan khác, như phòng chứa phần tử đã lên lịch. Các trường cũng có thể đại diện cho dữ liệu được tính toán từ các trường khác trong lịch biểu, cụ thể là

các trường Công thức và Phần trăm.

Lớp ScheduleField có các thuộc tính để kiểm soát các tiêu đề cột, cả văn bản cũng như hướng. Chiều rộng cột và căn lề ngang của văn bản trong một cột cũng có thể

được xác định.

Thuộc tính ScheduleField.IsHidden có thể được sử dụng để ẩn một trường. Trường ẩn không được hiển thị trong lịch biểu, nhưng nó có thể được sử dụng để lọc, sắp xếp,

nhóm và định dạng có điều kiện và có thể được tham chiếu bởi các trường Công thức và Phần trăm.

Một số Trường lịch biểu có thể được tính tổng và nếu thuộc tính HasTotals được đặt thành true, tổng số sẽ được hiển thị nếu một hàng chân trang được bật nơi tổng số sẽ

được hiển thị. Nó có thể là một hàng tổng lớn ở cuối lịch biểu hoặc một hàng chân trang cho một trong các trường được nhóm của lịch biểu. Trong một lịch biểu không được

chia thành từng khoản mục, tổng số cũng được hiển thị trong các hàng thông thường khi nhiều phần tử xuất hiện trên cùng một hàng.

Kiểu và Định dạng Trường

ScheduleField.GetStyle () và ScheduleField.SetStyle () sử dụng lớp TableCellStyle để làm việc với kiểu của các trường trong lịch biểu. Sử dụng SetStyle (), có thể đặt

các thuộc tính khác nhau của trường, bao gồm kiểu đường cho đường viền của ô cũng như phông chữ, màu sắc và kích thước văn bản.

ScheduleField.SetFormatOptions () và ScheduleField.GetFormatOptions () sử dụng lớp FormatOptions để làm việc với việc định dạng dữ liệu của một trường. Lớp FormatOptions

chứa các cài đặt kiểm soát cách định dạng số với đơn vị là chuỗi. Nó chứa những cài đặt thường được người dùng cuối chọn trong hộp thoại Định dạng và được lưu trữ

trong tài liệu.


Machine Translated by Google

Trong ví dụ sau, tất cả các trường độ dài trong ViewSchedule được định dạng để hiển thị theo feet và inch phân số.

Vùng mã: Định dạng một trường

1. // định dạng đơn vị độ dài để hiển thị ở định dạng feet và inch 2. public
void FormatLengthFields (Lịch biểu ViewSchedule) 3. { 4. 5.

int nFields = calendar.Definition.GetFieldCount (); for (int n


= 0; n <nFields; n ++) {

6. 7. Trường ScheduleField = Schedule.Definition.GetField (n); if


(field.UnitType == UnitType.UT_Length) {
8. 9.
10. FormatOptions formatOpts = new FormatOptions ();
11. formatOpts.UseDefault = false; formatOpts.DisplayUnits =
12. DisplayUnitType.DUT_FEET_FRACTIONAL_INCHES; field.SetFormatOptions (formatOpts);
13.
14. }
15. }
16. }

Phân nhóm và sắp xếp trong lịch biểu

Lịch biểu có thể được sắp xếp hoặc nhóm theo một hoặc nhiều trường của lịch biểu. Một số phương pháp có thể được sử dụng để kiểm soát việc nhóm và sắp xếp các

trường. Lớp ScheduleSortGroupField đại diện cho một trong các trường mà lịch biểu được sắp xếp hoặc nhóm theo. Sắp xếp và nhóm là các hoạt động liên quan. Trong cả

hai trường hợp, các phần tử xuất hiện trong lịch biểu được sắp xếp dựa trên giá trị của chúng cho trường mà lịch biểu được sắp xếp / nhóm lại, điều này tự động khiến

các phần tử có giá trị giống hệt nhau được nhóm lại với nhau. Bằng cách kích hoạt thêm các hàng đầu trang, chân trang hoặc trống, có thể đạt được sự phân tách trực

quan giữa các nhóm.

Nếu thuộc tính ScheduleDefinition.IsItemized là false, các phần tử có cùng giá trị cho tất cả các trường được sử dụng để sắp xếp / nhóm sẽ được kết hợp vào

cùng một hàng. Nếu không, lịch trình sẽ hiển thị từng phần tử trên một hàng riêng biệt

Một lịch biểu có thể được sắp xếp hoặc nhóm theo dữ liệu không được hiển thị trong lịch biểu bằng cách đánh dấu trường được sử dụng để sắp xếp / nhóm là ẩn bằng

cách sử dụng thuộc tính ScheduleField.IsHidden.

Tiêu đề cũng có thể được nhóm lại. Phương thức ViewSchedule.GroupHeaders () được nạp chồng có thể được sử dụng để chỉ định những hàng và cột nào cần bao gồm trong một

nhóm của phần tiêu đề. Một trong các phương thức nạp chồng lấy một chuỗi ký tự cho chú thích của các hàng và cột được nhóm.

Trong ví dụ sau, hai hoặc nhiều cột được nhóm bằng chú thích. Sau đó, nếu văn bản chú thích xuất hiện trong tiêu đề cột, nó sẽ bị loại bỏ.

Vùng mã: Nhóm tiêu đề

1. // Nhóm các cột dữ liệu liên quan và loại bỏ văn bản thừa khỏi tiêu đề cột 2. public void
GroupRelatedData (ViewSchedule colSchedule, int startIndex, int endIndex, string groupText) 3. { 4. 5.

colSchedule.GroupHeaders (0, startIndex, 0, endIndex, groupText);

6. // Nếu tiêu đề cột có groupText trong đó, hãy xóa nó đi // (tức


7. là nếu groupText là "Top" và tiêu đề trường là "Top Level", // thay đổi tiêu đề
số 8.
chỉ thành "Level" cho (int index = startIndex; index < = endIndex; index ++) {
9.
10.
11. Trường ScheduleField = colSchedule.Definition.GetField (chỉ mục);
12. field.ColumnHeading = field.ColumnHeading.Replace (groupText, "");
13. }
14. }

Lọc

Một ScheduleFilter có thể được sử dụng để lọc các phần tử sẽ được hiển thị trong một lịch biểu. Bộ lọc là một điều kiện phải được thỏa mãn để một phần tử xuất hiện

trong lịch trình. Tất cả các bộ lọc phải được đáp ứng để một phần tử xuất hiện trong lịch biểu.

Lịch biểu có thể được lọc theo dữ liệu không được hiển thị trong lịch biểu bằng cách đánh dấu trường được sử dụng để lọc là ẩn bằng thuộc tính

ScheduleField.IsHidden.

Làm việc với dữ liệu lịch biểu

ViewSchedule.GetTableData () trả về một đối tượng TableData chứa hầu hết dữ liệu mô tả kiểu và nội dung của các hàng, cột và ô trong bảng. Thông tin thêm có thể được
tìm thấy trong TableView và TableData.
Machine Translated by Google

TableView và TableData
TableView là một lớp đại diện cho một khung nhìn hiển thị một bảng và nó là lớp cơ sở cho ViewSchedule và PanelScheduleView.

Làm việc với dữ liệu theo lịch trình

Dữ liệu thực tế cho một bảng được chứa trong lớp TableData. Mặc dù không thể lấy đối tượng TableData trực tiếp từ lớp TableView, nhưng cả hai lớp con đều
có phương thức GetTableData (). Đối với ViewSchedule, phương thức này trả về một đối tượng TableData. Đối với PanelScheduleView, GetTableData () trả về
một đối tượng PanelScheduleData, dẫn xuất từ lớp cơ sở TableData. Lớp TableData chứa hầu hết dữ liệu mô tả kiểu của hàng, cột và ô trong bảng. PanelScheduleData
cung cấp các phương pháp bổ sung liên quan cụ thể đến lịch bảng.

Làm việc với hàng, cột và ô

Dữ liệu trong bảng được chia thành nhiều phần. Để làm việc với các hàng, cột và ô của TableData, cần phải lấy đối tượng TableSectionData.
TableData.GetSectionData () có thể được gọi bằng một số nguyên đối với dữ liệu phần được yêu cầu hoặc sử dụng SectionType (tức là Header hoặc
Body).

Lớp TableSectionData có thể được sử dụng để chèn hoặc xóa hàng hoặc cột, định dạng ô và để lấy chi tiết về các ô tạo nên phần đó của lịch biểu, chẳng hạn như
loại ô (tức là Văn bản hoặc Hình ảnh) hoặc id danh mục của ô.

Trong ví dụ sau, một hàng mới được thêm vào phần tiêu đề của lịch biểu và văn bản được đặt cho ô mới được tạo. Lưu ý rằng hàng đầu tiên của phần tiêu đề
mặc định là tiêu đề khi được tạo bằng giao diện người dùng.

Vùng mã: Chèn một hàng

1. public void CreateSubtitle (lịch biểu ViewSchedule) 2. { 3.

TableData colTableData = Schedule.GetTableData ();


4.
5. TableSectionData tsd = colTableData.GetSectionData (SectionType.Header); tsd.InsertRow
6. (tsd.FirstRowNumber + 1); tsd.SetCellText (tsd.FirstRowNumber + 1, tsd.FirstColumnNumber,
"Lịch trình của các cấp độ đầu cột và cơ sở với các hiệu số");
7. 8. }

Lưu ý: Chỉ có thể thêm hàng và cột trong phần tiêu đề của một lịch biểu thông thường.

Cũng lưu ý, trong ví dụ mã ở trên, nó sử dụng các thuộc tính FirstRowNumber và FirstColumnNumber. Trong một số phần, số hàng hoặc cột có thể bắt đầu
bằng 0 hoặc chúng có thể bắt đầu bằng 1. Những thuộc tính này phải luôn được sử dụng thay cho 0 hoặc 1 được mã hóa cứng.

Kiểu của hàng, cột hoặc ô riêng lẻ có thể được tùy chỉnh cho lịch biểu. Điều này bao gồm khả năng đặt kiểu đường viền cho tất cả bốn cạnh của ô, cũng như màu
ô và hình thức văn bản (nghĩa là màu sắc, phông chữ, kích thước). Đối với lịch trình thông thường, điều này chỉ có thể được thực hiện trong phần tiêu đề của
bảng.

Trong ví dụ bên dưới, phông chữ của phụ đề của ViewSchedule (giả định là hàng thứ hai của phần tiêu đề) được đặt thành đậm và kích thước phông chữ được đặt
thành 10.

Vùng mã: Định dạng ô

1. public void FormatSubtitle (ViewSchedule colSchedule) 2. { 3.

TableData colTableData = colSchedule.GetTableData ();


4.
5. TableSectionData tsd = colTableData.GetSectionData (SectionType.Header); // Phụ đề là hàng
thứ hai, cột đầu tiên if (tsd.AllowOverrideCellStyle (tsd.FirstRowNumber + 1,
6. 7. tsd.FirstColumnNumber)) {

8. 9. TableCellStyle tcs = new TableCellStyle (); Tùy chọn


10. TableCellStyleOverrideOptions = new TableCellStyleOverrideOptions (); tùy chọn.FontSize = true;
11. tùy chọn.Bold = true; tcs.SetCellStyleOverrideOptions (tùy chọn); tcs.IsFontBold = true;
12. tcs.TextSize = 10; tsd.SetCellStyle (tsd.FirstRowNumber + 1, tsd.FirstColumnNumber, tcs);
13.
14.
15.
16.
17. }
18. }
Machine Translated by Google
Machine Translated by Google

Xem bộ lọc

Bộ lọc có thể được áp dụng cho Chế độ xem bằng cách sử dụng lớp ParameterFilterElement. ParameterFilterElement lọc các phần tử dựa trên danh mục của nó và một loạt các quy tắc lọc. Một hoặc nhiều danh

mục có thể được chỉ định là được phép cho bộ lọc.

Khi bộ lọc đã được xác định (với một hoặc nhiều danh mục và một hoặc nhiều quy tắc bộ lọc), nó có thể được áp dụng cho Chế độ xem bằng một trong số các phương pháp. Phương thức View.AddFilter

() sẽ áp dụng bộ lọc cho dạng xem, nhưng với các ghi đè mặc định, nghĩa là hiển thị của dạng xem sẽ không thay đổi. View.SetFilterOverrides () sẽ đặt ghi đè đồ họa được liên kết với một bộ lọc. Và

View.SetFilterVisibility () sẽ thiết lập xem các phần tử vượt qua bộ lọc có hiển thị trong chế độ xem hay không.

AddFilter () và SetFilterVisibility () đều sẽ áp dụng bộ lọc cho chế độ xem nếu nó chưa được áp dụng, do đó không cần gọi riêng AddFilter ().

Ví dụ sau tạo một bộ lọc bao gồm tất cả các bức tường có thuộc tính Nhận xét được đặt thành "foo". Sau đó, bộ lọc được áp dụng cho Chế độ xem để bất kỳ bức tường nào đáp ứng tiêu chí này đều được tô

màu đỏ.

Vùng mã: Áp dụng bộ lọc cho chế độ xem


1. private void CreateViewFilter (Autodesk.Revit.DB.Document doc, View view) 2. { 3.

Danh sách các danh mục <ElementId> = new Danh sách <ElementId>
4. (); Category.Add (ElementId mới (BuiltInCategory.OST_Walls));
5. ParameterFilterElement tham sốFilterElement = ParameterFilterElement.Create (doc, "Comments = foo", category);
6.
7. FilteredElementCollector tham sốCollector = new FilteredElementCollector (doc); Tham số tham số = tham
số 8.
sốCollector.OfClass (typeof (Tường)). FirstElement (). Get_Parameter ("Nhận xét");
9.
10. List <FilterRule> filterRules = new List <FilterRule> ();
11. filterRules.Add (ParameterFilterRuleFactory.CreateEqualsRule (tham số.Id, "foo", true)); tham
12. sốFilterElement.SetRules (filterRules);
13.
14.
15. OverrideGraphicSettings filterSettings = new OverrideGraphicSettings (); // phác các bức
16. tường bằng màu đỏ filterSettings.SetProjectionLineColor (new Color (255, 0, 0));
17. view.SetFilterOverrides (tham sốFilterElement.Id, filterSettings);
18.
19. }

Tất cả các bộ lọc được áp dụng cho một chế độ xem có thể được truy xuất bằng cách sử dụng phương thức View.GetFilters (), phương thức này sẽ trả về một danh sách các id bộ lọc. Khả năng hiển thị bộ lọc

và ghi đè đồ họa có thể được kiểm tra cho một bộ lọc cụ thể bằng cách sử dụng các phương thức View.GetFilterVisibility () và View.GetFilterOverrides () tương ứng. View.RemoveFilter sẽ xóa một bộ lọc khỏi

quang cảnh.

Xem phần cắt xén

Vùng cắt cho một số chế độ xem có thể được sửa đổi bằng cách sử dụng API Revit. Thuộc tính ViewCropRegionShapeManager.Valid cho biết chế độ xem có được phép quản lý hình dạng vùng cắt hay không trong khi

thuộc tính ShapeSet cho biết liệu một hình dạng đã được thiết lập hay chưa. Ví dụ sau đây cắt một chế độ xem xung quanh ranh giới của một căn phòng.

Vùng mã: Cắt chế độ xem


1. public void CropAroundRoom (Căn phòng, View view) 2. { 3.

if (view! = null) {
4.
5. IList <IList <Autodesk.Revit.DB.BoundarySegment >> segment = room.GetBoundarySegment (new SpatialElementBoundaryOptions ());
6.
7. if (null ! = segment) // phòng có thể không bị ràng buộc {

8. 9. foreach (IList <Autodesk.Revit.DB.BoundarySegment> segmentList in segment) {


10.
11. Vòng lặp CurveLoop = new CurveLoop ();
12. foreach (Autodesk.Revit.DB.BoundarySegment ranh giới Segment trong segmentList) {
13.
14. loop.Append (borderSegment.Curve);
15. }
16.
17. ViewCropRegionShapeManager vcrShapeMgr = view.GetCropRegionShapeManager ();
18. vcrShapeMgr.SetCropRegionShape (vòng lặp); phá vỡ; // nếu có nhiều hơn một tập hợp các phân
19. đoạn ranh giới cho phòng, hãy cắt xung quanh phân đoạn đầu tiên
20. }
21. }
22. }
23. }
Machine Translated by Google

Chế độ xem bị loại bỏ

Tạo một dạng xem đã thay thế bằng cách sử dụng lớp DisplacementElement. DisplacementElement là một phần tử dành riêng cho chế độ xem có thể được sử dụng để làm cho các phần tử có vẻ bị

dịch chuyển khỏi vị trí thực của chúng. Các khung nhìn lệch vị trí rất hữu ích để minh họa các phần tử của mô hình mối quan hệ phải có đối với mô hình nói chung. DisplacementElement không

thực sự thay đổi vị trí của bất kỳ phần tử mô hình nào; nó chỉ khiến chúng được hiển thị ở một vị trí khác.

Để biết ví dụ chi tiết về việc tạo các chế độ xem bị dịch chuyển, hãy xem mẫu DisplacementElementAnimation trong Revit SDK.

Tạo chế độ xem được sắp xếp

Phương thức DisplacementElement.Create () tĩnh tạo ra một DisplacementElement mới. DisplacementElement mới có thể là con của DisplacementElement cha nếu tham số

parentDisplacementElement không rỗng. Nếu một phần tử gốc được chỉ định, thì biến đổi DisplacementElement con sẽ được nối với biến đổi của cha mẹ và chuyển vị của các phần tử liên quan

của nó sẽ tương đối với DisplacementElement cha.

Phương thức Create () cũng yêu cầu một tài liệu, danh sách các phần tử được dịch chuyển, chế độ xem chủ sở hữu và bản dịch được áp dụng cho đồ họa của các phần tử bị dịch chuyển.

Một phần tử chỉ có thể bị thay thế bởi một DisplacementElement duy nhất trong bất kỳ chế độ xem nào. Việc gán một phần tử cho nhiều hơn một DisplacementElement sẽ dẫn đến một ngoại lệ.

Các phương thức tĩnh khác của DisplacementElement có thể được sử dụng trước khi gọi Create () để giúp ngăn chặn bất kỳ ngoại lệ nào. CanCategoryBeDisplaced () kiểm tra xem các phần tử

thuộc một danh mục cụ thể có thể được thay thế hay không, trong khi phương thức tĩnh quá tải CanElementsBeDisplaced () cho biết liệu các phần tử cụ thể có thể được gán cho một

DisplacementElement mới hay không. IsAllowedAsDisplacedElement () kiểm tra một phần tử duy nhất xem có đủ điều kiện để bị thay thế hay không.

Phương thức GetAdditionalElementsToDisplace () tĩnh sẽ trả về bất kỳ phần tử bổ sung nào cần được thay thế cùng với phần tử được chỉ định trong một dạng xem được chỉ định. Ví dụ:

khi một bức tường bị dịch chuyển, bất kỳ phần chèn hoặc phần tử được lưu trữ nào cũng phải bị dịch chuyển.

Khi tạo một DisplacementElement con, IsValidAsParentInView () tĩnh có thể được sử dụng để xác minh một DisplacementElement cụ thể có thể được sử dụng làm cha mẹ trong một View cụ thể.

Các phương thức tĩnh khác của DisplacementElement có thể được sử dụng để tìm DisplacementElement bao gồm một phần tử cụ thể, để lấy danh sách tất cả các phần tử bị dịch chuyển trong

một Chế độ xem hoặc để lấy tất cả các DisplacementElements thuộc sở hữu của một Chế độ xem đã chỉ định.

Làm việc với các phần tử được đặt

Khi một DisplacementElement mới đã được tạo, các phương thức có sẵn để lấy bất kỳ DisplacementElements con nào, để lấy id của tất cả các phần tử bị ảnh hưởng bởi DisplacementElement hoặc

để lấy id của tất cả các phần tử bị ảnh hưởng bởi DisplacementElement cũng như bất kỳ DisplacementElements nào. Thuộc tính ParentId sẽ trả về id phần tử của DisplacementElement cha, nếu có.

Sau khi tạo, tập hợp các phần tử bị ảnh hưởng bởi DisplacementElement có thể được sửa đổi bằng cách sử dụng SetDisplacedElementIds () hoặc RemoveDisplacedElement ().

Ngoài ra, độ dịch chuyển tương đối có thể được thay đổi.

Phương thức ResetDisplacedElements () sẽ đặt bản dịch của DisplacementElement thành (0, 0, 0). DisplacementElement tiếp tục tồn tại, nhưng các phần tử của nó được hiển

thị ở vị trí thực tế của chúng.

Tạo một đường dẫn có vị trí

DisplacementPath là một chú thích dành riêng cho chế độ xem liên quan đến DisplacementElement. Lớp DisplacementPath tạo một chú thích mô tả chuyển động của phần tử từ vị trí

thực tế đến vị trí bị dịch chuyển của nó. DisplacementPath được neo vào DisplacementElement bằng một tham chiếu đến một điểm trên một cạnh của phần tử đã dịch chuyển của

DisplacementElement. Nó được biểu diễn bằng một đường hoặc một chuỗi các đường chạy nhanh, bắt nguồn từ điểm được chỉ định trên phần tử đã dịch chuyển.

Phương thức DisplacementPath.Create () tĩnh yêu cầu một tài liệu, id của DisplacementElement được liên kết, một tham chiếu đề cập đến một cạnh hoặc đường cong của một trong

các phần tử được thay thế bởi DisplacementElement và một giá trị trong phạm vi [0,1] đó là một tham số dọc theo cạnh được chỉ định.

Sau khi được tạo, kiểu đường dẫn của DisplacementPath có thể được thiết lập bằng cách sử dụng thuộc tính PathStyle. Điểm neo cũng có thể được thay đổi bằng

cách sử dụng SetAnchorPoint ().

DisplacementElement được liên kết có thể có DisplacementElement cha mẹ và cha mẹ này có thể có DisplacementElement cha mẹ của chính nó, tạo ra một loạt tổ tiên. Điểm đầu

cuối có thể là vị trí ban đầu (chưa được dịch chuyển) của điểm hoặc điểm tương ứng trên bất kỳ vị trí nào đã được dịch chuyển trung gian tương ứng với các Thiết bị di

dời tổ tiên này. Thuộc tính DisplacementPath.AncestorIdx chỉ định điểm cuối của đường dẫn.
Machine Translated by Google

UIView
Trong khi lớp View là lớp cơ sở cho tất cả các kiểu xem trong Revit và theo dõi các phần tử trong dạng xem, lớp UIView chứa dữ liệu về các cửa sổ dạng xem trong giao diện người

dùng Revit. Danh sách tất cả các dạng xem đang mở có thể được truy xuất từ UIDocument bằng phương thức GetOpenUIViews (). Lớp UIView có các phương thức để lấy thông tin về vùng vẽ các

khung nhìn cũng như xoay và thu phóng khung nhìn đang hoạt động.

UIView.GetWindowRectangle () trả về một hình chữ nhật mô tả kích thước và vị trí của cửa sổ UIView. Nó không bao gồm đường viền cửa sổ hoặc thanh tiêu đề.

Thao tác thu phóng

UIView có một số phương pháp liên quan đến việc thu phóng chế độ xem đang hoạt động. UIView.GetZoomCorners () lấy các góc của hình chữ nhật của chế độ xem theo tọa độ mô hình và

UIView.ZoomAndCenterRectangle () cung cấp khả năng thu phóng và xoay chế độ xem đang hoạt động để căn giữa vùng đầu vào của mô hình.

Các phương thức ZoomToFit () và ZoomSheetSize () cung cấp các cách nhanh chóng để điều chỉnh thu phóng của cửa sổ, trong khi phương thức Zoom () có thể được sử dụng để phóng to hoặc thu

nhỏ theo một hệ số cụ thể.

Đóng một lượt xem

UIView.Close () có thể đóng một cửa sổ có thể nhìn thấy được. Tuy nhiên, nó không thể được sử dụng để đóng cửa sổ hoạt động cuối cùng. Cố gắng đóng cửa sổ hoạt động cuối cùng sẽ tạo ra

một ngoại lệ.


Machine Translated by Google

Các yếu tố hình học Revit

Tường, Sàn nhà, Trần nhà, Mái nhà và Khe hở

Chương này thảo luận về các phần tử và các loại phần tử tương ứng đại diện cho cấu trúc vị trí được tích hợp sẵn:

• HostObject - Hai phần đầu tiên tập trung vào HostObject và các lớp con HostObjAttributes tương ứng

• Nền tảng - Các nền tảng khác nhau trong API được biểu diễn dưới dạng các lớp khác nhau, bao gồm Tầng, ContFooting và FamilyInstance.
Phần Sàn và Nền so sánh chúng trong API.

• CompoundStructure - Phần này mô tả lớp CompoundStructure và cung cấp quyền truy cập vào Material.

Một số loại phần tử chủ có đặc tính nhiệt được mô tả trong phần Thuộc tính nhiệt.

Ngoài các Element máy chủ, lớp Khai mạc được giới thiệu ở cuối phần này.

Tường

Có bốn loại Tường được đại diện bởi kiểu liệt kê WallType.WallKind:

• Xếp chồng lên nhau

• Tấm màn

• Nền tảng

• Không xác định

Lớp Wall và WallType hoạt động với loại tường Cơ bản trong khi cung cấp chức năng hạn chế cho các bức tường Xếp chồng và Rèm. Thỉnh thoảng bạn cần kiểm tra Tường
để xác định loại tường. Ví dụ: bạn không thể lấy tường phụ từ Tường xếp chồng bằng API. WallKind chỉ được đọc và được thiết lập bởi System Family.

Thuộc tính Wall.Flipped và phương thức Wall.flip () có quyền truy cập và kiểm soát hướng Tường. Trong các ví dụ sau, một Tường được so sánh trước và sau khi
gọi phương thức flip ().

• Thuộc tính Orientation trước đây là (0.0, 1.0, 0.0).

• Thuộc tính Định hướng sau cuộc gọi lật là (0.0, -1.0, 0.0).

• Tham số Đường Vị trí Tường (WALL_KEY_REF_PARAM) là 3, đại diện cho Mặt hoàn thiện: Nội thất trong bảng sau.

• Lấy dòng làm tham chiếu, Bức tường được di chuyển nhưng Vị trí không thay đổi.

Hình 33: Bức tường ban đầu

Hình 34: Tường sau khi lật

Bảng 24: Đường vị trí tường

Mô tả Giá trị Dòng Vị trí

0 Đường tâm tường

1 Đường trung tâm chính

2 Hoàn thiện mặt: Ngoại thất

3 Hoàn thiện mặt: Nội thất

4 Mặt cốt lõi: Ngoại thất

5 Mặt cốt lõi: Nội thất


Machine Translated by Google

Có năm phương thức ghi đè tĩnh trong lớp Wall để tạo Tường:

Bảng 25: Tạo () Ghi đè

Tên Sự mô tả

Tạo (Document, Curve, WallType, Level, Double, Double, Tạo tường hồ sơ hình chữ nhật mới trong dự án bằng cách sử dụng loại tường, chiều cao và độ lệch

Boolean, Boolean) được chỉ định.

Tạo (Tài liệu, IList <Curve>, Boolean) Tạo tường hồ sơ không phải hình chữ nhật trong dự án bằng cách sử dụng kiểu tường mặc định.

Tạo (Document, Curve, ElementId, Boolean) Tạo một tường hồ sơ hình chữ nhật mới trong dự án ở cấp độ được chỉ định bởi ElementId bằng cách

sử dụng kiểu tường mặc định.

Tạo (Document, IList <Curve>, ElementId, ElementId, Tạo tường hồ sơ không phải hình chữ nhật trong dự án bằng cách sử dụng loại tường được chỉ định.

Boolean)

Tạo (Document, IList <Curve>, ElementId, ElementId, Tạo tường hồ sơ không phải hình chữ nhật trong dự án bằng cách sử dụng loại tường được chỉ định và vectơ

Boolean, XYZ) pháp tuyến.

Tham số WallType Wall Function (WALL_ATTR_EXTERIOR) ảnh hưởng đến tham số Room Bound and Structural Usage của phiên bản tường đã tạo. Giá trị WALL_ATTR_EXTERIOR là một
số nguyên:

Bảng 26: Chức năng của tường

Chức năng tường Nội địa Nền móng bên ngoài Giữ lại Soffit

Giá trị 0 1 2 3 4

Các quy tắc sau áp dụng cho Tường do API tạo:

• Nếu tham số kết cấu đầu vào là true hoặc tham số Chức năng tường (WALL_ATTR_EXTERIOR) là Móng, thì Tường
Tham số StructuralUsage là Bearing; nếu không thì nó là NonBnking.

• Tham số Wall Room Bound (WALL_ATTR_ROOM_BOUNDING) đã tạo là false nếu Hàm Wall (WALL_ATTR_EXTERIOR)
tham số là Đang giữ lại.

Để biết thêm thông tin về các chức năng liên quan đến cấu trúc như thuộc tính AnalyticalModel, hãy tham khảo Revit Structure.

Sàn nhà, trần nhà và nền móng


Các hạng mục API liên quan đến Sàn, Trần và Nền bao gồm:

Bảng 28: Sàn, Trần và Nền trong API

Sự vật Loại nguyên tố Phần tử Loại ElementType Tạo phần tử Khác

Sàn nhà Sàn nhà FloorType NewFloor () / NewSlab () FloorType.IsFoundationSlab = false

Phiến Sàn nhà FloorType NewSlab () FloorType.IsFoundationSlab = false

Trần nhà Trần nhà CeilingType Không Category = OST_Cerors

Nền tảng tường ContFooting ContFootingType Không Danh mục = OST_StructuralFoundation

Isolated Foundation FamilyInstance FamilySymbol NewFamilyInstance () Danh mục = OST_StructuralFoundation

Tấm nền móng Sàn nhà FloorType NewFloor () Danh mục = OST_StructuralFoundation

FloorType.IsFoundationSlab = true
Machine Translated by Google

Lưu ý: Tầng và Trần bắt nguồn từ lớp CeilingAndFloor.

Các quy tắc sau áp dụng cho Sàn:

• Các phần tử được tạo từ thanh Thiết kế nền có cùng danh mục, OST_StructuralFoundation, nhưng tương ứng với các
Các lớp học.

• Thuộc tính FloorType IsFoundationSlab đặt danh mục FloorType thành OST_StructuralFoundation hoặc không.

Khi bạn truy xuất FloorType để tạo Sàn hoặc Tấm nền với NewFloor, hãy sử dụng các phương pháp sau:

Hình 35: Tạo móng và sàn / sàn

Hiện tại, API không cung cấp quyền truy cập vào Mũi tên độ dốc của tầng trong lớp Tầng. Tuy nhiên, trong Revit Structure, bạn có thể tạo một bản sàn nghiêng
với NewSlab ():

Vùng mã 11-1: NewSlab ()


1. Tầng công cộng NewSlab (Hồ sơ CurveArray, Mức độ, Đường dốcArrow, độ dốc kép , 2. bool isStructural);

Mũi tên dốc được tạo bằng tham số dốcArrow.

Hình 36: Tham số dốcArrow trong NewSlab

Đơn vị cho tham số độ dốc trong NewSlab () là tăng / chạy.

Thuộc tính Floor.FloorType là một giải pháp thay thế cho việc sử dụng phương thức Floor.GetTypeId (). Để biết thêm thông tin về các thành viên liên
quan đến cấu trúc như phương thức GetSpanDirectionSymbolIds () và thuộc tính SpanDirectionAngle, hãy tham khảo Revit Structure chương.
Machine Translated by Google

Khi chỉnh sửa Isolated Foundation trong Revit, bạn có thể thực hiện các hành động sau:

• Bạn có thể chọn một máy chủ, chẳng hạn như một tầng. Tuy nhiên, thuộc tính Host của đối tượng FamilyInstance luôn trả về null.

• Khi xóa tầng chủ, Nền sẽ không bị xóa cùng với nó.

• Máy chủ Foundation có sẵn từ tham số Máy chủ (INSTANCE_FREE_HOST_PARAM).

• Sử dụng tham số Offset (INSTANCE_FREE_HOST_OFFSET_PARAM) có liên quan khác để kiểm soát độ lệch móng từ máy chủ
Yếu tố.

Hình 37: Chọn Host cho FoundationSlab (FamilyInstance)

Các móng liên tục được đại diện bởi lớp ContFooting trong API. API cung cấp quyền truy cập hạn chế vào cả ContFooting và ContFootingType ngoại trừ khi sử

dụng phương thức GetAnalyticalModel () (tham khảo AnalyticalModel trong Cấu trúc Revit tiết diện). Ví dụ, bức tường đính kèm không có sẵn trong Revit

Architecture. Trong Revit Structure, mối quan hệ giữa lớp Wall và lớp ContFooting được hiển thị bằng phương thức GetAnalyticalModelSupports () trong lớp

AnalyticalModel. Để biết thêm chi tiết, hãy tham khảo AnalyticalModelSupport trong Cấu trúc Revit tiết diện.

Hình 38: Wall ContFooting

Sửa đổi phiến

Bạn có thể sửa đổi hình thức của các phần tử dựa trên phiến bằng cách sử dụng lớp SlabShapeEditor. Lớp này cho phép bạn:

• Thao tác một hoặc nhiều điểm hoặc cạnh trên một phần tử dựa trên bản sàn đã chọn

• Thêm điểm trên phần tử để thay đổi hình dạng của phần tử

• Thêm các cạnh tuyến tính và chia mặt hiện có của tấm thành các vùng phụ nhỏ hơn

• Loại bỏ công cụ sửa đổi hình dạng và đặt lại hình học của phần tử trở lại hình dạng chưa được sửa đổi.
Machine Translated by Google

Dưới đây là một ví dụ về việc hoàn nguyên một tầng đã sửa đổi đã chọn trở lại hình dạng ban đầu:

Vùng mã 11-2: Hoàn nguyên hình dạng của tấm

1. private void ResetSlabShapes (tài liệu Autodesk.Revit.DB.Document) 2. { 3.

UIDocument uidoc = new UIDocument (tài liệu); Lựa chọn


4. lựa chọn = uidoc.Selection; Bộ sưu tập ElementSet =
5. options.Elements; foreach (Autodesk.Revit.DB.Element
6. elem trong bộ sưu tập) {
7.
số 8. Tầng lầu = elem as Sàn; if (tầng!
9. = null) {
10.
11. SlabShapeEditor slabShapeEditor = floor.SlabShapeEditor;
12. slabShapeEditor.ResetSlabShape ();
13. }
14. }
15. }

Để biết thêm các ví dụ chi tiết về việc sử dụng SlabShapeEditor và các lớp liên quan, hãy xem ứng dụng mẫu SlabShapeE Chỉnh sửa có trong Revit SDK.

Mái nhà

Các mái nhà trong API Nền tảng Revit đều bắt nguồn từ đối tượng RoofBase. Có hai lớp:

• FootPrintRoof - đại diện cho một mái nhà được tạo ra từ dấu chân của tòa nhà

• ExtrusionRoof - đại diện cho mái nhà được làm từ một cấu hình ép đùn

Cả hai đều có thuộc tính RoofType lấy hoặc đặt kiểu mái. Ví dụ này cho thấy cách bạn có thể tạo một mái nhà có diện tích dựa trên một số bức tường đã chọn:

Vùng mã 11-3: Tạo mái che dấu chân

// Trước khi gọi mẫu này, hãy chọn một số bức tường để thêm một mái nhà.
// Đảm bảo rằng có một cấp có tên là "Roof" trong tài liệu.

// tìm cấp độ Mái nhà

FilteredElementCollector collector = new FilteredElementCollector (tài liệu);


collector.WherePasses (ElementClassFilter mới (typeof (Level)));
var Elements = from element in collector where element.Name == "Roof" chọn phần tử;

Mức level = các phần tử.Cast <Level> () .ElementAt <Level> (0);

RoofType dometype = null;


// chọn kiểu mái đầu tiên
foreach (RoofType rt trong document.RoofTypes)
{
kiểu mái = rt;
phá vỡ;

// Nhận xử lý của ứng dụng


Ứng dụng Autodesk.Revit.ApplicationServices.Application = document.Application;

// Xác định diện tích cho mái dựa trên lựa chọn của người dùng
Dấu chân CurveArray = application.Create.NewCurveArray ();
UIDocument uidoc = new UIDocument (tài liệu);
if (uidoc.Selection.Elements.Size! = 0)
{
foreach (phần tử Autodesk.Revit.DB.Element trong uidoc.Selection.Elements)
{
Wall wall = phần tử như Tường;

if (wall! = null)
{
LocationCurve wallCurve = wall.Location as LocationCurve;

footprint.Append (wallCurve.Curve);
tiếp tục;

}
Machine Translated by Google

ModelCurve modelCurve = phần tử như ModelCurve;

if (modelCurve! = null)
{
footprint.Append (modelCurve.GeometryCurve);
}
}
}
khác

{
ném Ngoại lệ mới ("Bạn nên chọn một vòng lặp đường cong, hoặc một vòng lặp tường, hoặc kết hợp vòng lặp \ nof tường và đường cong để tạo
một mái nhà dấu chân. ");
}

ModelCurveArray footPrintToModelCurveMapping = new ModelCurveArray ();


FootPrintRoof footprintRoof = document.Create.NewFootPrintRoof (dấu chân, cấp độ, kiểu mái, ra footPrintToModelCurveMapping);
Trình lặp ModelCurveArrayIterator = footPrintToModelCurveMapping.ForwardIterator ();
trình lặp.Reset ();
while (iterator.MoveNext ())
{
ModelCurve modelCurve = iterator.Current as ModelCurve;
footprintRoof.set_DefinesSlope (modelCurve, true);
footprintRoof.set_SlopeAngle (modelCurve, 0,5);
}

Để biết ví dụ về cách tạo Ext ExtractionRoof, hãy xem ứng dụng mẫu NewRoof đi kèm với Revit API SDK.

Gutter và Fascia

Các phần tử Gutter và Fascia có nguồn gốc từ lớp HostedSweep, đại diện cho một mái nhà. Chúng có thể được tạo, xóa hoặc sửa đổi thông qua API. Để tạo các
phần tử này, hãy sử dụng một trong các ghi đè Document.Create.NewFascia () hoặc Document.Create.NewGutter (). Để biết ví dụ về cách tạo máng xối và tấm đệm mới,
hãy xem ứng dụng NewHostedSweep có trong các mẫu SDK. Dưới đây là đoạn mã cho thấy bạn có thể sửa đổi các thuộc tính của phần tử máng xối.

Vùng mã 11-4: Sửa đổi máng xối

public void ModifyGutter (tài liệu Autodesk.Revit.DB.Document)


{
UIDocument uidoc = new UIDocument (tài liệu);
Bộ sưu tập ElementSet = uidoc.Selection.Elements;

foreach (Autodesk.Revit.DB.Element elem trong bộ sưu tập)


{
nếu (elem là Gutter)
{
Máng xối Gutter = elem as Gutter;
// chuyển đổi độ sang rads:
máng xối.Angle = 45,00 * Math.PI / 180;
TaskDialog.Show ("Revit", "Đã thay đổi góc máng xối");
}
}
}

Rèm cửa

Các bức tường rèm, hệ thống rèm và mái rèm là các yếu tố chủ yếu cho các đối tượng CurtainGrid. Một bức tường rèm có thể chỉ có một CurtainGrid, trong
khi hệ thống rèm và mái rèm có thể chứa một hoặc nhiều CurtainGrid. Để biết ví dụ về cách tạo CurtainSystem, hãy xem ứng dụng mẫu CurtainSystem đi kèm với
Revit SDK. Để biết ví dụ về việc tạo một bức tường rèm và đặt nó bằng các đường lưới, hãy xem ứng dụng mẫu CurtainWallGrid.

Các yếu tố khác

Một số Phần tử không phải là HostObjects (và không có một lớp cụ thể), nhưng là những trường hợp đặc biệt có thể lưu trữ các đối tượng khác. Ví dụ: đường
nối và loại phần tử được liên kết của nó, không có các lớp cụ thể trong API và thay vào đó được biểu thị dưới dạng Phần tử và Loại phần tử trong danh mục
OST_Ramps.
Machine Translated by Google

CompoundStructure

Tường, sàn, trần và mái đều là con của HostObject lớp API. HostObject (và lớp kiểu liên quan HostObjAttributes của nó) cung cấp quyền truy cập chỉ đọc vào

CompoundStructure.

Lớp CompoundStructure cung cấp quyền truy cập đọc và ghi vào một tập hợp các lớp bao gồm các vật liệu khác nhau:

CompoundStructure.GetLayers ()

CompoundStructure.SetLayers ()

Thông thường các lớp này nằm song song và mở rộng toàn bộ đối tượng chủ với chiều rộng lớp cố định. Tuy nhiên, đối với tường, cấu trúc cũng có thể là “hợp

chất theo chiều dọc”, trong đó các lớp thay đổi theo khoảng cách thẳng đứng xác định từ đỉnh và đáy tường. Sử dụng CompoundStructure.IsVerentlyCompound để xác

định những điều này. Đối với cấu trúc phức hợp theo chiều dọc, cấu trúc mô tả một mặt cắt dọc thông qua hình chữ nhật được chia thành các vùng đa giác có các cạnh là tất

cả các đoạn thẳng đứng hoặc ngang. Bản đồ liên kết từng vùng này với chỉ mục của một lớp trong CompoundStructure, lớp xác định các thuộc tính của vùng đó.

Có thể sử dụng cấu trúc hợp chất để tìm vị trí hình học của các ranh giới lớp khác nhau. Phương thức

CompoundStructure.GetOffsetForLocationLine () cung cấp độ lệch từ đường vị trí trung tâm đến bất kỳ tùy chọn đường vị trí nào (đường trung tâm lõi, mặt hoàn thiện ở hai

bên hoặc các cạnh lõi).

Với sự bù đắp cho đường vị trí có sẵn, bạn có thể có được vị trí của ranh giới từng lớp bằng cách bắt đầu từ một vị trí đã biết và thu được chiều rộng của từng lớp bao

quanh bằng cách sử dụng CompoundStructure.GetLayerWidth ().

Một số lưu ý về việc sử dụng CompoundStructure:

Tổng chiều rộng của phần tử là tổng chiều rộng của mỗi CompoundStructureLayer. Bạn không thể thay đổi tổng chiều rộng của phần tử một cách trực tiếp nhưng bạn có thể

thay đổi nó bằng cách thay đổi chiều rộng CompoundStructureLayer. Chỉ số của lớp có độ dài biến đổi được chỉ định (nếu được chỉ định) có thể được lấy từ

CompoundStructure.VariableLayerIndex.

Bạn phải đặt CompoundStructure trở lại thể hiện HostObjAttributes (sử dụng phương thức HostObjAttributes.SetCompoundStructure ()) để lưu trữ bất kỳ thay đổi nào.

Các thay đổi đối với HostObjAttributes ảnh hưởng đến mọi phiên bản trong tài liệu hiện tại. Nếu bạn cần kết hợp các lớp mới, bạn sẽ cần tạo HostObjAttributes mới

(sử dụng ElementType.Duplicate ()) và gán CompoundStructure mới cho nó.

Các thuộc tính CompoundStructureLayer DeckProfileId và DeckEmbeddingType, chỉ hoạt động với Slab trong Revit Structure. Để biết thêm chi tiết, hãy tham khảo Revit

Kết cấu.

Vật chất

Mỗi CompoundStructureLayer trong HostObjAttributes thường được hiển thị với một số loại vật liệu. Nếu CompoundStructureLayer.MaterialId trả về -1, điều đó có nghĩa là Vật

liệu có liên quan đến Danh mục. Để biết thêm chi tiết, hãy tham khảo Vật liệu. Lấy Vật liệu CompoundStructureLayer được minh họa trong mẫu sau
mã số:

Vùng mã 11-5: Lấy vật liệu CompoundStructureLayer

1. public void GetWallLayerMaterial (tài liệu Autodesk.Revit.DB.Document, Wall wall) 2. { 3.

// lấy WallType của tường


4. WallType aWallType = wall.WallType; // Chỉ
5. Tường cơ bản mới có compoundStructure if
6. (WallKind.Basic == aWallType.Kind) {
7.

8. 9. // Lấy CompoundStructure
10. CompoundStructure comStruct = aWallType.GetCompoundStructure (); Danh mục
11. allCategories = document.Settings.Categories;
12.
13. // Lấy loại vật liệu mặc định OST_Walls; // sử dụng nếu Vật
14. liệu mặc định của lớp đó là <Theo Danh mục> Danh mục wallCategory =
15. allCategories.get_Item (BuiltInCategory.OST_Walls); Autodesk.Revit.DB.Material wallMaterial =
16. wallCategory.Material;
17.
18. foreach (CompoundStructureLayer structLayer trong comStruct.GetLayers ()) {
19.
20. Autodesk.Revit.DB.Material layerMaterial =
21. document.GetElement (structLayer.MaterialId) as Material;
22.
23. // Nếu Vật liệu của CompoundStructureLayer được chỉ định, hãy sử dụng mặc định
24. // Vật liệu của Danh mục của nó if
25. (null == layerMaterial) {
26.
Machine Translated by Google

27. switch (structLayer.Function) {


28.
29. case MaterialFunctionAssignment.Finish1:
30. layerMaterial = allCategories.get_Item
31. (BuiltInCategory.OST_WallsFinish1) .Material; phá vỡ; case
32. MaterialFunctionAssignment.Finish2: layerMaterial = allCategories.get_Item
33. (BuiltInCategory.OST_WallsFinish2) .Material; phá vỡ; case MaterialFunctionAssignment.Membrane:
34.
35.
36.
37.
38. layerMaterial =
39. allCategories.get_Item (BuiltInCategory.OST_WallsMembrane) .Material; phá vỡ; case
40. MaterialFunctionAssignment.Structure: layerMaterial = allCategories.get_Item
41. (BuiltInCategory.OST_WallsStructure) .Material; phá vỡ; case MaterialFunctionAssignment.Substrate:
42. layerMaterial = allCategories.get_Item (BuiltInCategory.OST_WallsSubstrate) .Material; phá
43. vỡ; case MaterialFunctionAssignment.Insulation: layerMaterial = allCategories.get_Item
44. (BuiltInCategory.OST_WallsInsulation) .Material; phá vỡ; default: // Không thể truy cập vào
45. đây break;
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57. } if (null == layerMaterial) {
58.
59. // Vật liệu mặc định của CompoundStructureLayer là SubCategory layerMaterial =
60. wallMaterial;
61. }
62. }
63. TaskDialog.Show ("Revit", " Vật liệu lớp:" + layerMaterial);
64. }
65. }
66. }

Đôi khi chỉ cần vật liệu từ lớp "cấu trúc". Thay vì xem xét từng lớp để tìm lớp có chức năng là MaterialFunctionAssignment.Structure,

hãy sử dụng thuộc tính CompoundStructure.StructuralMaterialIndex để tìm chỉ mục của lớp có vật liệu xác định thuộc tính cấu trúc của loại cho mục đích phân tích.

Khai mạc
Trong Revit Platform API, đối tượng Mở có nguồn gốc từ đối tượng Phần tử và chứa tất cả các thuộc tính và phương thức của đối tượng Phần tử. Để truy
xuất tất cả các Mở trong một dự án, hãy sử dụng Document.ElementIterator để tìm các đối tượng Elements.Opening.

Thuộc tính chung

Phần này giải thích cách sử dụng thuộc tính Mở.

• IsRectBoundary - Xác định xem lỗ mở có ranh giới hình chữ nhật hay không.

o Nếu đúng, điều đó có nghĩa là Mở có ranh giới hình chữ nhật và bạn có thể nhận bộ sưu tập IList <XYZ> từ Mở
Thuộc tính BoundaryRect. Nếu không, thuộc tính trả về null.

o Nếu sai, bạn có thể lấy một đối tượng CurveArray từ thuộc tính BoundaryCurves.

• BoundaryCurves - Nếu ranh giới mở không phải là hình chữ nhật, thuộc tính này truy xuất thông tin hình học; nếu không nó trả về null.
Thuộc tính trả về một đối tượng CurveArray chứa các đường cong đại diện cho ranh giới của đối tượng Đang mở.

Để biết thêm chi tiết về Curve, hãy tham khảo Hình học.

• BoundaryRect - Nếu ranh giới mở là hình chữ nhật, bạn có thể lấy thông tin hình học bằng cách sử dụng thuộc tính này; nếu không nó trở lại
vô giá trị.

o Thuộc tính trả về một tập hợp IList <XYZ> chứa các tọa độ XYZ.

o Bộ sưu tập IList <XYZ> thường chứa ranh giới hình chữ nhật tối thiểu (phía dưới bên trái) và tối đa (phía trên bên phải)
tọa độ.

• Máy chủ lưu trữ - Thuộc tính máy chủ truy xuất phần tử máy chủ lưu trữ Đang mở. Phần tử chủ là phần tử bị cắt bởi đối tượng Mở.

Lưu ý Nếu danh mục của đối tượng Mở là Lỗ mở trục, thì máy chủ Mở là rỗng.

Ví dụ sau minh họa cách truy xuất các thuộc tính Mở hiện có.
Machine Translated by Google

Vùng mã 11-6: Truy xuất các thuộc tính mở hiện có

1. private void Getinfo_Opening (Mở đầu) 2. { 3. 4.

string message = "Đang mở:";

// lấy phần tử máy chủ của thư mở đầu này + = "\


"
5. 6. n Id của phần tử máy chủ của phần mở đầu là: + open.Host.Id.IntegerValue;

7. 8. // lấy thông tin cho dù lỗ mở có ranh giới trực tràng hay không // Nếu lỗ mở có
9. ranh giới trực tràng, chúng ta có thể lấy thông tin hình học từ thuộc tính BoundaryRect.
10. // Nếu không, chúng ta sẽ lấy thông tin hình học từ thuộc tính BoundaryCurves if (opens.IsRectBoundary) {
11.
12.
13. message + = "\ nViệc mở có ranh giới hình chữ nhật."; // mảng chứa hai
14. đối tượng XYZ: coords max và min của ranh giới IList <XYZ> borderRect = open.BoundaryRect;
15.
16.
17. // lấy giá trị tọa độ của điểm tọa độ min XYZ point = opens.BoundaryRect
18. [0]; message + = "\ nĐiểm tọa độ :(" + point.X + "," + point.Y + "," +
19. point.Z + ")";
20.
21.
22. // lấy giá trị tọa độ của điểm tọa độ Max point = open.BoundaryRect [1];
23. message + = "\ nĐiểm tọa độ tối đa: (" + point.X + "," + point.Y + ","
24. + point.Z + ")";
25.
26.
27. }
28. khác {
29. message + = "\ nViệc mở không có ranh giới hình chữ nhật."; // Lấy số đường cong int
30. curve = opens.BoundaryCurves.Size; message + = "\ nSố đường cong là: for (int i =
31. 0; i <curve; i ++) {
"
32. + các đường cong;

33.
34.
35. Autodesk.Revit.DB.Curve curve = opens.BoundaryCurves.get_Item (i); // Nhận thông báo về
36. điểm bắt đầu của đường cong + = "\ nĐiểm bắt đầu của đường cong:"
37. + XYZToString (curve.GetEndPoint (0));
38. // Lấy điểm cuối đường cong
39. thúc của đường cong:" + XYZToString (curve.GetEndPoint (1)); message + = "; Điểm kết
40. }
41. }
42. TaskDialog.Show ("Revit", thông báo);
43. }
44.
45. // xuất ra ba tọa độ của điểm 46. string XYZToString
(XYZ point) 47. { 48. 49. }

return "(" + point.X + "," + điểm.Y + "," + point.Z + ")";

Tạo phần mở đầu

Trong API nền tảng Revit, hãy sử dụng phương thức Document.NewOpening () để tạo phần mở trong dự án của bạn. Có bốn phương thức quá tải bạn có thể sử dụng
để tạo các lỗ mở trong các phần tử máy chủ lưu trữ khác nhau:

Vùng mã 11-7: NewOpening ()

// Tạo một Mở mới trong một chùm, dấu ngoặc nhọn và cột. Mở
công khai NewOpening (Element famInstElement, hồ sơ CurveArray, eRefFace iFace);

// Tạo một Mở mới trên mái nhà, sàn nhà và trần nhà. public Mở
NewOpening (Element hostElement, CurveArray profile, bool bPer SquareFace);

// Tạo một phần tử mở mới. public Mở


NewOpening (Level bottomLevel, Level topLevel, hồ sơ CurveArray);

// Tạo một khe hở trong bức tường thẳng hoặc bức tường vòng
cung. công khai Mở Mới Mở (Tường, XYZ pntStart, XYZ pntEnd);

• Tạo phần mở đầu trong Beam, Brace hoặc Column - Sử dụng để tạo phần mở đầu trong một phiên bản gia đình. Tham số iFace cho biết
mặt mà lỗ được đặt trên đó.

• Tạo một mái nhà, sàn nhà hoặc trần nhà - Sử dụng để tạo một lỗ mở trên mái nhà, sàn nhà hoặc trần nhà.

• Tham số bPer SquareFace cho biết lỗ mở là vuông góc với mặt hoặc thẳng đứng.

• Nếu tham số là true, lỗ mở sẽ vuông góc với mặt phần tử chủ. Xem hình sau:
Machine Translated by Google

Hình 39: Đường cắt mở vuông góc với mặt phần tử chủ

Hình 40: Mở cắt theo chiều dọc của phần tử chủ

• Tạo phần tử mở mới - Sử dụng để tạo phần mở trục trong dự án của bạn. Tuy nhiên, hãy đảm bảo rằng topLevel cao hơn
bottomLevel; nếu không, một ngoại lệ được ném ra.

• Tạo Khe hở trong Tường thẳng hoặc Tường vòng cung - Sử dụng để tạo lỗ mở hình chữ nhật trên tường. Tọa độ của pntStart và pntEnd phải là tọa độ góc
có thể tạo hình chữ nhật. Ví dụ: góc dưới bên trái và góc trên bên phải của hình chữ nhật.
Nếu không, một ngoại lệ được ném ra.
Lưu ý Sử dụng lệnh Mở, bạn chỉ có thể tạo một lỗ tường hình chữ nhật. Để tạo một số lỗ trên tường, hãy chỉnh sửa cấu hình tường thay vì lệnh Mở.
Machine Translated by Google

Tính chất nhiệt


Một số kiểu lắp ráp nhất định như Tường, Sàn, Trần, Mái và Tấm xây dựng có các đặc tính nhiệt được tính toán và thiết lập được thể hiện bằng lớp ThermalProperties.

Lớp ThermalProperties có các thuộc tính cho các giá trị được hiển thị ở trên. Độ hấp thụ và Độ nhám có thể thay đổi trong khi HeatTransferCoe Hiệu quả,

ThermalResistance và ThermalMass ở chế độ chỉ đọc. Đơn vị cho các giá trị được tính toán này được hiển thị trong bảng dưới đây.

Tài sản Đơn vị

watt trên mét bình phương kelvin


Truyền nhiệt
(W / (m ^ 2 * K)

kelvin bình phương mét trên mỗi watt


Cách nhiệt
((m ^ 2 * K) / Watt)

kilôgam feet bình phương trên giây kelvin bình phương


Khối nhiệt
(kg ft ^ 2 / (s ^ 2 K))

Các thuộc tính nhiệt có thể được truy xuất bằng cách sử dụng thuộc tính ThermalProperties trên các loại sau:

Loại tường

FloorType

CeilingType

RoofType

BuildingPadType
Machine Translated by Google

Phiên bản gia đình

Trong phần này, bạn sẽ tìm hiểu về những điều sau:

• Mối quan hệ giữa gia đình và cá thể gia đình

• Các tính năng phiên bản gia đình và gia đình

• Cách tải hoặc tạo các tính năng gia đình và phiên bản gia đình

• Mối quan hệ giữa cá thể gia đình và biểu tượng gia đình

Xác định các yếu tố

Trong Revit, cách dễ nhất để đánh giá một phần tử có phải là FamilyInstance hay không là sử dụng hộp thoại thuộc tính.

• Nếu họ bắt đầu bằng Họ Hệ thống và nút Tải bị tắt, họ đó thuộc Họ Hệ thống.

Hình 41: Họ hệ thống

• Một FamilyInstance chung, thuộc Họ Thành phần, không bắt đầu với Họ Hệ thống.

• Ví dụ, trong hình dưới đây, họ cho bàn ghế là Bàn. Ngoài ra, nút Tải được bật.

Hình 42: Họ thành phần

• Có một số trường hợp ngoại lệ, ví dụ: Đại chúng và thành viên tại chỗ. Các trường Gia đình và Loại trống.

Hình 43: Ví dụ về thành viên hàng loạt hoặc tại chỗ

Các họ trong API nền tảng Revit được đại diện bởi ba đối tượng:

• Gia đình

• FamilySymbol

• FamilyInstance

Mỗi đối tượng đều đóng một vai trò quan trọng trong cấu trúc gia đình.

Đối tượng Family đại diện cho toàn bộ gia đình, chẳng hạn như cửa Single-Flush. Ví dụ: Dòng cửa xả một lần tương ứng với tệp Single-Flush.rfa. Đối tượng
Family chứa một số FamilySymbols được sử dụng để lấy tất cả các biểu tượng family để tạo điều kiện trao đổi các thể hiện từ biểu tượng này sang biểu
tượng khác.
Machine Translated by Google

Đối tượng FamilySymbol đại diện cho một tập hợp cụ thể các cài đặt gia đình tương ứng với một Loại trong giao diện người dùng Revit, chẳng hạn như 34 "× 80".

Đối tượng FamilyInstance đại diện cho một thực thể Kiểu (FamilySymbol) trong dự án Revit. Ví dụ, trong hình sau, FamilyInstance là một cửa duy nhất trong dự án.

• Mỗi FamilyInstance có một FamilySymbol. Cánh cửa là một ví dụ của một 34 "× 80".

• Mỗi FamilySymbol thuộc về một Family. Biểu tượng 34 "× 80" thuộc về dòng Single-Flush.

• Mỗi Family chứa một hoặc nhiều FamilySymbols. Dòng Single-Flush chứa ký hiệu 34 "× 80", ký hiệu 34 "× 84", 36 "× 84"
và như thế.

Lưu ý rằng trong khi hầu hết các phần tử thành phần được hiển thị thông qua các lớp API FamilySymbol và FamilyInstance, một số phần tử đã được bao bọc bằng các lớp API
cụ thể. Ví dụ, AnnotationSymbolType bao bọc FamilySymbol và AnnotationSymbol bao bọc FamilyInstance.

Gia đình

Lớp Family đại diện cho toàn bộ gia đình Revit. Nó chứa FamilySymbols được FamilyInstances sử dụng.

Đang tải gia đình

Lớp Document chứa các phương thức LoadFamily () và LoadFamilySymbol ().

• LoadFamily () tải toàn bộ họ và tất cả các kiểu hoặc ký hiệu của nó vào dự án.

• LoadFamilySymbol () chỉ tải ký hiệu họ cụ thể từ một tệp họ vào dự án.


Lưu ý Để cải thiện hiệu suất ứng dụng của bạn và giảm mức sử dụng bộ nhớ, nếu có thể hãy tải FamilySymbols cụ thể thay vì toàn bộ đối tượng Family.

• Đường dẫn tệp gia đình được truy xuất bằng phương thức GetLibraryPaths () đối tượng Options.Application.

• Đối tượng Options.Application được truy xuất bằng thuộc tính Application object Options.

• Trong LoadFamilySymbol (), đối số đầu vào Tên là cùng một giá trị chuỗi được trả về bởi thuộc tính Tên đối tượng FamilySymbol.

Để biết thêm thông tin, hãy tham khảo Mẫu mã.

Thể loại

Thuộc tính FamilyBase.FamilyCategory cho biết danh mục của Gia đình như Cột, Đồ nội thất, Khung cấu trúc hoặc Cửa sổ.

Gia đình
Ví dụ về các danh mục của đối tượng FamilyInstance trong Revit là Beams, Braces, Columns, Furniture, Massing, v.v. Đối tượng FamilyInstance cung cấp các thuộc tính
chi tiết hơn để có thể thay đổi kiểu và giao diện của cá thể gia đình trong dự án.

Thuộc tính liên quan đến vị trí

Các thuộc tính liên quan đến vị trí cho thấy các đặc điểm vật lý và hình học của các đối tượng FamilyInstance, chẳng hạn như định hướng, xoay và vị trí.

Định hướng

Hướng khuôn mặt hoặc hướng tay có thể được thay đổi đối với một số đối tượng FamilyInstance. Ví dụ, một cánh cửa có thể hướng ra bên ngoài hoặc
bên trong phòng hoặc tường và có thể đặt tay cầm ở bên trái hoặc bên phải. Bảng sau đây so sánh các trường hợp gia đình cửa đi, cửa sổ và bàn làm việc.

Bảng 29: So sánh các trường hợp gia đình

Boolean Property Door Window (Cố định: 36 "w × 72" h) Bàn

CanFlipFacing Đúng rồi Sai

CanFlipHand Đúng sai Sai

Nếu CanFlipFacing hoặc CanFlipHand là true, bạn có thể gọi các phương thức flipFacing () hoặc flipHand () tương ứng. Các phương pháp này có thể thay đổi hướng
quay mặt hoặc hướng tay tương ứng. Nếu không, các phương thức không làm gì cả và trả về False.

Khi thay đổi hướng, hãy nhớ rằng một số loại cửa sổ có thể thay đổi cả hướng tay và hướng quay mặt, chẳng hạn như Casement 3x3 với họ Trim.
Machine Translated by Google

Có bốn kết hợp hướng quay mặt và hướng tay khác nhau cho cửa. Xem hình sau để biết các kết hợp và các giá trị Boolean tương ứng có trong bảng sau.

Hình 44: Các cửa có hướng quay mặt và hướng tay khác nhau

Bảng 30: Các trường hợp cùng loại khác nhau

Boolean Property Cửa 1 Cửa 2 Cửa 3 Cửa 4

Đối mặt Sai ĐÚNG VẬY Sai ĐÚNG VẬY

HandFlipped Sai ĐÚNG VẬY ĐÚNG VẬY Sai

Định hướng - Mặt phẳng làm việc

Hướng mặt phẳng làm việc cho FamilyInstance cũng có thể được thay đổi. Nếu CanFlipWorkPlane là true, bạn có thể đặt thuộc tính IsWorkPlaneFlipped. Cố gắng
đặt thuộc tính này cho FamilyInstance không cho phép lật mặt phẳng làm việc sẽ dẫn đến một ngoại lệ.

Xoay - Được phản chiếu

Thuộc tính Mirrored cho biết đối tượng FamilyInstance đã được sao chép hay chưa.

Bảng 31: Thuộc tính được gương cửa

Boolean Property Cửa 1 Cửa 2 Cửa 3 Cửa 4

Nhân bản Sai Sai ĐÚNG VẬY ĐÚNG VẬY

Trong ví dụ về cửa trước, thuộc tính Mirrored cho Cửa 1 và Cửa 2 là Sai, trong khi đối với cả Cửa 3 và Cửa 4 là Đúng. Điều này là do khi bạn tạo một
cánh cửa trong dự án Revit, kết quả mặc định là Cửa 1 hoặc Cửa 2. Để tạo một cánh cửa như Cửa 3 hoặc Cửa 4, bạn phải lật hướng tay của Cửa 1 và Cửa 2
tương ứng. Thao tác lật giống như một sự biến đổi của gương, đó là lý do tại sao thuộc tính Cửa 3 và Cửa 4 được Gương là Đúng.

Để biết thêm thông tin về cách sử dụng phương thức Mirror () trong Revit, hãy tham khảo Phần tử chỉnh sửa chương.

Xoay - CanRotate and xoay ()

Thuộc tính phiên bản gia đình Boolean CanRotate được sử dụng để kiểm tra xem cá thể họ có thể xoay 180 độ hay không. Điều này phụ thuộc vào gia đình mà cá thể
đó thuộc về. Ví dụ: trong hình sau, thuộc tính CanRotate cho Cửa sổ 1 (Trường hợp 3 × 3 với Trim: 36 "× 72") và Cửa 1 (Kính kép 2: 72 "× 82") là đúng, trong
khi Cửa sổ 2 ( Đã sửa: 36 "w × 72" h) là sai.
Machine Translated by Google

Hình 45: Các thay đổi sau khi xoay ()

Nếu CanRotate là true, bạn có thể gọi phương thức phiên bản gia đình xoay (), phương thức này sẽ lật phiên bản gia đình đi 180 độ. Nếu không, phương thức không làm gì cả và trả về False.
Hình trước cũng cho thấy trạng thái Window 1 và Door 1 sau khi thực hiện phương thức xoay ().

Nhớ lại từ các phần tử Xoay phần trước trong tài liệu này, các cá thể họ (và các phần tử khác) có thể được xoay theo một góc do người dùng chỉ định bằng cách sử
dụngElementTransformUtils.RotateElement () và ElementTransformUtils.RotateElements ().

Địa điểm

Thuộc tính Location xác định vị trí thực của một đối tượng trong một dự án. Một cá thể có thể có vị trí điểm hoặc vị trí đường.

Các đặc điểm sau áp dụng cho Vị trí:

• Vị trí điểm là một đối tượng lớp LocationPoint - Chân, cửa hoặc bảng có vị trí điểm

• Vị trí đường là một đối tượng lớp LocationCurve - Một chùm có vị trí đường.

• Cả hai đều là lớp con của lớp Vị trí.

Để biết thêm thông tin về Vị trí, hãy tham khảo Phần tử chỉnh sửa.

Máy chủ và Máy chủ

Host và HostFace đều là thuộc tính FamilyInstance.

Chủ nhà

Đối tượng FamilyInstance có thuộc tính Host trả về phần tử lưu trữ của nó.

Một số đối tượng FamilyInstance không có phần tử máy chủ, chẳng hạn như Bàn và các đồ nội thất khác, vì vậy thuộc tính Máy chủ không trả về gì vì không có phần tử máy chủ nào được tạo.
Tuy nhiên, các đối tượng khác, chẳng hạn như cửa ra vào và cửa sổ, phải có các yếu tố chủ. Trong trường hợp này, thuộc tính Host trả về một Phần tử tường trong đó có cửa sổ hoặc cửa ra
vào. Xem hình sau.
Machine Translated by Google

Hình 46: Cửa ra vào và cửa sổ được đặt trong một bức tường

HostFace

Thuộc tính HostFace nhận tham chiếu đến mặt chủ của cá thể họ, hoặc nếu cá thể được đặt trên mặt phẳng làm việc, thì tham chiếu đến mặt hình học bên dưới
mặt phẳng làm việc. Thuộc tính này sẽ trả về một tham chiếu rỗng nếu mặt phẳng làm việc không tham chiếu đến hình học khác hoặc nếu thể hiện không được lưu
trữ trên mặt phẳng hoặc mặt phẳng làm việc.

Thành phần phụ và Siêu thành phần

Phương thức FamilyInstance.GetSubComponentIds () trả về các ElementIds của các cá thể họ được tải vào họ đó. Khi một phiên bản của 'Table-Dining Round w
Chairs.rfa' được đặt trong một dự án, các ElementIds của bộ ghế được trả về bằng phương thức GetSubComponentIds ().

Thuộc tính SuperComponent trả về thành phần mẹ của cá thể gia đình. Trong 'Table-Dining Round w Chairs.rfa', siêu thành phần gia đình cho mỗi chiếc ghế lồng
nhau là ví dụ của 'Table-Dining Round w Chairs.rfa'.

Vùng mã 12-1: Nhận các thành phần phụ và siêu thành phần từ FamilyInstance

1. public void GetSubAndSuperComponents (FamilyInstance familyInstance) 2. { 3.

ICollection <ElementId> subElemSet = familyInstance.GetSubComponentIds (); if (subElemSet!


4. = null) {
5.
6. string subElems = "";
7. foreach (Autodesk.Revit.DB.ElementId ee trong subElemSet) {

8. 9. FamilyInstance f = familyInstance.Document.GetElement (ee) as FamilyInstance; subElems =


10. subElems + f.Name + "\ n";
11. }
"
12. TaskDialog.Show ("Revit", " Số thành phần con = + subElemSet.Count + "\ n" + subElems);
13. }
14. FamilyInstance super = familyInstance.SuperComponent as FamilyInstance; if (super! =
15. null) {
16.
"
17. TaskDialog.Show ("Revit", " Thành phần SUPER: + super.Name);
18. }
19. }

Các tài sản khác

Các thuộc tính trong phần này dành riêng cho Revit Architecture và Revit Structure. Chúng được đề cập kỹ lưỡng trong các chương tương ứng của chúng.

Thông tin phòng

Thuộc tính FamilyInstance bao gồm Room, FromRoom và ToRoom. Để biết thêm thông tin về Phòng, hãy tham khảo Revit Architecture.
Machine Translated by Google

Thông tin không gian

FamilyInstance có thuộc tính Space để xác định không gian chứa một thể hiện trong MEP.

Mô hình phân tích liên quan đến cấu trúc Revit

Phương thức GetAnalyticalModel () truy xuất mô hình phân tích cấu trúc cá thể gia đình.

Để biết thêm thông tin về AnalyticalModel, hãy tham khảo Revit Structure.

Tạo đối tượng FamilyInstance

Thông thường, một đối tượng FamilyInstance được tạo bằng một trong mười hai phương thức nạp chồng của Autodesk.Revit.Creation.Document được gọi
là NewFamilyInstance (). Việc lựa chọn quá tải nào để sử dụng không chỉ phụ thuộc vào loại đối tượng mà còn các đặc điểm khác của vị trí như liệu nó nên được
lưu trữ, được đặt so với mức tham chiếu hay được đặt trực tiếp trên một mặt cụ thể. Chi tiết có trong Bảng 32 - Các tùy chọn để tạo phiên bản với
NewFamilyInstance () bên dưới.

Một số đối tượng FamilyInstance yêu cầu tạo nhiều vị trí. Trong những trường hợp này, thích hợp hơn là sử dụng phương pháp tạo chi tiết hơn do đối tượng
này cung cấp (xem Bảng 33 - Các tùy chọn để tạo cá thể bằng các phương pháp khác bên dưới). Nếu cá thể không được tạo, một ngoại lệ sẽ được ném ra. Kiểu /
ký hiệu được sử dụng phải được tải vào dự án trước khi phương thức được gọi.
Machine Translated by Google

Bảng 32 - Các tùy chọn để tạo phiên bản với NewFamilyInstance ()

Loại Tham số NewFamilyInstance () Bình luận

Nhà ga hàng không XYZ, FamilySymbol, StructuralType Tạo phiên bản ở một vị trí tùy ý mà không cần tham chiếu đến cấp độ hoặc phần tử máy chủ.

Điều kiện biên


XYZ, FamilySymbol, Element, Nếu nó được lưu trữ trên tường, sàn hoặc trần nhà
Casework
StructuralType
Thiết bị liên lạc

Thiết bị dữ liệu XYZ, FamilySymbol, XYZ, Element, Nếu nó được lưu trữ trên tường, sàn hoặc trần nhà và cần được định hướng theo hướng không mặc định

StructuralType hướng đi
Thiết bị điện

Đồ đạc điện
XYZ, FamilySymbol, Element, Level, Nếu nó được lưu trữ trên tường, sàn hoặc trần nhà và được liên kết với mức tham chiếu

Đoàn tùy tùng StructuralType

Thiết bị báo cháy


XYZ, FamilySymbol, Level, Nếu nó được liên kết với một mức tham chiếu
Đồ nội thất
StructuralType
Hệ thống nội thất

Mô hình chung Khuôn mặt, XYZ, XYZ, FamilySymbol Nếu nó dựa trên khuôn mặt và cần được định hướng theo hướng không mặc định

Thiết bị chiếu sáng


Tham chiếu, XYZ, XYZ, FamilySymbol Nếu nó dựa trên khuôn mặt và cần được định hướng theo hướng không mặc định, hãy chấp nhận một tham chiếu
Đèn chiếu sáng cho một khuôn mặt hơn là một khuôn mặt

Khối lượng

Face, Line, FamilySymbol Nếu nó dựa trên khuôn mặt và tuyến tính
Công cụ kỹ thuật

Thiết bị gọi y tá
Tham chiếu, Dòng, Gia đìnhSymbol Nếu nó dựa trên khuôn mặt và tuyến tính, nhưng chấp nhận một tham chiếu đến một khuôn mặt, thay vì một Khuôn mặt

Đậu xe

Trồng cây

Đường ống nước

Thiết bị an ninh

Địa điểm

Thiết bị đặc biệt

Vòi phun nước

Kết nối cấu trúc

Cơ sở kết cấu

Chất làm cứng cấu trúc

Thiết bị điện thoại

Cột XYZ, FamilySymbol, Level, Tạo cột để cơ sở của nó nằm trên mức tham chiếu. Cột sẽ mở rộng đến

Cột kết cấu StructuralType cấp có sẵn tiếp theo trong mô hình hoặc sẽ mở rộng chiều cao cột mặc định nếu không có cấp nào phù hợp

trên cấp tham chiếu.

Cửa ra vào XYZ, FamilySymbol, Element, Cửa ra vào và cửa sổ phải được đặt bởi một bức tường. Sử dụng phương pháp này nếu chúng có thể được

các cửa sổ StructuralType đặt với hướng mặc định.

XYZ, FamilySymbol, XYZ, Element, Nếu phiên bản đã tạo cần được định hướng theo hướng không mặc định

StructuralType

XYZ, FamilySymbol, Element, Level, Nếu phiên bản cần được liên kết với mức tham chiếu

StructuralType

Khung cấu trúc Đường cong, Gia đình Biểu tượng, Mức độ, Tạo một dấu ngoặc nhọn hoặc chùm dựa trên mức độ dựa trên đường cong của nó. Đây là phương pháp được khuyến nghị để

(Dầm, Niềng răng) StructuralType tạo Beams và Braces

XYZ, FamilySymbol, StructuralType Tạo phiên bản ở một vị trí tùy ý1

1
XYZ, FamilySymbol, Element, Level, Nếu nó được lưu trữ trên một phần tử (tầng, v.v.) và được liên kết với cấp tham chiếu

StructuralType

1
XYZ, FamilySymbol, Level, Nếu nó được liên kết với một mức tham chiếu

StructuralType

1
XYZ, FamilySymbol, Element, Nếu nó được lưu trữ trên một phần tử (tầng, v.v.)

StructuralType

Thành phần chi tiết Dòng, FamilySymbol, View Chỉ áp dụng cho các ký hiệu chi tiết dựa trên dòng họ 2D
Machine Translated by Google

Chú thích Chung XYZ, FamilySymbol, View Chỉ áp dụng cho các biểu tượng gia đình 2D

1
Phiên bản cấu trúc sẽ có độ dài bằng 0 sau khi tạo. Mở rộng nó bằng cách thiết lập đường cong của nó (FamilyInstance.Location as LocationCurve) bằng cách sử dụng
Thuộc tính LocationCurve.Curve.

Bạn có thể đơn giản hóa mã của mình và cải thiện hiệu suất bằng cách tạo nhiều phiên bản gia đình cùng một lúc bằng
Document.NewFamilyInstances (). Phương thức này có một tham số duy nhất, là danh sách các đối tượng FamilyInstanceCreationData mô tả các cá thể họ cần tạo.

Vùng mã 12-2: Tạo hàng loạt phiên bản gia đình

1. ICollection <ElementId> BatchCreateColumns (tài liệu Autodesk.Revit.DB.Document, cấp độ) 2. { 3. 4.

List <FamilyInstanceCreationData> fiCreationDatas = new List <FamilyInstanceCreationData> ();

ICollection <ElementId> elementSet = null;


5. 6.

// Cố gắng lấy một FamilySymbol


7. 8. FamilySymbol familySymbol = null;
FilteredElementCollector collector = new FilteredElementCollector (tài liệu); ICollection <Element>
9. 10. collection = collector.OfClass (typeof (FamilySymbol)). ToElements (); foreach (Phần tử e trong bộ sưu tập) {
11.
12.
13. familySymbol = e as FamilySymbol; if
14. (null ! = familySymbol.Category) {
15.
16. if ("Cột cấu trúc" == familySymbol.Category.Name) {
17.
18. phá vỡ;
19. }
20. }
21. }
22.
23. if (null ! = familySymbol) {
24.
25. // Tạo 10 mục FamilyInstanceCreationData để tạo hàng loạt cho (int i = 1; i <11;
26. i ++) {
27.
28. Vị trí XYZ = new XYZ (i * 10, 100, 0);
29. FamilyInstanceCreationData fiCreationData = new FamilyInstanceCreationData (vị trí, familySymbol, level,
30. StructuralType.Column); if
31. (null ! = fiCreationData) {
32.
33. fiCreationDatas.Add (fiCreationData);
34. }
35. }
36.
37. if (fiCreationDatas.Count> 0) {
38.
39. // Tạo cột elementSet
40. = document.Create.NewFamilyInstances2 (fiCreationDatas);
41.
42. }
43. else
44. { ném ngoại lệ mới (" Không tạo được hàng loạt."); }
45.
46.
47. } khác
48. {
49. ném ngoại lệ mới ("Không tìm thấy loại cột nào.");
50. }
51.
52. return elementSet;
53. }

Các phiên bản của một số kiểu họ được tạo tốt hơn thông qua các phương thức khác ngoài Autodesk.Revit.Creation.Document.NewFamilyInstance ().
Chúng được liệt kê trong bảng dưới đây.
Machine Translated by Google

Bảng 33 - Các tùy chọn để tạo phiên bản bằng các phương pháp khác

Loại Phương pháp tạo Bình luận

Thẻ nhà ga hàng không NewTag (Chế độ xem, Phần tử, Boolean, Mã thẻ phải là TM_ADDBY_CATEGORY và phải có một họ thẻ có liên quan được tải khi cố

Thẻ tải diện tích TagMode, TagOrientation, XYZ) gắng tạo thẻ, nếu không ngoại lệ sẽ được đưa ra

Thẻ khu vực

Thẻ Casework

Thẻ trần

Thẻ thiết bị liên lạc

Thẻ bảng điều khiển rèm

Thẻ thiết bị dữ liệu

Thẻ mục chi tiết

Thẻ cửa

Thẻ phụ kiện ống

Thẻ lắp ống

Thẻ Duct

Thẻ thiết bị điện

Thẻ đồ đạc điện

Thẻ thiết bị báo cháy

Thẻ Flex Duct

Thẻ Flex Pipe

Thẻ tầng

Thẻ hệ thống nội thất

Thẻ nội thất

Thẻ mô hình chung

Thẻ tải khu vực nội bộ

Thẻ tải dòng nội bộ

Thẻ tải điểm nội bộ

Thẻ Keynote

Thẻ thiết bị chiếu sáng

Thẻ đèn chiếu sáng

Thẻ tải dòng

Thẻ tầng khối lượng lớn

Thẻ hàng loạt

Thẻ thiết bị cơ khí

Thẻ thiết bị gọi y tá

Thẻ đậu xe

Thẻ phụ kiện ống

Thẻ lắp đường ống

Thẻ ống

Thẻ trồng cây

Thẻ sửa ống nước

Thẻ tải điểm

Thẻ phân đoạn dòng thuộc tính

Thẻ tài sản

Thẻ lan can

Sửa đổi thẻ đám mây

Thẻ mái nhà

Thẻ phòng

Thẻ thiết bị bảo mật

Thẻ trang web

Thẻ không gian

Thẻ thiết bị đặc biệt


Machine Translated by Google

Thẻ Spinkler

Thẻ cầu thang

Gia cố khu vực kết cấu

Thẻ

Thẻ hệ thống chùm kết cấu

Thẻ cột cấu trúc

Thẻ kết nối cấu trúc

Thẻ nền tảng cấu trúc

Thẻ khung cấu trúc

Gia cố đường dẫn cấu trúc

Thẻ

Thẻ thanh cốt thép

Thẻ Structural Stiffener

Thẻ kết cấu giàn

Thẻ thiết bị điện thoại

Thẻ tường

Thẻ cửa sổ

Thẻ dây

Thẻ khu vực

Thẻ vật liệu NewTag (Chế độ xem, Phần tử, Boolean, TagMode phải là TM_ADDBY_MATERIAL và phải có một họ thẻ material được tải, nếu

TagMode, TagOrientation, XYZ) không, ngoại lệ sẽ được đưa ra

Thẻ nhiều danh mục NewTag (Chế độ xem, Phần tử, Boolean, Mã thẻ phải là TM_ADDBY_MULTICATEGORY và phải có một họ thẻ nhiều danh mục

TagMode, TagOrientation, XYZ) được tải, nếu không ngoại lệ sẽ được ném ra

Khối tiêu đề NewViewSheet (FamilySymbol) Tiêu đề sẽ được thêm vào trang tính mới tạo.

Các gia đình và biểu tượng gia đình được tải bằng phương thức Document.LoadFamily () hoặc Document.LoadFamilySymbol (). Một số họ, chẳng hạn như Beams, có nhiều hơn
một điểm cuối và được chèn theo cách giống như một cá thể điểm duy nhất. Sau khi các cá thể họ tuyến tính được chèn vào, các điểm cuối của chúng có thể được thay đổi
bằng cách sử dụng thuộc tính Element.Location. Để biết thêm thông tin, hãy tham khảo Mẫu mã.

Mẫu mã
Xem lại các mẫu mã sau để biết thêm thông tin về cách làm việc với Phiên bản gia đình. Xin lưu ý rằng trong phương thức NewFamilyInstance (), một đối số
StructuralType là bắt buộc để chỉ định loại cá thể họ sẽ được tạo. Dưới đây là một số ví dụ:

Bảng 34: Giá trị của đối số StructuralType trong phương thức NewFamilyInstance ()

Loại giá trị phiên bản gia đình của StructuralType

Cửa ra vào, bảng, v.v. Phi cấu trúc

Dầm Chùm tia

Niềng răng Brace

Cột Cột

Footings Chân

Tạo bảng

Hàm sau đây trình bày cách tải một họ Bảng vào một dự án Revit và tạo các thể hiện từ tất cả các biểu tượng trong họ này.

Phương thức LoadFamily () trả về false nếu họ đã chỉ định đã được tải trước đó. Do đó, trong trường hợp sau, không tải gia đình, Bàn ăn Round w Ghế.rfa, trước
khi chức năng này được gọi. Trong ví dụ này, các bảng được tạo ở Cấp 1 theo mặc định.

Vùng mã 12-3: Tạo bảng


String fileName = @ "C: \ Documents and Settings \ All Users \ Application Data \ Autodesk \ RST 2011 \ Imperial Library \ Furniture \ Table Dining Round w
Chairs.rfa";
Machine Translated by Google

// cố gắng tải gia đình


Family family = null; if
(! document.LoadFamily (fileName, out family)) {

ném ngoại lệ mới ("Không thể tải" + tên tệp);


}
// Lặp qua các ký hiệu bảng và thêm một bảng mới cho mỗi
FamilySymbolSetIterator SymbolItor = family.Symbols.ForwardIterator (); kép x = 0,0, y =
0,0; while (SymbolItor.MoveNext ()) {

Biểu tượng FamilySymbol = SymbolItor.Current as FamilySymbol; Vị trí


XYZ = new XYZ (x, y, 10.0); // Không sử dụng phương thức NewFamilyInstance
() quá tải có chứa // đối số Cấp, nếu không Revit không thể hiển thị các thể hiện // một
cách chính xác trong Chế độ xem 3D, vì bảng không phải là thành phần dựa trên cấp.

Cá thể FamilyInstance = document.Create.NewFamilyInstance (vị trí, biểu tượng, StructuralType.NonStructural);

x + = 10,0;
}

Kết quả của việc tải họ Bảng và đặt một phiên bản của mỗi FamilySymbol:

Hình 47: Tải họ và tạo bảng trong dự án Revit


Machine Translated by Google

Tạo một chùm tia

Trong mẫu này, một biểu tượng gia đình được tải thay vì một gia đình, bởi vì tải một FamilySymbol đơn lẻ nhanh hơn tải một Family chứa nhiều FamilySymbol.

Vùng mã 12-4: Tạo chùm


// lấy mức của khung nhìn đang hoạt động để tạo tia Level level
= document.ActiveView.Level;

// tải một ký hiệu gia đình từ tệp


FamilySymbol gotSymbol = null; String
fileName = @ "C: \ Documents and Settings \ All Users \ Application Data \ Autodesk \ RST 2011 \ Imperial Library \ Structural
\ Framing \ Steel \ W-Wide Flange.rfa"; Tên chuỗi = "W10X54";

Cá thể FamilyInstance = null;

if (document.LoadFamilySymbol (fileName, name, out gotSymbol)) {

// tìm dòng mô hình trong danh sách các phần tử được chọn UIDocument

uidoc = new UIDocument (document); ElementSet sel = uidoc.Selection.Elements;


ModelLine modelLine = null; foreach (Autodesk.Revit.DB.Element elem in
sel) {

if (elem là ModelLine) {

modelLine = elem dưới dạng ModelLine;


phá vỡ;
}

} if (null! = modelLine) {

// tạo một cá thể chùm

mới = document.Create.NewFamilyInstance (modelLine.GeometryCurve, gotSymbol, level, StructuralType.Beam);

} khác

{
ném ngoại lệ mới ("Vui lòng chọn một dòng mô hình trước khi gọi lệnh này");
}

} khác

{
ném ngoại lệ mới ("Không thể tải" + tên tệp);
}
Machine Translated by Google

Tạo cửa

Tạo một bức tường dài có chiều dài khoảng 180 'và chọn nó trước khi chạy mẫu này. Đối tượng máy chủ lưu trữ phải hỗ trợ các trường hợp chèn; nếu không phương
thức NewFamilyInstance () sẽ không thành công. Nếu một phần tử máy chủ không được cung cấp cho một phiên bản phải được tạo trong một máy chủ lưu trữ hoặc không
thể chèn cá thể đó vào phần tử máy chủ lưu trữ đã chỉ định, thì phương thức NewFamilyInstance () sẽ không làm gì cả.

Vùng mã 12-5: Tạo cửa

void CreateDoorsInWall (Tài liệu Autodesk.Revit.DB.Document, Tường tường) {

String fileName = @ "C: \ Documents and Settings \ All Users \ Application Data \ Autodesk \ RST 2011 \ Imperial Library \ Doors \ Single trang trí 2.rfa";

Gia đình gia đình = null;


if (! document.LoadFamily (fileName, out family)) {

ném ngoại lệ mới ("Không thể tải" + tên tệp);


}

// lấy mức của khung nhìn đang hoạt động để tạo tia Level level
= document.ActiveView.Level;

FamilySymbolSetIterator symbolItor = family.Symbols.ForwardIterator (); kép x = 0, y = 0, z


= 0; while (SymbolItor.MoveNext ()) {

Biểu tượng FamilySymbol = SymbolItor.Current as FamilySymbol; Vị trí XYZ


= new XYZ (x, y, z); Phiên bản FamilyInstance = document.Create.NewFamilyInstance
(vị trí, ký hiệu, tường, mức,
StructuralType.NonStructural); x + =
10; y + = 10; z

+ = 1,5;

}
}

Kết quả của mã trước đó trong Revit được hiển thị trong hình sau. Lưu ý rằng nếu vị trí được chỉ định không ở mức được chỉ định, phương thức NewFamilyInstance () sử
dụng độ cao vị trí thay vì độ cao cấp.

Hình 48: Chèn cửa vào tường


Machine Translated by Google

Tạo FamilyInstances bằng cách sử dụng hướng dẫn tham chiếu

Sử dụng hướng dẫn tham chiếu để chèn một mục theo một hướng cụ thể.

Vùng mã 12-6: Tạo FamilyInstances sử dụng hướng dẫn tham chiếu

String fileName = @ "C: \ Documents and Settings \ All Users \ Application Data \ Autodesk \ RST 2011 \ Imperial Library \ Furniture \ Bed Box.rfa";

Autodesk.Revit.DB.Family family = null; if (!


document.LoadFamily (fileName, out family)) {

ném ngoại lệ mới ("Không thể tải" + tên tệp);


}

FilteredElementCollector collector = new FilteredElementCollector (tài liệu); Tầng tầng =


collector.OfClass (typeof (Tầng)). FirstElement () as Tầng; if (tầng! = null) {

FamilySymbolSetIterator symbolItor = family.Symbols.ForwardIterator (); int x = 0, y = 0;


int i = 0; while (SymbolItor.MoveNext ()) {

Biểu tượng FamilySymbol = SymbolItor.Current as FamilySymbol; Vị trí


XYZ = new XYZ (x, y, 0); Hướng XYZ = new XYZ (); chuyển đổi (i% 3) {

trường hợp 0:

hướng = new XYZ (1, 1, 0); phá vỡ;

trường hợp 1:

hướng = new XYZ (0, 1, 1); phá vỡ;

trường hợp 2:

hướng = new XYZ (1, 0, 1); phá vỡ;

}
Phiên bản FamilyInstance = document.Create.NewFamilyInstance (vị trí, ký hiệu, hướng, tầng,
StructuralType.NonStructural); x + =
10; i ++;

} khác

{
ném ngoại lệ mới ("Vui lòng mở một mô hình có ít nhất một phần tử tầng trước khi gọi lệnh này.");
}
Machine Translated by Google

Kết quả của mã trước đó xuất hiện trong hình sau:

Hình 49: Tạo các phiên bản gia đình bằng cách sử dụng các hướng tham chiếu khác nhau

Gia đình
Lớp FamilySymbol đại diện cho một Loại duy nhất trong một Gia đình. Mỗi gia đình có thể chứa một hoặc nhiều biểu tượng gia đình. Mỗi FamilyInstance có một FamilySymbol

liên quan có thể được truy cập từ thuộc tính Symbol của nó.

Tính chất nhiệt

Một số loại gia đình nhất định (cửa ra vào, cửa sổ và tấm tường rèm) chứa các đặc tính nhiệt như được hiển thị trong cửa sổ Thuộc tính loại bên dưới cho một cửa sổ.
Machine Translated by Google

Các thuộc tính nhiệt cho FamilySymbol được đại diện bởi lớp FamilyThermalProperties và được truy xuất bằng phương thức

FamilySymbol.GetThermalProperties (). FamilyThermalProperties cho một FamilySymbol có thể được đặt bằng cách sử dụng SetThermalProperties (). Bản thân các thuộc

tính của lớp FamilyThermalProperties là chỉ đọc.

Đơn vị cho các giá trị được tính toán được hiển thị trong bảng dưới đây.

Tài sản Đơn vị

watt trên mét bình phương kelvin


Truyền nhiệt
(W / (m ^ 2 * K)

kelvin bình phương mét trên mỗi watt


Cách nhiệt
((m ^ 2 * K) / Watt)

Thuộc tính AnalyticConstructionTypeId là kiểu gbXML xây dựng và trả về giá trị tương ứng với thuộc tính 'id' của nút ConstructionType trong Constructions.xml.

Phương thức FamilyThermalProperties.Find () tĩnh sẽ tìm FamilyThermalProperties theo thuộc tính 'id' của nút ConstructionType trong Constructions.xml.

Tài liệu Gia đình


Phần này thảo luận về gia đình và cách:

• Tạo và sửa đổi tài liệu Gia đình

• Truy cập các loại và tham số gia đình

Về tài liệu gia đình


Gia đình

Đối tượng Family đại diện cho toàn bộ họ Revit. Tài liệu Gia đình là Tài liệu đại diện cho một Gia đình hơn là một dự án Revit.

Sử dụng chức năng Tạo gia đình của API Revit, bạn có thể tạo và chỉnh sửa các gia đình cũng như các loại của chúng. Chức năng này đặc biệt hữu ích khi bạn có sẵn dữ liệu sẵn có từ một
hệ thống bên ngoài mà bạn muốn chuyển đổi sang thư viện họ Revit.

Quyền truy cập API để chỉnh sửa nhóm hệ thống không khả dụng.

Thể loại

Như đã lưu ý trong chương trước, thuộc tính FamilyBase.FamilyCategory cho biết danh mục của Gia đình như Cột, Đồ nội thất, Khung cấu trúc hoặc Cửa sổ.

Đoạn mã sau có thể được sử dụng để xác định danh mục của họ trong một tài liệu Revit Family đang mở.

Vùng mã 13-1: Danh mục tài liệu gia đình Revit mở


1. string categoryName = familyDoc.OwnerFamily.FamilyCategory.Name;

FamilyCategory cũng có thể được đặt, cho phép thay đổi danh mục của một gia đình đang được chỉnh sửa.

Thông số

Tham số gia đình có thể được truy cập từ thuộc tính OwnerFamily của Tài liệu gia đình như ví dụ sau cho thấy.

Vùng mã 13-2: Danh mục tài liệu gia đình Revit mở


1. // lấy gia đình chủ sở hữu của tài liệu gia đình.
2. Gia đình gia đình = familyDoc.OwnerFamily; 3.
Tham số param = family.get_Parameter (BuiltInParameter.FAMILY_WORK_PLANE_BASED); 4. // tham số này là một
tham số Có / Không trong giao diện người dùng, nhưng là một giá trị nguyên trong API 5. // 1 cho đúng và
0 cho sai 6. int isTrue = param.AsInteger (); 7. // param.Set (1); // đặt giá trị thành true.
Machine Translated by Google

Tạo tài liệu gia đình

Khả năng sửa đổi tài liệu Revit Family và truy cập các loại và tham số họ có sẵn từ lớp Tài liệu nếu Tài liệu là tài liệu Gia đình, như được xác định bởi
thuộc tính IsFamilyDocument. Để chỉnh sửa một họ hiện có trong khi làm việc trong tài liệu Dự án, hãy sử dụng các hàm EditFamily () có sẵn từ lớp Tài liệu, rồi
sử dụng LoadFamily () để tải lại họ vào tài liệu chủ sở hữu sau khi chỉnh sửa xong. Để tạo một tài liệu gia đình mới, hãy sử dụng Application.NewFamilyDocument
():

Vùng mã 13-3: Tạo tài liệu Gia đình mới

1. // tạo một tài liệu gia đình mới bằng cách sử dụng mẫu Generic Model.rft 2. string
templateFileName = @ "C: \ Documents and Settings \ All Users \ Application Data \ Autodesk \ RST 2011 \ Imperial Templates \ Generic Model.rft";

3.
4. Họ tài liệuDocument = application.NewFamilyDocument (templateFileName); 5. if (null ==
familyDocument) 6. { 7. 8. }

ném ngoại lệ mới ("Không thể mở tài liệu gia đình");

Biểu tượng gia đình lồng nhau

Bạn có thể lọc một Tài liệu Gia đình cho FamilySymbols để tải tất cả các FamilySymbol vào Gia đình. Trong mẫu mã này, tất cả các FamilySymbols lồng nhau
trong Family cho một FamilyInstance nhất định được liệt kê.

Vùng mã 13-4: Nhận các biểu tượng Gia đình lồng nhau trong một Gia đình

1. public void GetLoadedSymbols (tài liệu Autodesk.Revit.DB.Document, FamilyInstance familyInstance) 2. { 3. 4.

if (null ! = familyInstance.Symbol) {

// Lấy gia đình được liên kết với gia đình


5. 6. này Family = familyInstance.Symbol.Family;

7. 8. // Lấy tài liệu Family cho gia đình


Document familyDoc = document.EditFamily (family); if (null !
9. 10. = familyDoc && familyDoc.IsFamilyDocument == true) {
11.
12. String loadFamilies = "FamilySymbols in" + family.Name + ": \ n";
13. FilteredElementCollector collector = new FilteredElementCollector (tài liệu); Bộ sưu tập
14. ICollection <Element> =
15. collector.OfClass (typeof (FamilySymbol)). ToElements (); foreach
16. (Phần tử e trong bộ sưu tập) {
17.
18. FamilySymbol fs = e as FamilySymbol;
19. loadFamilies + = "\ t" + fs.Name + "\ n";
20. }
21.
22. TaskDialog.Show ("Revit", LoadFamilies);
23. }
24. }
25. }

Tạo các yếu tố trong gia đình


Lớp FamilyItemFactory cung cấp khả năng tạo các phần tử trong tài liệu gia đình. Nó được truy cập thông qua thuộc tính Document.FamilyCreate. FamilyItemFactory
có nguồn gốc từ lớp ItemFactoryBase là một tiện ích để tạo các phần tử trong cả tài liệu dự án Revit và tài liệu gia đình.
Machine Translated by Google

Tạo một phần tử biểu mẫu

Lớp FamilyItemFactory cung cấp khả năng tạo các phần tử biểu mẫu trong gia đình, chẳng hạn như đùn, quay, quét và pha trộn. Xem phần trên 3D

Phác thảo để biết thêm thông tin về các mẫu phác thảo 3D này.

Ví dụ sau minh họa cách tạo một phần tử Ext Extraction mới. Nó tạo ra một hồ sơ hình chữ nhật đơn giản và sau đó di chuyển

Đùn đến một vị trí mới.

Vùng mã: Tạo một đùn mới


1. Private Ext Extraction CreateExtults (tài liệu Autodesk.Revit.DB.Document, SketchPlane sketchPlane) 2. {

3. Đùn directExtrusion = null;


4.
// đảm bảo rằng chúng ta có một tài liệu gia đình
5. 6. if (true == document.IsFamilyDocument) {

7. 8. // xác định cấu hình cho việc ép đùn


CurveArrArray curveArrArray = new CurveArrArray ();
9. 10. CurveArray curveArray1 = new CurveArray ();
11. CurveArray curveArray2 = new CurveArray ();
12. CurveArray curveArray3 = new CurveArray ();
13.
14. // tạo biên dạng hình chữ nhật XYZ p0 =
15. XYZ.Zero; XYZ p1 = new XYZ (10, 0, 0);
16. XYZ p2 = new XYZ (10, 10, 0); XYZ p3 =
17. new XYZ (0, 10, 0); Dòng line1 =
18. Line.CreateBound (p0, p1); Dòng line2 =
19. Line.CreateBound (p1, p2); Dòng line3 =
20. Line.CreateBound (p2, p3); Dòng line4 =
21. Line.CreateBound (p3, p0); curveArray1.Append
22. (line1); curveArray1.Append (line2);
23. curveArray1.Append (line3); curveArray1.Append
24. (line4);
25.
26.
27.
28. curveArrArray.Append (curveArray1);
29.
30. // tạo đùn đùn hình chữ nhật đặc trực tràng
31. directExtrusion = document.FamilyCreate.NewExtorated (true, curveArrArray, sketchPlane, 10);
32.
33. if (null ! = trực tràng) {
34.
35. // di chuyển extrusion đến vị trí thích
36. hợp XYZ transPoint1 = new XYZ (-16, 0, 0);
37. ElementTransformUtils.MoveElement (tài liệu, directExtrusion.Id, transPoint1);
38.
39. }
40. khác {
41. ném ngoại lệ mới ("Tạo mới không thành công.");
42. }
43.
44. }
45. khác {
46. ném ngoại lệ mới ("Vui lòng mở tài liệu Gia đình trước khi gọi lệnh này.");
47. }
48.
49. trả lại trực tràng;
50. }
Machine Translated by Google

Mẫu sau đây cho thấy cách tạo một Dọn dẹp mới từ một cấu hình hình trứng đặc trong Tài liệu Gia đình.

Vùng mã: Tạo một đợt quét mới

1. Private Sweep CreateSweep (tài liệu Autodesk.Revit.DB.Document, SketchPlane sketchPlane) 2. { 3.

Quét quét = null;


4.
5. // đảm bảo rằng chúng ta có một tài liệu gia đình
6. if (true == document.IsFamilyDocument) {
7.
// Xác định cấu hình cho quá trình quét
8. 9. CurveArrArray arrayrr = new CurveArrArray ();
10. CurveArray arr = new CurveArray ();
11.
12. // Tạo cấu hình hình trứng XYZ
13. pnt1 = new XYZ (0, 0, 0); XYZ pnt2
14. = new XYZ (2, 0, 0); XYZ pnt3 = new
15. XYZ (1, 1, 0);
16. arr.Append (Arc.Create (pnt2, 1.0d, 0.0d, 180.0d, XYZ.BasisX, XYZ.BasisY)); arr.Append
17. (Arc.Create (pnt1, pnt3, pnt2)); Arrr.Append (arr); Hồ sơ SweepProfile =
18. document.Application.Create.NewCurveLoopsProfile (Arrr);
19.
20.
21. // Tạo đường dẫn quét XYZ pnt4 = new
22. XYZ (10, 0, 0); XYZ pnt5 = new XYZ (0,
23. 10, 0); Đường cong cong =
24. Line.CreateBound (pnt4, pnt5);
25.
26. CurveArray đường cong = new CurveArray ();
27. Curve.Append (đường cong);
28.
29. // tạo một đường quét hình trứng rắn
30. quét scan = document.FamilyCreate.NewSweep (true, curve, sketchPlane, profile, 0, ProfilePlaneLocation.Start);
31.
32. if (null ! = scan) {
33.
34. // di chuyển đến vị trí thích
35. hợp XYZ transPoint1 = new XYZ (11, 0, 0);
36. ElementTransformUtils.MoveElement (tài liệu, quét.Id, transPoint1);
37.
38. }
39. khác {
40. ném Ngoại lệ mới ("Không thể tạo Quét mới.");
41. }
42.
43. } khác
44. {
45. ném ngoại lệ mới ("Vui lòng mở tài liệu Gia đình trước khi gọi lệnh này.");
46. }
47.
48. quét trở lại ;
49. }

Hình 50: Quét hình trứng được tạo bởi ví dụ trước

Lớp FreeFormElement cho phép tạo các hình học phi tham số được tạo từ một phác thảo rắn đầu vào. Một FreeFormElement có thể tham gia vào các phép nối và vô hiệu hóa

các phần tử có thể kết hợp khác. Các mặt phẳng của phần tử có thể được bù đắp tương tác và theo chương trình theo hướng bình thường của mặt.

Gán các danh mục con cho các biểu mẫu

Sau khi tạo biểu mẫu mới trong một gia đình, bạn có thể muốn thay đổi danh mục phụ cho biểu mẫu. Ví dụ: bạn có thể có họ Cửa và muốn tạo nhiều danh mục phụ

của cửa và gán các danh mục phụ khác nhau cho các loại cửa khác nhau trong gia đình của bạn.
Machine Translated by Google

Ví dụ sau đây cho thấy cách tạo một danh mục con mới, gán tài liệu cho nó, sau đó gán danh mục con cho một biểu mẫu.

Vùng mã: Chỉ định một danh mục con


1. public void AssignSubCategory (Document document, GenericForm extrusion) 2. { 3.

// tạo một danh mục con mới


4. Category cat = document.OwnerFamily.FamilyCategory; Category
5. subCat = document.Settings.Categories.NewSubcategory (mèo, "NewSubCat");
6.
7. // tạo một vật liệu mới và gán nó vào danh mục con ElementId materialId =
Material.Create (document, "Wood Material"); subCat.Material = document.GetElement
8. 9. (materialId) as Material;
10.
11. // gán danh mục con cho phần tử extrusion.Subcategory
12. = subCat;
13. }

Tạo chú thích

Các chú thích mới như các đối tượng Dimensions và ModelText và TextNote cũng có thể được tạo trong các họ, cũng như các phần tử chú thích đường cong như

SymbolicCurve, ModelCurve và DetailCurve. Xem phần tử chú thích để biết thêm thông tin về các phần tử chú thích.

Ngoài ra, một Căn chỉnh mới có thể được thêm vào, tham chiếu đến Chế độ xem xác định hướng của căn chỉnh và hai tham chiếu hình học.

Ví dụ sau minh họa cách tạo một Kích thước chiều dài cung mới.

Vùng mã: Tạo thứ nguyên


1. public Dimension CreateArcDimension (Tài liệu tài liệu, SketchPlane sketchPlane) 2. { 3.

Autodesk.Revit.Creation.Application appCreate = document.Application.Create; Dòng gLine1 =


4. Line.CreateBound (new XYZ (0, 2, 0), new XYZ (2, 2, 0)); Dòng gLine2 = Line.CreateBound (new XYZ
5. (0, 2, 0), new XYZ (2, 4, 0)); Arc arctoDim = Arc.Create (new XYZ (1, 2, 0), new XYZ (-1, 2, 0),
new XYZ (0, 3, 0)); Arc arcofDim = Arc.Create (new XYZ (0, 3, 0), new XYZ (1, 2, 0), new XYZ (0.8, 2.8,
6. 7. 0));

8. 9. Autodesk.Revit.Creation.FamilyItemFactory createFamily = document.FamilyCreate; ModelCurve modelCurve1 =


10. createFamily.NewModelCurve (gLine1, sketchPlane); ModelCurve modelCurve2 = createFamily.NewModelCurve
11. (gLine2, sketchPlane); ModelCurve modelCurve3 = createFamily.NewModelCurve (arctoDim, sketchPlane); //
12. lấy tham chiếu của họ Tham khảo ref1 = modelCurve1.GeometryCurve.Reference; Tham chiếu ref2 =
13. modelCurve2.GeometryCurve.Reference; Tham chiếu arcRef = modelCurve3.GeometryCurve.Reference;
14.
15.
16.
17.
18. Thứ nguyên newArcDim = createFamily.NewArcLengthDimension (document.ActiveView, arcofDim, arcRef, ref1, ref2); if (newArcDim == null) {
19.
20.
21. ném ngoại lệ mới ("Không thể tạo kích thước chiều dài cung mới.");
22. }
23.
24. trả về newArcDim;
25. }
Machine Translated by Google

Hình 51: Kích thước chiều dài cung kết quả

Một số loại kích thước có thể được gắn nhãn bằng FamilyParameter. Các thứ nguyên không thể được gắn nhãn sẽ ném ra một

ngoại lệ Autodesk.Revit.Exceptions.InvalidOperationException nếu bạn cố gắng lấy hoặc đặt thuộc tính Nhãn. Trong ví dụ sau, một kích thước tuyến tính mới được tạo
giữa hai dòng và được gắn nhãn là "chiều rộng".

Vùng mã: Gắn nhãn cho một thứ nguyên


1. public Dimension CreateLinearDimension (Tài liệu tài liệu) 2. { 3.

// đầu tiên tạo hai dòng XYZ pt1


4. = new XYZ (5, 5, 0); XYZ pt2 = new
5. XYZ (5, 10, 0); Dòng dòng =
6. Line.CreateBound (pt1, pt2); Mặt phẳng phẳng =
7. document.Application.Create.NewPlane (pt1.CrossProduct (pt2), pt2); SketchPlane skplane = SketchPlane.Create
số 8.
(tài liệu, mặt phẳng); ModelCurve modelcurve1 = document.FamilyCreate.NewModelCurve (dòng, skplane);

9. 10.
11. pt1 = new XYZ (10, 5, 0); pt2 =
12. new XYZ (10, 10, 0); line =
13. Line.CreateBound (pt1, pt2); plane =
14. document.Application.Create.NewPlane (pt1.CrossProduct (pt2), pt2); skplane = SketchPlane.Create
15. (tài liệu, mặt phẳng); ModelCurve modelcurve2 = document.FamilyCreate.NewModelCurve (dòng, skplane);
16.
17.
18. // bây giờ tạo một chiều tuyến tính giữa chúng ReferenceArray
19. ra = new ReferenceArray (); ra.Append
20. (modelcurve1.GeometryCurve.Reference); ra.Append
21. (modelcurve2.GeometryCurve.Reference);
22.
23. pt1 = new XYZ (5, 10, 0); pt2 =
24. new XYZ (10, 10, 0); line =
25. Line.CreateBound (pt1, pt2);
26.
27. Dimension dim = document.FamilyCreate.NewLinearDimension (document.ActiveView, dòng, ra);
28.
29. // tạo nhãn cho thứ nguyên được gọi là "chiều rộng"
30. FamilyParameter param = document.FamilyManager.AddParameter ("chiều rộng",
31. BuiltInParameterGroup.PG_CONSTRAINTS,
32. ParameterType.Length, false);
33.
34. dim.FamilyLabel = param;
35.
36. trở lại mờ;
37. }
Machine Translated by Google

Hình 52: Kích thước tuyến tính được gắn nhãn

Khả năng hiển thị của các yếu tố gia đình

Lớp FamilyElementVisibility có thể được sử dụng để kiểm soát khả năng hiển thị của các phần tử family trong tài liệu dự án. Ví dụ: nếu bạn có một gia đình cửa,
bạn có thể chỉ muốn cửa xoay được hiển thị trong các khung nhìn sơ đồ trong tài liệu dự án, trong đó cửa được đặt, không phải chế độ xem 3D.
Bằng cách thiết lập khả năng hiển thị trên các đường cong của cửa xoay, bạn có thể kiểm soát tầm nhìn của chúng. FamilyElementVisibility có thể áp dụng cho các
lớp phần tử family sau đây có hàm SetVisibility ():

• GenericForm, là lớp cơ sở cho các lớp biểu mẫu như Quét và đùn

• SymbolicCurve

• ModelText

• CurveByPoints

• ModelCurve

• Điểm tham khảo

• ImportInstance
Machine Translated by Google

Trong ví dụ bên dưới, tài liệu gia đình kết quả sẽ hiển thị văn bản "Hello World" với một dòng bên dưới nó. Khi họ được tải vào một tài liệu dự án Revit và
một thể hiện được đặt, trong dạng xem mặt bằng, chỉ dòng sẽ được hiển thị. Trong chế độ xem 3D, cả dòng và văn bản sẽ được hiển thị, trừ khi Cấp chi tiết
được đặt thành Khóa học, trong trường hợp đó, dòng sẽ biến mất.

Vùng mã 13-10: Đặt chế độ hiển thị phần tử gia đình

1. public void CreateAndSetVisibility (Autodesk.Revit.DB.Document familyDocument, SketchPlane sketchPlane) 2. { 3.

// tạo một ModelCurve mới trong tài liệu họ XYZ p0 = new XYZ (1,
4. 1, 0); XYZ p1 = new XYZ (5, 1, 0); Dòng line1 = Line.CreateBound
5. (p0, p1);

6. 7.

ModelCurve modelCurve1 = familyDocument.FamilyCreate.NewModelCurve (line1, sketchPlane);


8. 9.
10. // tạo một ModelText mới dọc theo dòng ModelCurve ModelText
11. text = familyDocument.FamilyCreate.NewModelText ("Hello World", null, sketchPlane, p0, HorizontalAlign.Center, 0.1);
12.
13. // thiết lập khả năng hiển thị cho
14. văn bản FamilyElementVisibility textVisibility = new FamilyElementVisibility (FamilyElementVisibilityType.Model);
15. textVisibility.IsShownInTopBottom = false;
16. text.SetVisibility (textVisibility);
17.
18. // thiết lập khả năng hiển thị cho
19. dòng FamilyElementVisibility curveVisibility = new FamilyElementVisibility (FamilyElementVisibilityType.Model); curveVisibility.IsShownInCoarse
20. = false; modelCurve1.SetVisibility (đường cong);
21.
22.

23. }

Quản lý các loại và thông số gia đình


Tài liệu gia đình cung cấp quyền truy cập vào thuộc tính FamilyManager. Lớp FamilyManager cung cấp quyền truy cập vào các tham số và kiểu gia đình.
Sử dụng lớp này, bạn có thể thêm và xóa các kiểu, thêm và xóa các tham số họ và chia sẻ, đặt giá trị cho các tham số trong các kiểu họ khác nhau và xác
định công thức cho các giá trị tham số ổ đĩa.

Nhận các loại trong một gia đình

FamilyManager có thể được sử dụng để lặp qua các kiểu trong một họ, như ví dụ sau minh họa.

Vùng mã 13-11: Nhận các loại trong một gia đình

xem bản sao đơn giản vào khay nhớ tạm?

1. public void GetFamilyTypesInFamily (Họ tài liệuDoc) 2. { 3.

if (familyDoc.IsFamilyDocument == true) {
4.
5. FamilyManager familyManager = familyDoc.FamilyManager;

6. 7. // lấy kiểu trong chuỗi kiểu


gia đình = "Kiểu gia đình: "; FamilyTypeSet
8. 9. familyTypes = familyManager.Types; FamilyTypeSetIterator
10. familyTypesItor = familyTypes.ForwardIterator (); familyTypesItor.Reset (); while
11. (familyTypesItor.MoveNext ()) {
12.
13.
14. FamilyType familyType = familyTypesItor.Current as FamilyType; loại + = "\ n" +
15. familyType.Name;
16. }
17. MessageBox.Show (các loại, "Revit");
18. }
19. }

Hình 53: Các kiểu họ trong họ Bê tông-Hình chữ nhật-Cột


Machine Translated by Google

Chỉnh sửa FamilyTypes

FamilyManager cung cấp khả năng lặp qua các kiểu hiện có trong một họ, đồng thời thêm và sửa đổi các kiểu cũng như tham số của chúng.

Ví dụ sau đây cho thấy cách thêm một kiểu mới, đặt các tham số của nó và sau đó gán kiểu mới cho FamilyInstance. Chỉnh sửa kiểu được thực hiện trên kiểu
hiện tại bằng cách sử dụng hàm Set (). Loại hiện tại có sẵn từ thuộc tính CurrentType. Thuộc tính CurrentType có thể được sử dụng để đặt kiểu hiện tại trước
khi chỉnh sửa hoặc sử dụng hàm NewType () để tạo một kiểu mới và đặt nó thành kiểu hiện tại để chỉnh sửa.

Lưu ý rằng khi kiểu mới được tạo và sửa đổi, Document.LoadFamily () được sử dụng để tải họ trở lại dự án Revit để cung cấp kiểu mới.

Vùng mã 13-12: Chỉnh sửa các loại gia đình

1. public void EditFamilyTypes (Document document, FamilyInstance familyInstance) 2. { 3. 4.

// ví dụ hoạt động tốt nhất khi familyInstance là một phần tử bê tông hình chữ nhật if (null ! =
familyInstance.Symbol) {

5. 6. // Lấy gia đình được liên kết với gia đình


7. này Family = familyInstance.Symbol.Family;
số 8.

9. // Lấy tài liệu Family cho gia đình


10. Document familyDoc = document.EditFamily (family); if (null !
11. = familyDoc) {
12.
13. FamilyManager familyManager = familyDoc.FamilyManager;
14.
15. // thêm một kiểu mới và chỉnh sửa các tham số của nó
16. FamilyType newFamilyType = familyManager.NewType ("2X2"); // tìm các
17. tham số 'b' và 'h' và đặt chúng thành 2 feet FamilyParameter familyParam
18. = familyManager.get_Parameter ("b"); if (null ! = familyParam) {familyManager.Set
19. (familyParam, 2.0); } familyParam = familyManager.get_Parameter ("h"); if (null !
20. = familyParam) {
21.
22.
23.
24.
25.
26. familyManager.Set (familyParam, 2.0);
27. }
28.
29. // bây giờ cập nhật dự án Revit với Family có kiểu mới family = familyDoc.LoadFamily
30. (document); // tìm kiểu mới và gán cho FamilyInstance FamilySymbolSetIterator
31. SymbolItor = family.Symbols.ForwardIterator (); SymbolItor.Reset (); while
32. (SymbolItor.MoveNext ()) {
33.
34.
35.
36. FamilySymbol familySymbol = SymbolItor.Current as FamilySymbol; if (familySymbol.Name
37. == "2X2") {familyInstance.Symbol = familySymbol; phá vỡ; }
38.
39.
40.
41.
42. }
43. }
44. }
45. }

Thiết kế mẫu
Chương này thảo luận về chức năng thiết kế khái niệm của API Revit để tạo ra các hình học phức tạp trong một tài liệu gia đình. Việc tạo biểu mẫu được hỗ trợ
bởi việc bổ sung các đối tượng mới: các điểm và các đường cong spline đi qua các điểm này. Các bề mặt kết quả có thể được phân chia, tạo khuôn mẫu và tạo
bảng để tạo ra các biểu mẫu có thể xây dựng với các mối quan hệ tham số liên tục.
Machine Translated by Google

Đối tượng điểm và đường cong

Điểm tham chiếu là một phần tử chỉ định một vị trí trong không gian làm việc XYZ của môi trường thiết kế khái niệm. Bạn tạo các điểm tham chiếu để thiết kế
và vẽ các đường thẳng, splines và biểu mẫu. Một ReferencePoint có thể được thêm vào ReferencePointArray, sau đó được sử dụng để tạo CurveByPoints, đến
lượt nó có thể được sử dụng để tạo biểu mẫu.

Ví dụ sau minh họa cách tạo một đối tượng CurveByPoints. Xem ví dụ "Tạo biểu mẫu gác xép" trong phần tiếp theo để biết cách tạo biểu mẫu từ nhiều đối tượng
CurveByPoints.

Vùng mã 14-1: Tạo một CurveByPoints mới


1. ReferencePointArray rpa = new ReferencePointArray (); 2.

3. XYZ xyz = document.Application.Create.NewXYZ (0, 0, 0); 4.


ReferencePoint rp = document.FamilyCreate.NewReferencePoint (xyz); 5.
rpa.Append (rp);
6.
7. xyz = document.Application.Create.NewXYZ (0, 30, 10); 8.
rp = document.FamilyCreate.NewReferencePoint (xyz); 9.
rpa.Append (rp); 10.

11. xyz = document.Application.Create.NewXYZ (0, 60, 0);


12. rp = document.FamilyCreate.NewReferencePoint (xyz); 13.
rpa.Append (rp); 14. 15. xyz = document.Application.Create.NewXYZ
(0, 100, 30); 16. rp = document.FamilyCreate.NewReferencePoint
(xyz); 17. rpa.Append (rp); 18. 19. xyz =
document.Application.Create.NewXYZ (0, 150, 0); 20. rp =
document.FamilyCreate.NewReferencePoint (xyz); 21. rpa.Append
(rp); 22.

23. Đường cong CurveByPoints = document.FamilyCreate.NewCurveByPoints (rpa);

Hình 54: Đường cong CurveByPoints


Machine Translated by Google

Các điểm tham chiếu có thể được tạo dựa trên tọa độ XYZ như trong ví dụ trên, hoặc chúng có thể được tạo so với các hình học khác để các điểm sẽ di chuyển
khi hình học được tham chiếu thay đổi. Các điểm này được tạo bằng cách sử dụng các lớp con của lớp PointElementReference. Các lớp con là:

• PointOnEdge

• PointOnEdgeEdgeIntersection

• PointOnEdgeFaceIntersection

• PointOnFace

• PointOnPlane

Ví dụ: hai dòng mã cuối cùng trong ví dụ trước tạo một điểm tham chiếu ở giữa CurveByPoints.

Biểu mẫu có thể được tạo bằng cách sử dụng dòng mô hình hoặc dòng tham chiếu. Các dòng mô hình được biểu mẫu "tiêu thụ" trong quá trình tạo và không còn
tồn tại như các thực thể riêng biệt. Mặt khác, các dòng tham chiếu vẫn tồn tại sau khi biểu mẫu được tạo và có thể thay đổi biểu mẫu nếu chúng được di chuyển.
Mặc dù API không có lớp ReferenceLine, bạn có thể thay đổi dòng mô hình thành dòng tham chiếu bằng phương thức ModelCurve.ChangeToReferenceLine ().

Vùng mã 14-2: Sử dụng các dòng tham chiếu để tạo biểu mẫu

1. private FormArray CreateRevolveForm (Tài liệu tài liệu) 2. { 3. 4.

FormArray revolveForms = null;

// Tạo một hồ sơ
5. 6. ReferenceArray ref_ar = new ReferenceArray ();

7. 8. XYZ ptA = new XYZ (0, 0, 10); XYZ


9. ptB = new XYZ (100, 0, 10); Dòng dòng
10. = Line.CreateBound (ptA, ptB); ModelCurve
11. modelcurve = MakeLine (tài liệu, ptA, ptB); ref_ar.Append
12. (modelcurve.GeometryCurve.Reference);
13.
14. ptA = new XYZ (100, 0, 10); ptB
15. = new XYZ (100, 100, 10); modelcurve
16. = MakeLine (tài liệu, ptA, ptB); ref_ar.Append
17. (modelcurve.GeometryCurve.Reference);
18.
19. ptA = new XYZ (100, 100, 10); ptB =
20. new XYZ (0, 0, 10); modelcurve =
21. MakeLine (tài liệu, ptA, ptB); ref_ar.Append
22. (modelcurve.GeometryCurve.Reference);
23.
24. // Tạo trục cho dạng revolve ptA = new
25. XYZ (-5, 0, 10); ptB = new XYZ (-5, 10,
26. 10);
27. Trục ModelCurve = MakeLine (tài liệu, ptA, ptB);
28.
29. // biến trục thành trục Đường tham
30. chiếu.ChangeToReferenceLine ();
31.
32. // Thông thường, thao tác này chỉ tạo ra một biểu mẫu duy nhất, //
33. nhưng một số kết hợp đối số sẽ tạo ra nhiều từ từ một cấu hình duy nhất. revolveForms =
34. document.FamilyCreate.NewRevolveForms (true, ref_ar, axis.GeometryCurve.Reference, 0, Math.PI / 4);
35.
36. trả về revolveForms;
37. }
38.
39. public ModelCurve MakeLine (Tài liệu doc, XYZ ptA, XYZ ptB) 40. { 41.

Ứng dụng Autodesk.Revit.ApplicationServices.Application = doc.Application; // Tạo mặt


42. phẳng bởi các điểm Line line = Line.CreateBound (ptA, ptB); Định mức XYZ = ptA.CrossProduct
43. (ptB); if (norm.IsZeroLength ()) chuẩn = XYZ.BasisZ; Mặt phẳng máy bay = app.Create.NewPlane
44. (chuẩn, ptB); SketchPlane skplane = SketchPlane.Create (doc, plane); // Tạo dòng tại đây
45. ModelCurve modelcurve = doc.FamilyCreate.NewModelCurve (line, skplane); trả về modelcurve;
46.
47.
48.
49.
50.
51. }
Machine Translated by Google

Hình 55: Biểu mẫu Revolve kết quả


Machine Translated by Google

Các hình thức

Tạo biểu mẫu

Tương tự như tạo gia đình, môi trường thiết kế khái niệm cung cấp khả năng tạo ra các hình thức mới. Có thể tạo các loại hình thức sau: đùn, xoay, quét,
hỗn hợp quét, loft và dạng bề mặt. Thay vì sử dụng các lớp Blend, Ext Extraction, Revolution, Sweep và SweptBlend được sử dụng trong tạo Family, Mass family
sử dụng lớp Form cho tất cả các loại biểu mẫu.

Một dạng đùn được tạo ra từ một vòng đường cong khép kín là phẳng. Biểu mẫu xoay vòng được tạo từ một cấu hình và một đường trong cùng mặt phẳng với cấu
hình là trục mà hình dạng được xoay quanh để tạo ra một biểu mẫu 3D. Một biểu mẫu quét được tạo từ một biên dạng 2D được quét dọc theo một đường phẳng. Một
hỗn hợp quét được tạo ra từ nhiều cấu hình, mỗi một mặt phẳng, được quét dọc theo một đường cong duy nhất. Một dạng gác xép được tạo ra từ 2 hoặc nhiều biên
dạng nằm trên các mặt phẳng riêng biệt. Một dạng bề mặt duy nhất được tạo ra từ một biên dạng, tương tự như một dạng đùn, nhưng không có chiều cao.

Ví dụ sau tạo một dạng đùn đơn giản. Lưu ý rằng vì các ModelCurves được sử dụng để tạo biểu mẫu không được chuyển đổi thành các dòng tham chiếu,
chúng sẽ được sử dụng bởi biểu mẫu kết quả.

Vùng mã 14-3: Tạo một biểu mẫu đùn

1. Biểu mẫu riêng tư CreateExtrusionForm (tài liệu Autodesk.Revit.DB.Document) 2. {

3. Dạng extrusionForm = null;


4.
// Tạo một hồ sơ
5. 6. ReferenceArray ref_ar = new ReferenceArray ();

7. 8. XYZ ptA = new XYZ (10, 10, 0); XYZ


ptB = new XYZ (90, 10, 0); ModelCurve
9. 10. modelcurve = MakeLine (tài liệu, ptA, ptB); ref_ar.Append
11. (modelcurve.GeometryCurve.Reference);
12.
13. ptA = new XYZ (90, 10, 0); ptB
14. = new XYZ (10, 90, 0); modelcurve
15. = MakeLine (tài liệu, ptA, ptB); ref_ar.Append
16. (modelcurve.GeometryCurve.Reference);
17.
18. ptA = new XYZ (10, 90, 0); ptB
19. = new XYZ (10, 10, 0); modelcurve
20. = MakeLine (tài liệu, ptA, ptB); ref_ar.Append
21. (modelcurve.GeometryCurve.Reference);
22.
23. // Hướng của biểu mẫu đùn
24. Hướng XYZ = new XYZ (0, 0, 50);
25.
26. extrusionForm = document.FamilyCreate.NewExtrusionForm (true, ref_ar, direction);
27.
28. int profileCount = extrusionForm.ProfileCount;
29.
30. trả về extrusionForm;
31. }
32.
33. public ModelCurve MakeLine (Document doc, XYZ ptA, XYZ ptB) 34. { 35. 36.

Ứng dụng Autodesk.Revit.ApplicationServices.Application = doc.Application; // Tạo mặt


phẳng bởi các điểm Line line = Line.CreateBound (ptA, ptB); Định mức XYZ = ptA.CrossProduct
37. (ptB); if (norm.IsZeroLength ()) chuẩn = XYZ.BasisZ; Mặt phẳng máy bay = app.Create.NewPlane
38. (chuẩn, ptB); SketchPlane skplane = SketchPlane.Create (doc, plane); // Tạo dòng tại đây
39. ModelCurve modelcurve = doc.FamilyCreate.NewModelCurve (line, skplane); trả về modelcurve;
40.
41.
42.
43.
44.
45. }
Machine Translated by Google

Hình 56: Dạng đùn kết quả

Ví dụ sau đây cho thấy cách tạo biểu mẫu gác xép bằng cách sử dụng một loạt các đối tượng CurveByPoints.

Vùng mã 14-4: Tạo biểu mẫu gác xép

xem bản sao đơn giản vào khay nhớ tạm?

1. Biểu mẫu riêng CreateLoftForm (tài liệu Autodesk.Revit.Document) 2. { 3.

Biểu mẫu loftForm = null;


4.
5. ReferencePointArray rpa = new ReferencePointArray ();
6. ReferenceArrayArray ref_ar_ar = new ReferenceArrayArray ();
ReferenceArray ref_ar = new ReferenceArray ();
7. 8. ReferencePoint rp = null;
XYZ xyz = null;
9. 10.
11. // tạo đường cong hồ sơ đầu tiên cho loft xyz =
12. document.Application.Create.NewXYZ (0, 0, 0); rp =
13. document.FamilyCreate.NewReferencePoint (xyz); rpa.Append (rp);
14.
15.
16. xyz = document.Application.Create.NewXYZ (0, 50, 10); rp =
17. document.FamilyCreate.NewReferencePoint (xyz); rpa.Append (rp);
18.
19.
20. xyz = document.Application.Create.NewXYZ (0, 100, 0); rp =
21. document.FamilyCreate.NewReferencePoint (xyz); rpa.Append (rp);
22.
23.
24. CurveByPoints cbp = document.FamilyCreate.NewCurveByPoints (rpa); ref_ar.Append
25. (cbp.GeometryCurve.Reference); ref_ar_ar.Append (ref_ar); rpa.Clear (); ref_ar = new
26. ReferenceArray ();
27.
28.
29.
30. // tạo đường cong hồ sơ thứ hai cho loft xyz =
31. document.Application.Create.NewXYZ (50, 0, 0); rp =
32. document.FamilyCreate.NewReferencePoint (xyz); rpa.Append (rp);
33.
34.
35. xyz = document.Application.Create.NewXYZ (50, 50, 30); rp =
36. document.FamilyCreate.NewReferencePoint (xyz); rpa.Append (rp);
37.
38.
39. xyz = document.Application.Create.NewXYZ (50, 100, 0); rp =
40. document.FamilyCreate.NewReferencePoint (xyz); rpa.Append (rp);
41.
42.
43. cbp = document.FamilyCreate.NewCurveByPoints (rpa); ref_ar.Append
44. (cbp.GeometryCurve.Reference);
Machine Translated by Google

45. ref_ar_ar.Append (ref_ar);


46. rpa.Clear (); ref_ar = new
47. ReferenceArray ();
48.
49. // tạo đường cong hồ sơ thứ ba cho loft xyz =
50. document.Application.Create.NewXYZ (75, 0, 0); rp =
51. document.FamilyCreate.NewReferencePoint (xyz); rpa.Append (rp);
52.
53.
54. xyz = document.Application.Create.NewXYZ (75, 50, 5); rp =
55. document.FamilyCreate.NewReferencePoint (xyz); rpa.Append (rp);
56.
57.
58. xyz = document.Application.Create.NewXYZ (75, 100, 0); rp =
59. document.FamilyCreate.NewReferencePoint (xyz); rpa.Append (rp);
60.
61.
62. cbp = document.FamilyCreate.NewCurveByPoints (rpa); ref_ar.Append
63. (cbp.GeometryCurve.Reference); ref_ar_ar.Append (ref_ar);
64.
65.
66. loftForm = document.FamilyCreate.NewLoftForm (true, ref_ar_ar);
67.
68. trả về loftForm;
69. }

Hình 57: Dạng gác xép kết quả

Sửa đổi biểu mẫu

Sau khi được tạo, biểu mẫu có thể được sửa đổi bằng cách thay đổi một phần tử phụ (tức là mặt, cạnh, đường cong hoặc đỉnh) của biểu mẫu hoặc toàn bộ hồ sơ.
Các phương pháp sửa đổi biểu mẫu bao gồm:

• AddEdge

• Thêm hồ sơ

• Xóa hồ sơ

• DeleteSubElement

• MoveProfile

• MoveSubElement

• RotateProfile

• RotateSubElement

• ScaleSubElement
Machine Translated by Google

Ngoài ra, bạn có thể sửa đổi biểu mẫu bằng cách thêm một cạnh hoặc một cấu hình, sau đó có thể sửa đổi biểu mẫu này bằng các phương pháp được liệt kê ở trên.

Ví dụ sau di chuyển đường cong biên dạng đầu tiên của dạng đã cho bằng một độ lệch xác định. Hình tương ứng cho thấy kết quả của việc áp dụng mã này cho
dạng gác xép từ ví dụ trước.

Vùng mã 14-5: Di chuyển hồ sơ

1. public void MoveForm (Form form) 2. { 3.

int profileCount = form.ProfileCount; if


4. (form.ProfileCount> 0) {
5.

int profileIndex = 0; // chỉ sửa đổi biểu mẫu đầu tiên if


6. 7. (form.CanManipulateProfile (profileIndex)) {XYZ offset = new XYZ
(-25, 0, 0); form.MoveProfile (profileIndex, offset); }
8. 9.
10.
11.
12. }
13. }

Hình 58: Dạng gác xép sửa đổi

Mẫu tiếp theo trình bày cách di chuyển một đỉnh của một hình thức đã cho. Hình tương ứng chứng minh tác dụng của mã này đối với ví dụ về dạng đùn trước đó

Vùng mã 14-6: Di chuyển một phần tử phụ

1. public void MoveSubElement (Form form) 2. { 3.

if (form.ProfileCount> 0) {
4.
5. int profileIndex = 0; // lấy hồ sơ đầu tiên ReferenceArray
ra = form.get_CurveLoopRefferencesOnProfile (profileIndex, 0); foreach (Tham chiếu r in ra) {
6. 7.

8. 9. ReferenceArray ra2 = form.GetControlPoints (r); foreach


10. (Tham chiếu r2 trong ra2) {
11.
12. Point vertex = document.GetElement (r2) .GetGeometryObjectFromReference (r2) as Point;
13.
14. XYZ offset = new XYZ (0, 15, 0);
15. form.MoveSubElement (r2, bù đắp); phá
16. vỡ; // chỉ di chuyển điểm đầu tiên
17. }
18. }
19. }
20. }
Machine Translated by Google

Hình 59: Dạng đùn đã sửa đổi

Hợp lý hóa bề mặt


Phân chia bề mặt

Các mặt của biểu mẫu có thể được phân chia bằng lưới UV. Bạn có thể truy cập dữ liệu cho một bề mặt đã chia bằng cách sử dụng phương thức Form.GetDividedSurfaceData
() (như được hiển thị trong ví dụ tiếp theo) cũng như tạo bề mặt chia mới trên các biểu mẫu như được hiển thị bên dưới.

Vùng mã 14-7: Phân chia bề mặt

1. public void splitSurface (Văn bản tài liệu, Biểu mẫu) 2. { 3.

Ứng dụng ứng dụng = document.Application; Tùy chọn opt =


4. application.Create.NewGeometryOptions (); opt.ComputeRefutions = true;
5.
6.
7. Autodesk.Revit.Geometry.Element geomElem = form.get_Geometry (opt); foreach
số 8.
(GeometryObject geomObj trong geomElem) {
9.
10. Solid solid = geomObj as Solid; foreach
11. (Mặt trong solid.Faces) {
12.
13. if (face.Reference! = null) {
14.
15. DividedSurface ds = document.FamilyCreate.NewDividedSurface (face.Reference); // tạo bề mặt phân
16. chia với số lượng đường lưới U và V cố định SpacingRule srU = ds.USpacingRule;
17. srU.SetLayoutFixedNumber (16, SpacingRuleJustification.Center, 0, 0);
18.
19.
20. SpacingRule srV = ds.VSpacingRule;
21. srV.SetLayoutFixedNumber (24, SpacingRuleJustification.Center, 0, 0);
22.
23. phá vỡ; // chỉ chia một mặt của biểu mẫu
24. }
25. }
26. }
27. }
Machine Translated by Google

Hình 60: Mặt của biểu mẫu được chia theo lưới UV

Truy cập các thuộc tính USpacing và VSpacing của DividedSurface, bạn có thể xác định SpacingRule cho các đường lưới U và V bằng cách chỉ định một số lượng
lưới cố định (như trong ví dụ trên), khoảng cách cố định giữa các lưới hoặc khoảng cách tối thiểu hoặc tối đa giữa các lưới .
Thông tin bổ sung là bắt buộc đối với mỗi quy tắc giãn cách, chẳng hạn như căn chỉnh và xoay lưới.

Tạo mẫu bề mặt

Một bề mặt được chia có thể được tạo hoa văn. Bất kỳ mẫu gạch xây dựng nào cũng có thể được áp dụng cho bề mặt được chia nhỏ. Một mẫu lát là một ElementType
được gán cho DividedSurface. Mẫu gạch được áp dụng cho bề mặt theo bố cục lưới UV, vì vậy việc thay đổi các thuộc tính USpacing và VSpacing của DividedSurface
sẽ ảnh hưởng đến cách bề mặt có hoa văn xuất hiện.

Ví dụ sau minh họa cách phủ một bề mặt bị chia cắt bằng mẫu OctagonRotate. Hình tương ứng cho thấy điều này trông như thế nào khi áp dụng cho bề mặt được
phân chia trong ví dụ trước. Lưu ý rằng ví dụ này cũng trình bày cách lấy DividedSurface trên một biểu mẫu.

Vùng mã 14-8: Tạo mẫu bề mặt

1. public void TileSurface (Văn bản tài liệu, Biểu mẫu) 2. { 3. 4.

// phủ bề mặt với mẫu lát gạch OctagonRotate TilePatterns


styles = document.Settings.TilePatterns; DividedSurfaceData dsData =
5. form.GetDividedSurfaceData (); if (dsData! = null) {
6.
7.
số 8.
foreach (Tham chiếu r trong dsData.GetRefutionsWithDividedSurfaces ()) {
9.
10. DividedSurface ds = dsData.GetDividedSurfaceForReference (r); ds.ChangeTypeId
11. (pattern.GetTilePattern (TilePatternsBuiltIn.OctagonRotate) .Id);
12. }
13. }
14. }
Machine Translated by Google

Hình 61: Mẫu gạch được áp dụng cho bề mặt phân chia

Ngoài việc áp dụng các mẫu gạch xây dựng sẵn cho một bề mặt được phân chia, bạn có thể tạo các nhóm bảng điều khiển khối lượng riêng của mình bằng cách sử
dụng mẫu "Curtain Panel Pattern Based.rft". Các họ bảng điều khiển này sau đó có thể được tải vào các họ khối lượng lớn và áp dụng cho các bề mặt đã chia bằng
phương thức DividedSurface.ChangeTypeId ().

Các thuộc tính sau của Family là dành riêng cho các họ tấm rèm:

• IsCurtainPanelFamily

• CurtainPanelHorizontalSpacing - khoảng cách ngang của lưới lái

• CurtainPanelVerticalSpacing - khoảng cách dọc của lưới lái xe

• CurtainPanelTilePattern - lựa chọn mẫu gạch


Machine Translated by Google

Ví dụ sau đây trình bày cách chỉnh sửa một nhóm bảng điều khiển khối lượng mà sau đó có thể được áp dụng cho một biểu mẫu trong tài liệu khối
lượng khái niệm. Để chạy ví dụ này, trước tiên hãy tạo một tài liệu gia đình mới bằng cách sử dụng mẫu "Curtain Panel Pattern Based.rft".

Vùng mã 14-9: Chỉnh sửa họ bảng điều khiển rèm

1. Gia đình gia đình = document.OwnerFamily; 2. if


(family.IsCurtainPanelFamily == true &&
family.CurtainPanelTilePattern == TilePatternsBuiltIn.Rectangle) 3. 4. { 5.

// lần đầu tiên thay đổi khoảng cách của các lưới trong họ tài liệu
gia đình.CurtainPanelHorizontalSpacing = 20;
6. 7. family.CurtainPanelVerticalSpacing = 30;

8. 9. // tạo các điểm và đường mới trên lưới


10. Autodesk.Revit.ApplicationServices.Application app = document.Application; FilteredElementCollector
11. collector = new FilteredElementCollector (tài liệu); ICollection <Element> collection = collector.OfClass
12. (typeof (ReferencePoint)). ToElements (); int ctr = 0; ReferencePoint rp0 = null, rp1 = null, rp2 = null, rp3 = null;
13. foreach (Autodesk.Revit.DB.Element e trong bộ sưu tập) {
14.
15.
16.
17. ReferencePoint rp = e as ReferencePoint; chuyển đổi
18. (ctr) {
19.
20. trường hợp 0:

21. rp0 = rp; phá


22. vỡ; trường
23. hợp 1: rp1 = rp;
24. phá vỡ;
25. trường hợp 2:
26.
27. rp2 = rp;
28. phá vỡ;
29. trường hợp 3:
30. rp3 = rp;
31. phá vỡ;
32.
33. } ctr ++;
34. }
35.
36. ReferencePointArray rpAr = new ReferencePointArray (); rpAr.Append
37. (rp0); rpAr.Append (rp2); CurveByPoints curve1 =
38. document.FamilyCreate.NewCurveByPoints (rpAr); PointLocationOnCurve
39. pointLocationOnCurve25 = new PointLocationOnCurve
40. (PointOnCurveMeasurementType.NormalizedCurveParameter, 0,25, Po
intOnCurveMeasureFrom.Beginning);
41. PointOnEdge poeA = app.Create.NewPointOnEdge (curve1.GeometryCurve.Reference, pointLocationOnCurve25); ReferencePoint rpA =
42. document.FamilyCreate.NewReferencePoint (poeA); PointLocationOnCurve pointLocationOnCurve75 = new PointLocationOnCurve
43. (PointOnCurveMeasurementType.NormalizedCurveParameter, 0,75, Po
intOnCurveMeasureFrom.Beginning);
44. PointOnEdge poeB = app.Create.NewPointOnEdge (curve1.GeometryCurve.Reference, pointLocationOnCurve75); ReferencePoint rpB =
45. document.FamilyCreate.NewReferencePoint (poeB);
46.
47. rpAr.Clear ();
48. rpAr.Append (rp1);
49. rpAr.Append (rp3);
50. CurveByPoints curve2 = document.FamilyCreate.NewCurveByPoints (rpAr); PointOnEdge poeC =
51. app.Create.NewPointOnEdge (curve2.GeometryCurve.Reference, pointLocationOnCurve25); ReferencePoint rpC = document.FamilyCreate.NewReferencePoint
52. (poeC); PointOnEdge poeD = app.Create.NewPointOnEdge (curve2.GeometryCurve.Reference, pointLocationOnCurve75); ReferencePoint rpD =
53. document.FamilyCreate.NewReferencePoint (poeD);
54.

55. }
56. khác

57. { 58.
59. } ném ngoại lệ mới ("Vui lòng mở tài liệu họ rèm trước khi gọi lệnh này.");
Machine Translated by Google

Hình 62: Họ bảng điều khiển rèm

Hình 63: Bảng điều khiển rèm được chỉ định cho bề mặt phân chia
Machine Translated by Google

Các thành phần thích ứng

Các thành phần thích ứng được thiết kế để xử lý các trường hợp mà các thành phần cần phải linh hoạt thích ứng với nhiều điều kiện ngữ cảnh độc đáo. Ví dụ, các thành

phần thích ứng có thể được sử dụng trong các hệ thống lặp lại được tạo ra bằng cách sắp xếp nhiều thành phần phù hợp với các ràng buộc do người dùng xác định.

Đoạn mã sau đây cho thấy cách tạo một phiên bản của một họ thành phần thích ứng thành một họ khối lượng lớn và sắp xếp các điểm thích ứng trong trường hợp đó với các

điểm trong họ khối lượng lớn.

Vùng mã: Tạo một phiên bản của một họ thành phần thích ứng
1. // tìm điểm vị trí đầu tiên sẽ lưu trữ thành phần thích ứng 2. IEnumerable <ReferencePoint>
points0 = from obj trong new FilteredElementCollector (doc) .OfClass (typeof (ReferencePoint)). Cast <ReferencePoint> (
)
let type = obj as ReferencePoint trong đó
3. 4. type.Name == "PlacementPoint0" // các tên này được gán theo cách thủ công cho các điểm select obj; 5.

6. Vị trí ReferencePoint0 = points0.First (); 7. 8. // tìm điểm vị


trí thứ 2 sẽ lưu trữ thành phần thích ứng 9. IEnumerable
<ReferencePoint> points1 = from obj in new FilteredElementCollector (doc) .OfClass (typeof
(ReferencePoint)). Cast <ReferencePoint> (
)
10. let type = obj as ReferencePoint nơi
obj; 13. Vị
type.Name
trí tham ==
chiếuPoint1
"PlacementPoint1"
= points1.First
11. 12. ();
select
14.
15. if (AdaptiveComponentInstanceUtils.IsAdaptiveFamilySymbol
(biểu tượng)) 16. { 17. 18.

// tạo một thể hiện của thành phần thích ứng FamilyInstance
familyInstance = AdaptiveComponentInstanceUtils.CreateAdaptiveComponentInstance (doc, symbol);
19.
20. // tìm các điểm thích ứng trong cá thể họ IList <ElementId>
21. pointList = AdaptiveComponentInstanceUtils.GetInstancePointElementRefIds (familyInstance); ReferencePoint point0 = doc.GetElement
22. (pointList.ElementAt (0)) as ReferencePoint; ReferencePoint point1 = doc.GetElement (pointList.ElementAt (1)) as ReferencePoint;
23.
24.
25. // di chuyển các điểm của thành phần thích ứng (point0 & point1) để khớp với vị trí của các vị trí point0.Position = PositionPoint0.Position;
26. point1.Position = vị tríPoint1.Position;
27.

28. }

Datum và phần tử thông tin

Chương này giới thiệu Phần tử Datum và Phần tử Thông tin trong Revit.

• Phần tử Datum bao gồm các cấp, lưới và ModelCurves.

• Các phần tử thông tin bao gồm các giai đoạn, các tùy chọn thiết kế và EnergyDataSettings.

Để biết thêm thông tin về phân loại Phần tử Revit, hãy tham khảo Cơ bản về Phần tử

Lưu ý Nếu bạn cần thêm thông tin, hãy tham khảo chương liên quan:

• Đối với LoadBase, LoadCase, LoadCombination, LoadNature và LoadUsage, hãy tham khảo Cấu trúc Trọng lượng

• Đối với ModelCurve, hãy tham khảo Sketching

• Đối với Material và FillPattern, hãy tham khảo Vật liệu

• Đối với EnergyDataSettings, hãy tham khảo Revit Architecture


Machine Translated by Google

Các cấp độ

Cấp là một mặt phẳng ngang hữu hạn hoạt động như một tham chiếu cho các phần tử được lưu trữ ở cấp, chẳng hạn như tường, mái, sàn và trần nhà. Trong API Nền
tảng Revit, lớp Cấp có nguồn gốc từ lớp Phần tử. Thuộc tính Name được kế thừa được sử dụng để truy xuất tên cấp mà người dùng có thể nhìn thấy bên cạnh bong
bóng cấp trong giao diện người dùng Revit. Để truy xuất tất cả các cấp trong một dự án, hãy sử dụng trình lặp ElementIterator để tìm kiếm các đối tượng Cấp.

Độ cao

Lớp Level có các thuộc tính sau:

• Thuộc tính Elevation (LEVEL_ELEV) được sử dụng để truy xuất hoặc thay đổi độ cao trên hoặc dưới mặt đất.

• Thuộc tính ProjectElevation được sử dụng để truy xuất độ cao so với điểm gốc của dự án bất kể Độ cao cơ sở
Giá trị tham số.

• Cơ sở độ cao là một tham số kiểu Cấp.

o Thông số tích hợp của nó là LEVEL_RELATIVE_BASE_TYPE.

o StorageType của nó là Integer o

0 corrDesponds to Project và 1 tương ứng với Shared.

Hình 64: Thuộc tính Cơ sở Độ cao Loại Cấp

Mẫu mã sau đây minh họa cách truy xuất tất cả các cấp trong một dự án bằng cách sử dụng ElementIterator.

Vùng mã 15-1: Truy xuất tất cả các cấp độ

private void Getinfo_Level (Tài liệu tài liệu)


{
StringBuilder levelInformation = new StringBuilder ();
int levelNumber = 0;
FilteredElementCollector collector = new FilteredElementCollector (tài liệu);
ICollection <Element> collection = collector.OfClass (typeof (Level)). ToElements ();
foreach (Phần tử e trong bộ sưu tập)
{
Mức độ cấp = e là Cấp độ;

if (null! = level)
{
// theo dõi số lượng cấp độ
levelNumber ++;

// lấy tên của cấp độ


"
levelInformation.Append ("\ nTên cấp độ: + level.Name);

// lấy độ cao của cấp độ


levelInformation.Append ("\ n \ tElevation:" + level.Elevation);

// lấy độ cao của mức dự án


levelInformation.Append ("\ n \ tProject Elevation:" + level.ProjectElevation);
}
}
Machine Translated by Google

// tổng số cấp trong tài liệu hiện tại


"
levelInformation.Append ("\ n \ n Có + levelNumber + "các mức trong tài liệu!");

// hiển thị thông tin cấp trong hộp thư


TaskDialog.Show ("Revit", levelInformation.ToString ());
}

Tạo cấp độ

Sử dụng lệnh Level, bạn có thể xác định chiều cao hoặc tầng thẳng đứng trong một tòa nhà và bạn có thể tạo một tầng cho từng tầng hiện có hoặc các tham
chiếu tòa nhà khác. Các mức phải được thêm vào trong một mặt cắt hoặc chế độ xem độ cao. Ngoài ra, bạn có thể tạo một cấp độ mới bằng cách sử dụng API Nền
tảng Revit.

Mẫu mã sau đây minh họa cách tạo một cấp độ mới.

Vùng mã 15-2: Tạo một cấp độ mới

Level CreateLevel (tài liệu Autodesk.Revit.Document)


{
// Độ cao áp dụng cho cấp độ mới
cao độ kép = 20,0;

// Bắt đầu tạo một cấp độ


Mức độ = document.Create.NewLevel (độ cao);
if (null == cấp)
{
ném ngoại lệ mới ("Tạo cấp độ mới không thành công.");
}

// Thay đổi tên cấp độ


level.Name = "Cấp độ mới";

mức trả lại;

Lưu ý Sau khi tạo một cấp độ mới, Revit không tạo chế độ xem kế hoạch liên quan cho cấp độ này. Nếu cần, bạn có thể tự tạo. Để biết thêm thông tin về cách tạo chế độ

xem kế hoạch, hãy tham khảo Chế độ xem.


Machine Translated by Google

Lưới

Các lưới được đại diện bởi lớp Grid có nguồn gốc từ lớp Phần tử. Nó chứa tất cả các thuộc tính và phương thức lưới. Thuộc tính Name kế thừa được sử dụng để
truy xuất nội dung của bong bóng đường lưới.

Đường cong

Thuộc tính Grid class Curve lấy đối tượng đại diện cho hình dạng đường lưới.

• Nếu thuộc tính IsCurved trả về true, thuộc tính Curve sẽ là một đối tượng thuộc lớp Arc.

• Nếu thuộc tính IsCurved trả về false, thuộc tính Curve sẽ là một đối tượng lớp Line.

Để biết thêm thông tin, hãy tham khảo Hình học.

Đoạn mã sau đây là một ví dụ đơn giản sử dụng lớp Grid. Kết quả xuất hiện trong một hộp thông báo sau khi gọi lệnh.

Vùng mã 15-3: Sử dụng lớp Lưới

xem bản sao đơn giản vào khay nhớ tạm?

1. public void GetInfo_Grid (Grid lưới) 2. { 3.

string message = "Grid: ";


4.
5. // Hiển thị thông báo thuộc tính
"
6. IsCurved + = "\ nNếu lưới là Arc: + lưới.IsCurved;
7.
// Hiển thị thông tin về đường
8. 9. cong Autodesk.Revit.DB.Curve curve = grid.Curve; if
10. (grid.IsCurved) {
11.
12. // nếu đường cong là một cung, cung cấp thông tin tâm và bán kính
13. Autodesk.Revit.DB.Arc arc = curve as Autodesk.Revit.DB.Arc; message + = "\ nArc's
14. radius:" + arc.Radius; message + = "\ nArc's center: (" + XYZToString (arc.Center);
15.
16.
17. }
18. khác {
19. // nếu đường cong là một đường, cung cấp thông tin độ dài
20. Autodesk.Revit.DB.Line line = curve là Autodesk.Revit.DB.Line; message + = "\
21. nLine's Length:" + line.Length;
22. }
23. // Nhận thông báo điểm bắt đầu
24. đường cong + = "\ nĐiểm bắt đầu:" + XYZToString (curve.GetEndPoint (0));
25. // Nhận thông báo điểm cuối
26. đường cong + = "; Điểm cuối:" + XYZToString (curve.GetEndPoint (0));
27.
28. TaskDialog.Show ("Revit", thông báo);
29. }
30.
31. // xuất ra ba tọa độ của điểm 32. string XYZToString
(XYZ point) 33. { 34. 35. }

return "(" + point.X + "," + điểm.Y + "," + point.Z + ")";

Tạo lưới

Hai phương pháp Tài liệu được nạp chồng có sẵn để tạo lưới mới trong API Nền tảng Revit. Sử dụng phương pháp sau với các tham số khác nhau, bạn có thể tạo lưới
cong hoặc thẳng:

Vùng mã 15-4: NewGrid ()


public Grid NewGrid (Vòng cung);
public Grid NewGrid (Dòng kẻ);

Lưu ý Cung hoặc đường được sử dụng để tạo lưới phải nằm trong một mặt phẳng nằm ngang.
Machine Translated by Google

Mẫu mã sau đây minh họa cách tạo một lưới mới với một đường thẳng hoặc một cung tròn.

Vùng mã 15-5: Tạo lưới với một đường thẳng hoặc một cung tròn

1. void CreateGrid (tài liệu Autodesk.Revit.DB.Document) 2. { 3.

// Tạo đường hình học mà lưới định vị XYZ start = new XYZ (0,
4. 0, 0); XYZ end = new XYZ (30, 30, 0); Line geomLine =
5. Line.CreateBound (bắt đầu, kết thúc);
6.
7.
số 8.
// Tạo lưới bằng đường hình học Grid lineGrid =
9. document.Create.NewGrid (geomLine);
10.
11. if (null == lineGrid) {
12.
13. ném ngoại lệ mới ("Tạo một lưới thẳng mới không thành công.");
14. }
15.
16. // Sửa đổi tên của lưới đã tạo lineGrid.Name =
17. "New Name1";
18.
19. // Tạo cung hình học mà lưới định vị XYZ end0 = new XYZ (0, 0,
20. 0); XYZ end1 = new XYZ (10, 40, 0); XYZ pointOnCurve = new XYZ
21. (5, 7, 0); Arc geomArc = Arc.Create (end0, end1, pointOnCurve);
22.
23.
24.
25.
26. // Tạo lưới bằng cung hình học Grid arcGrid =
27. document.Create.NewGrid (geomArc);
28.
29. if (null == arcGrid) {
30.
31. ném ngoại lệ mới ("Tạo lưới cong mới không thành công.");
32. }
33.
34. // Sửa đổi tên của lưới đã tạo arcGrid.Name =
35. "New Name2";
36. }

Lưu ý Trong Revit , các lưới được đặt tên tự động theo dãy số hoặc bảng chữ cái khi chúng được tạo.

Bạn cũng có thể tạo nhiều lưới cùng một lúc bằng phương thức Document.NewGrids (), phương thức này nhận tham số CurveArray.

Giai đoạn

Một số dự án kiến trúc, chẳng hạn như cải tạo, tiến hành theo từng giai đoạn. Các giai đoạn có các đặc điểm sau:

• Các giai đoạn đại diện cho các khoảng thời gian riêng biệt trong vòng đời của dự án.

• Tuổi thọ của một phần tử trong một tòa nhà được kiểm soát bởi các giai đoạn.

• Mỗi phần tử có một giai đoạn xây dựng nhưng chỉ những phần tử có thời gian tồn tại hữu hạn mới có một giai đoạn phá hủy.

Tất cả các giai đoạn trong một dự án có thể được truy xuất từ đối tượng Document. Đối tượng Phase chứa ba phần thông tin hữu ích: Tên, ID và UniqueId. Các thuộc tính còn lại luôn trả về
null hoặc một tập hợp rỗng.

Mỗi thành phần mô hình mới được thêm vào dự án có ID giai đoạn đã tạo và thuộc tính ID giai đoạn bị phá hủy. Phương thức Element.AllowPhases () cho biết liệu các thuộc tính ID pha của nó có
thể được sửa đổi hay không.

Thuộc tính ID giai đoạn đã tạo có các đặc điểm sau:

• Nó xác định giai đoạn mà thành phần được thêm vào.

• Giá trị mặc định là ID giống với giá trị Pha của chế độ xem hiện tại.

• Thay đổi thông số ID pha đã tạo bằng cách chọn một giá trị mới tương ứng với danh sách thả xuống.

Thuộc tính ID giai đoạn bị phá hủy có các đặc điểm sau:

• Nó xác định thành phần bị phá hủy trong giai đoạn nào.

• Giá trị mặc định là không có.

• Phá dỡ một thành phần bằng công cụ phá hủy cập nhật thuộc tính thành giá trị ID giai đoạn hiện tại trong chế độ xem nơi bạn
phá hủy phần tử.

• Bạn có thể phá hủy một thành phần bằng cách đặt thuộc tính ID Giai đoạn Bị Phá hủy thành một giá trị khác.
Machine Translated by Google

• Nếu bạn xóa một giai đoạn bằng cách sử dụng API Nền tảng Revit, tất cả các thành phần mô hình hóa trong giai đoạn hiện tại vẫn tồn tại. Giá trị tham
số ID giai đoạn đã tạo cho các thành phần này được thay đổi thành mục tiếp theo trong danh sách thả xuống trong hộp thoại Thuộc tính.

Hình 65: Giá trị tham số thành phần tạo pha

Mẫu mã sau đây hiển thị tất cả các giai đoạn được hỗ trợ trong tài liệu hiện tại. Tên giai đoạn được hiển thị trong một hộp thông báo.

Vùng mã 15-6: Hiển thị tất cả các giai đoạn được hỗ trợ

1. void Getinfo_Phase (Tài liệu doc) 2. { 3. 4.

// Lấy mảng pha chứa tất cả các pha.


Giai đoạn PhaseArray = doc.Phases; //
Định dạng chuỗi xác định tất cả các giai đoạn được hỗ trợ trong tài liệu hiện tại.
5. 6. String prompt = null; if
(0! = phase.Size) {
7. 8.

prompt = "Tất cả các giai đoạn trong danh sách tài liệu hiện tại như sau:";
9. 10. foreach (Giai đoạn II trong các giai đoạn) {
11.
12. nhắc + = "\ n \ t" + ii.Tên;
13. }
14.
15. }
16. khác {
17. prompt = "Không có giai đoạn nào trong tài liệu hiện tại.";
18. }
19. // Cung cấp thông tin cho người dùng.
20. TaskDialog.Show ("Revit", dấu nhắc);
21. }

Tùy chọn thiết kế

Các tùy chọn thiết kế cung cấp một cách để khám phá các thiết kế thay thế trong một dự án. Các lựa chọn thiết kế cung cấp sự linh hoạt để thích ứng với những thay
đổi trong phạm vi dự án hoặc phát triển các thiết kế thay thế để xem xét. Bạn có thể bắt đầu làm việc với mô hình dự án chính và sau đó phát triển các biến thể trong
quá trình trình bày với khách hàng. Hầu hết các yếu tố có thể được thêm vào một tùy chọn thiết kế. Các yếu tố không thể được thêm vào một tùy chọn thiết kế được
coi là một phần của mô hình chính và không có lựa chọn thay thế thiết kế.

Việc sử dụng chính cho các tùy chọn Thiết kế là một thuộc tính của lớp Phần tử. Xem ví dụ sau.

Vùng mã 15-7: Sử dụng các tùy chọn thiết kế

void Getinfo_DesignOption (Tài liệu tài liệu)


{
// Lấy các Phần tử đã chọn trong Tài liệu Hoạt động

UIDocument uidoc = new UIDocument (tài liệu);


Lựa chọn ElementSet = uidoc.Selection.Elements;

foreach (phần tử Autodesk.Revit.DB.Element trong lựa chọn)


{
// Sử dụng thuộc tính DesignOption của Element
if (element.DesignOption! = null)
{
TaskDialog.Show ("Revit", element.DesignOption.Name.ToString ());
}
}
}

Các quy tắc sau áp dụng cho Tùy chọn thiết kế

• Giá trị của thuộc tính DesignOption là null nếu phần tử nằm trong Mô hình chính. Nếu không, tên bạn đã tạo trong Revit UI là
trả lại.

• Chỉ một Phần tử DesignOption hoạt động có thể tồn tại trong Tài liệu Hoạt động.
Machine Translated by Google

o Tùy chọn chính được coi là DesignOption hoạt động mặc định. Ví dụ: một bộ tùy chọn thiết kế được đặt tên là Tường và có hai tùy chọn
thiết kế trong bộ này có tên là "tường gạch" và "tường kính". Nếu "tường gạch" là tùy chọn chính, chỉ tùy chọn này và các phần tử
thuộc về nó được truy xuất bởi Trình lặp phần tử. "Tường kính" không hoạt động.
Machine Translated by Google

Phần tử chú thích

Chương này giới thiệu các phần tử chú thích Revit, bao gồm các phần sau:

• Kích thước

• DetailCurve

• IndependentTag

• TextNote

• AnnotationSymbol

Lưu ý rằng:

• Thứ nguyên là các yếu tố dành riêng cho chế độ xem hiển thị kích thước và khoảng cách trong một dự án.

• Các đường cong chi tiết được tạo ra cho các bản vẽ chi tiết. Chúng chỉ hiển thị trong chế độ xem mà chúng được vẽ. Thường thì chúng được vẽ qua
chế độ xem mô hình.

• Thẻ là một chú thích được sử dụng để xác định các phần tử trong một bản vẽ. Các thuộc tính được liên kết với thẻ có thể xuất hiện trong lịch trình.

• AnnotationSymbol có nhiều tùy chọn leader khi được tải vào một dự án.

Để biết thêm thông tin về phân loại Revit Element, hãy tham khảo Elements Essentials.

Kích thước và ràng buộc

Lớp Thứ nguyên đại diện cho các kích thước vĩnh viễn và các yếu tố ràng buộc liên quan đến thứ nguyên. Các thứ nguyên tạm thời được tạo trong khi chỉnh sửa một phần
tử trong giao diện người dùng không thể truy cập được. Độ cao điểm và tọa độ điểm được đại diện bởi lớp SpotDimension.

Mẫu mã sau đây minh họa, ở gần cuối, cách phân biệt các kích thước vĩnh viễn với các phần tử ràng buộc.

Vùng mã 16-1: Phân biệt các kích thước vĩnh viễn với các ràng buộc

1. public void GetInfo_Dimension (Kích thước thứ nguyên) 2. { 3. 4.

string message = "Thứ nguyên: ";


// Nhận thông báo tên thứ
"
nguyên + = "\ nTên thứ nguyên là: + thứ nguyên.Name;
5. 6.
7. // Lấy đường cong thứ nguyên
số 8. Autodesk.Revit.DB.Curve curve = angle.Curve; if (curve! = null
9. && curve.IsBound) {
10.
11. // Nhận thông báo điểm bắt đầu
12. đường cong + = "\ n Điểm đầu đường cong :(" + curve.GetEndPoint (0) .X + "," +
13. curve.GetEndPoint (0) .Y + "," + curve.GetEndPoint
thông báo (0)
điểm.Zcuối
+ ")";
đường
// Nhận
cong + = ";
14. Điểm cuối đường cong :(" + curve.GetEndPoint (1) .X + "," + curve.GetEndPoint (1) .Y + ","
15. + curve.GetEndPoint (1) .Z + ")";
16.
17. }
18.
19. // Nhận thông báo tên loại thứ
"
20. nguyên + = "\ nTên loại thứ nguyên là: + kích thước.DimensionType.Name;
21.
22. // Nhận thông báo tên chế độ xem
"
23. thứ nguyên + = "\ nTên chế độ xem thứ nguyên là: + thứ nguyên.View.Name;
24.
25. // Nhận thông báo về số tham chiếu Thứ
26. nguyên + = "\ n Số tham chiếu thứ nguyên là" + kích thước. tài liệu tham khảo.Size;
27.
28. if ((int) BuiltInCategory.OST_Dimensions == kích thước.Category.Id.IntegerValue) {
29.
30. message + = "\ nKích thước là thứ nguyên cố định.";
31.
32. } else if ((int) BuiltInCategory.OST_Constraints ==mens.Category.Id.IntegerValue) {
33.
34. message + = "\ nDimension là một phần tử ràng buộc.";
35. }
36.
37.
38. TaskDialog.Show ("Revit", thông báo);
39. }
Machine Translated by Google
Machine Translated by Google

Kích thước

Có năm loại kích thước vĩnh viễn:

• Kích thước chiều dài

• Kích thước hướng tâm

• Kích thước đường kính

• Kích thước góc

• Kích thước chiều dài hồ quang

Hình 66: Kích thước cố định

Danh mục được xây dựng cho tất cả các thứ nguyên cố định là OST_Dimensions. Không có cách nào dễ dàng để phân biệt bốn thứ nguyên bằng cách sử dụng API.

Ngoại trừ kích thước xuyên tâm và kích thước đường kính, mọi kích thước đều có một đường kích thước. Các đường kích thước có sẵn từ thuộc tính Dimension.Curve luôn không
bị ràng buộc. Nói cách khác, đường kích thước không có điểm đầu hoặc điểm cuối. Dựa trên hình trước:

• Một đối tượng Line được trả về cho một kích thước tuyến tính.

• Một đối tượng vòng cung được trả về cho một kích thước hướng tâm hoặc kích thước góc.

• Một kích thước xuyên tâm trả về giá trị rỗng.

• Kích thước diamter trả về null.

Hình 67: Tham chiếu thứ nguyên

Kích thước được tạo bằng cách chọn các tham chiếu hình học như hình trước cho thấy. Tham chiếu hình học được biểu diễn dưới dạng lớp Tham chiếu trong API. Các
tham chiếu thứ nguyên sau đây có sẵn từ thuộc tính Tham chiếu. Để biết thêm thông tin về Tài liệu tham khảo, vui lòng xem Tài liệu tham khảo trong Hình học tiết diện.

• Kích thước hướng tâm và đường kính - Một đối tượng tham chiếu cho đường cong được trả về

• Kích thước chiều dài góc và cung - Hai đối tượng Tham chiếu được trả về.

• Kích thước tuyến tính - Hai hoặc nhiều Đối tượng tham chiếu được trả về. Trong hình sau, kích thước tuyến tính có năm Tham chiếu
các đối tượng.
Machine Translated by Google

Hình 68: Tham chiếu kích thước tuyến tính

Thứ nguyên, giống như các Phần tử chú thích khác, dành cho chế độ xem cụ thể. Chúng chỉ hiển thị trong dạng xem nơi chúng được thêm vào. Thuộc tính Dimension.View trả về chế độ xem cụ
thể.

Yếu tố ràng buộc

Đối tượng thứ nguyên có Ràng buộc danh mục (BuitInCategory.OST_Constraints) đại diện cho hai loại ràng buộc liên quan đến thứ nguyên:

• Ràng buộc về kích thước tuyến tính và xuyên tâm

• Ràng buộc về bình đẳng

Trong hình sau đây, hai loại ràng buộc bị khóa tương ứng với kích thước tuyến tính và hướng tâm. Trong ứng dụng, chúng xuất hiện dưới dạng khóa móc với các đường đứt nét màu
xanh lá cây. (Đường đứt nét màu xanh lá cây có sẵn từ thuộc tính Dimension.Curve.) Cả hai ràng buộc về kích thước tuyến tính và xuyên tâm đều trả về hai đối tượng Tham chiếu từ thuộc tính
Dimension.Refferences.

Hình 69: Các ràng buộc về kích thước tuyến tính và bán kính

Các phần tử ràng buộc không dành riêng cho chế độ xem và có thể hiển thị trong các chế độ xem khác nhau. Do đó, thuộc tính View luôn trả về null. Trong hình sau, các phần tử ràng
buộc trong hình trước cũng hiển thị trong chế độ xem 3D.

Hình 70: Các ràng buộc về kích thước tuyến tính và xuyên tâm trong chế độ xem 3D

Mặc dù các ràng buộc bình đẳng dựa trên các thứ nguyên, nhưng chúng cũng được đại diện bởi lớp Thứ nguyên. Không có cách trực tiếp nào để phân biệt các ràng buộc về thứ nguyên
tuyến tính với các ràng buộc bình đẳng trong API bằng cách sử dụng một danh mục hoặc DimensionType. Các ràng buộc bằng nhau trả về ba hoặc nhiều Tham chiếu trong khi các ràng buộc về thứ
nguyên tuyến tính trả về hai hoặc nhiều Tham chiếu.
Machine Translated by Google

Hình 71: Các ràng buộc về bình đẳng

Lưu ý Không phải tất cả các phần tử ràng buộc đều được đại diện bởi lớp Thứ nguyên nhưng tất cả đều thuộc về một danh mục Ràng buộc (OST_Constraints) chẳng hạn
như ràng buộc căn chỉnh.

Kích thước điểm

Tọa độ điểm và độ cao điểm được đại diện bởi lớp SpotDimension và được phân biệt theo danh mục. Giống như thứ nguyên cố định, thứ nguyên tại chỗ dành
riêng cho chế độ xem. Loại và danh mục cho từng thứ nguyên vị trí được liệt kê trong bảng sau:

Bảng 35: Loại và loại kích thước điểm

Loại hình Loại

Tọa độ điểm OST_SpotCo tọa độ

Độ cao điểm OST_SpotElevations

Hình 72: Tọa độ Spot và Điểm định vị

Vị trí SpotDimension có thể được truyền xuống LocationPoint để tọa độ điểm mà thứ nguyên điểm trỏ tới có sẵn từ thuộc tính LocationPoint.Point.

• SpotDimensions không có đường cong thứ nguyên nên thuộc tính Curve của chúng luôn trả về null.

• Thuộc tính SpotDimension References trả về một Tham chiếu đại diện cho điểm hoặc cạnh được tham chiếu bởi kích thước điểm.

• Để kiểm soát kiểu hiển thị văn bản và thẻ, hãy sửa đổi Tham số SpotDimension và SpotDimensionType.
Machine Translated by Google

So sánh

Bảng sau so sánh các loại thứ nguyên và ràng buộc khác nhau trong API:

Bảng 36: So sánh loại thứ nguyên

Thứ nguyên hoặc Ràng buộc Lớp API BuiltInCategory Đường cong Chế độ xem tham khảo Địa điểm

Thứ nguyên tuyến tính Thứ nguyên vĩnh viễn Thứ nguyên OST_Dimensions A Line> = 2 Chế độ xem cụ thể null

kích thước xuyên tâm Vô giá trị 1

kích thước đường kính Vô giá trị 1

kích thước góc An Arc 2

kích thước chiều dài cung An Arc 2

Giới hạn thứ nguyên giới hạn kích thước tuyến tính OST_Constraints An Arc 2

kích thước góc An Arc 2

Ràng buộc bình đẳng Một dòng> = 3

Tạo và xóa

Phương thức NewDimension () có sẵn trong lớp Creation.Document. Phương pháp này chỉ có thể tạo một thứ nguyên tuyến tính.

Vùng mã 16-2: NewDimension ()


1. public Dimension NewDimension (View view, Line line, tham chiếu ReferenceArray)

1. public Dimension NewDimension (View view, Line line, ReferenceArray tham chiếu, 2. DimensionTypensionType)

Sử dụng các tham số đầu vào của phương thức NewDimension (), bạn có thể xác định Chế độ xem hiển thị, đường kích thước và Tham chiếu (hai hoặc nhiều hơn).
Tuy nhiên, không có cách nào dễ dàng để phân biệt một thứ nguyên tuyến tính DimensionType với các loại khác. Phương thức NewDimension () quá tải với tham số DimensionType
hiếm khi được sử dụng.

Đoạn mã sau minh họa cách sử dụng phương thức NewDimension () để sao chép một thứ nguyên.

Vùng mã 16-3: Nhân bản thứ nguyên với NewDimension ()


1. public void DuplicateDimension (Tài liệu tài liệu, Kích thước thứ nguyên) 2. { 3. 4.

Line line = kích thước.Curve as Line; if


(null ! = line) {
5.
6. Chế độ xem Autodesk.Revit.DB.View = chiều.View; Tham chiếu
7. ReferenceArray = kích thước.Refferences; Dimension newDimension
số 8.
= document.Create.NewDimension (xem, dòng, tham chiếu);
}
9. 10. }

Mặc dù chỉ có các kích thước tuyến tính được tạo, bạn có thể xóa tất cả các kích thước và ràng buộc được thể hiện bởi Dimension và SpotDimension bằng cách sử dụng
phương thức Document.Delete ().
Machine Translated by Google

Đường cong chi tiết

Đường cong chi tiết là một thành phần Chi tiết quan trọng thường được sử dụng trong chế độ xem chi tiết hoặc bản phác thảo. Các đường cong chi tiết có thể truy cập được trong lớp
DetailCurve và các lớp dẫn xuất của nó.

DetailCurve dành riêng cho từng chế độ xem cũng như các phần tử chú thích khác. Tuy nhiên, không có thuộc tính DetailCurve.View. Khi tạo đường cong chi tiết, bạn
phải so sánh đường cong chi tiết với chế độ xem đường cong mô hình.

Vùng mã 16-4: NewDetailCurve () và NewModelCurve ()


public DetailCurve NewDetailCurve (View, Curve, SketchPlane)

public ModelCurve NewModelCurve (Curve, SketchPlane)

Nói chung, chỉ các chế độ xem 2D như chế độ xem mức và chế độ xem độ cao mới được chấp nhận, nếu không sẽ có một ngoại lệ.

Ngoại trừ các tính năng liên quan đến chế độ xem, DetailCurve rất giống với ModelCurve. Để biết thêm thông tin về các thuộc tính và cách sử dụng ModelCurve, hãy
xem ModelCurve trong Sketching tiết diện.

Thẻ
Thẻ là một chú thích được sử dụng để xác định các phần tử bản vẽ. API cho thấy các lớp IndependentTag và RoomTag bao gồm hầu hết các thẻ được sử dụng trong
ứng dụng Revit. Để biết thêm chi tiết về RoomTag, hãy xem Phòng trong Kiến trúc Revit tiết diện.

Lưu ý Lớp IndependentTag đại diện cho phần tử thẻ trong Revit và các thẻ cụ thể khác như bài phát biểu chính, thẻ hệ thống chùm, biểu tượng mạch điện tử
(Revit MEP), v.v. Trong mã nội bộ Revit, các thẻ cụ thể có các lớp tương ứng bắt nguồn từ IndependentTag. Do đó, các tính năng cụ thể không được API hiển thị và
không thể được tạo bằng phương thức NewTag (). Chúng có thể được phân biệt theo các loại sau:

Bảng 37: Tên và danh mục thẻ

Tên thẻ BuiltInCategory

Thẻ Keynote OST_KeynoteTags

Thẻ hệ thống chùm OST_BeamSystemTags

Thẻ mạch điện tử OST_ElectricalCircuitTags

Thẻ hướng Span OST_SpanDirectionSymbol

Thẻ khoảng cách gia cố đường dẫn OST_PathReinSpanSymbol

Thẻ khoảng cách hệ thống cốt thép OST_IOSRebarSystemSpanSymbolCtrl

Trong phần này, trọng tâm chính là loại thẻ được trình bày trong hình sau.

Hình 73: IndependentTag

Mọi danh mục trong thư viện gia đình đều có một thẻ được tạo sẵn. Một số thẻ được tải tự động bằng mẫu ứng dụng Revit mặc định, trong khi các thẻ khác được
tải theo cách thủ công. Các đối tượng IndependentTag trả về các danh mục khác nhau dựa trên phần tử máy chủ nếu nó được tạo bằng tùy chọn Theo Danh mục. Ví dụ: Wall
và Floor IndependentTag tương ứng là OST_WallTags và OST_FloorTags.

Nếu thẻ được tạo bằng kiểu Multi-Category hoặc Material, các danh mục của chúng tương ứng là OST_MultiCategoryTags và OST_MaterialTags.

Lưu ý rằng NewTag () chỉ hoạt động trong chế độ xem 2D hoặc trong chế độ xem 3D bị khóa, nếu không sẽ có một ngoại lệ. Đoạn mã sau là một ví dụ về việc tạo
IndependentTag. Chạy nó khi chế độ xem mức là chế độ xem đang hoạt động.
Machine Translated by Google

Lưu ý Bạn không thể thay đổi trực tiếp văn bản được hiển thị trong IndependentTag. Bạn cần thay đổi thông số được sử dụng để điền văn bản thẻ vào Loại gia đình cho Phần tử đang được gắn thẻ.

Trong ví dụ bên dưới, tham số đó là "Type Mark", mặc dù cài đặt này có thể được thay đổi trong Family Editor trong Revit UI.

Vùng mã 16-5: Tạo thẻ IndependentTag

1. Private IndependentTag CreateIndependentTag (tài liệu Autodesk.Revit.DB.Document, Wall wall) 2. { 3. 4.

// đảm bảo chế độ xem đang kích hoạt không phải là chế
độ xem 3D Autodesk.Revit.DB.View view = document.ActiveView;

5. 6. // xác định chế độ thẻ và hướng thẻ cho thẻ mới TagMode tagMode =
TagMode.TM_ADDBY_CATEGORY; TagOrientation tagorn =
7. 8. TagOrientation.Horizontal;

9. 10. // Thêm thẻ vào giữa bức tường LocationCurve wallLoc


11. = wall.Location as LocationCurve; XYZ wallStart = wallLoc.Curve.GetEndPoint
12. (0); XYZ wallEnd = wallLoc.Curve.GetEndPoint (1); XYZ wallMid =
13. wallLoc.Curve.Evaluate (0,5, đúng);
14.
15.
16. IndependentTag newTag = document.Create.NewTag (view, wall, true, tagMode, tagorn, wallMid); if (null == newTag) {
17.
18.
19. ném Exception mới ("Tạo thẻ IndependentTag không thành công.");
20. }
21.
22. // newTag.TagText là chỉ đọc, vì vậy chúng tôi thay đổi tham số kiểu Type Mark thành // đặt văn bản
23. thẻ. Tham số nhãn cho họ thẻ xác định // tham số loại nào được sử dụng cho văn bản thẻ.
24.
25.
26. WallType type = wall.WallType;
27.
28. Tham số tìm thấyParameter = type.get_Parameter (" Đánh dấu loại"); bool result
29. = foundParameter.Set ("Xin chào");
30.
31. // đặt chế độ người lãnh đạo miễn
32. phí // nếu không thì điểm cuối của người lãnh đạo di chuyển bằng điểm khuỷu tay
33.
34. newTag.LeaderEndCondition = LeaderEndCondition.Free; XYZ elbowPnt =
35. wallMid + mới XYZ (5.0, 5.0, 0.0); newTag.LeaderElbow = elbowPnt; XYZ
36. headerPnt = wallMid + new XYZ (10.0, 10.0, 0.0); newTag.TagHeadPosition
37. = headerPnt;
38.
39.
40. trả về newTag;
41. }

Hình 74: Tạo IndependentTag bằng mã mẫu

T
Machine Translated by Google

máy lẻ

Trong API, lớp TextNote đại diện cho Văn bản. Các tính năng chung của nó như sau:

Bảng 38: Các tính năng chung của TextNote

Hàm số Phương thức hoặc thuộc tính API

Thêm văn bản vào ứng dụng Phương thức Document.Create.NewTextNote ()

Lấy và đặt chuỗi từ thành phần văn bản Thuộc tính TextNote.Text

Nhận và đặt vị trí thành phần văn bản Thuộc tính TextNote.Coord

Nhận và đặt chiều rộng thành phần văn bản Thuộc tính TextNote.Width

Nhận tất cả các nhà lãnh đạo thành phần văn bản Thuộc tính TextNote.Leaders

Thêm một thủ lĩnh vào thành phần văn bản Phương thức TextNote.AddLeader ()

Xóa tất cả các nhà lãnh đạo khỏi thành phần văn bản Phương thức TextNote.RemoveLeaders ()

Revit hỗ trợ hai loại Lãnh đạo: Lãnh đạo thẳng và Lãnh đạo vòng cung. Kiểm soát kiểu thủ lĩnh TextNote bằng kiểu liệt kê TextNoteLeaderType:

Bảng 39: Các loại nhà lãnh đạo

Hàm số Tên thành viên

TNLT_ARC_R

-Thêm một nhà lãnh đạo vòng cung đúng

TNLT_ARC_L

-Thêm một nhà lãnh đạo vòng cung bên trái

TNLT_STRAIGHT_R

-Thêm một nhà lãnh đạo đúng đắn.

TNLT_STRAIGHT_L

-Thêm một nhà lãnh đạo bên trái.

Lưu ý Không thể thêm đường dẫn thẳng và đường dẫn vòng cung vào loại Văn bản cùng một lúc.

Biểu tượng chú thích

Biểu tượng chú thích là một ký hiệu được áp dụng cho một họ để xác định duy nhất họ đó trong một dự án.

Hình 75: Thêm ký hiệu chú thích

Hình 76: Biểu tượng chú thích với hai thủ lĩnh
Machine Translated by Google

Tạo và xóa

Các biểu tượng chú thích có thể được tạo bằng cách sử dụng quá tải sau của phương thức Creation.Document.NewFamilyInstance ():

Vùng mã 16-6: Tạo một biểu tượng chú thích mới

1. public FamilyInstance NewFamilyInstance Method (nguồn gốc XYZ, biểu tượng FamilySymbol, View specView)

Biểu tượng chú thích có thể bị xóa bằng phương thức Document.Delete ().

Thêm và Xóa nhóm trưởng

Thêm và xóa các nhà lãnh đạo bằng cách sử dụng các phương thức addLeader () và removeLeader ().

Vùng mã 16-7: Sử dụng addLeader () và removeLeader ()

1. public void AddAndRemoveLeaders (ký hiệu AnnotationSymbol) 2. { 3.

int leaderSize = symbol.Leaders.Size; string


4. message = "Số lượng các nhà lãnh đạo trong Ký hiệu Chú thích trước khi thêm:" + leaderSize;
5. Symbol.addLeader (); leaderSize = biểu tượng.Leaders.Size; message + = "\ nSố người lãnh
đạo sau khi thêm:" Symbol.removeLeader (); leaderSize = biểu tượng.Leaders.Size; message
6. 7. + = "\ nSố người lãnh đạo sau khi xóa: + leaderSize;

8. 9.
"
10. + leaderSize;
11.
12. TaskDialog.Show ("Revit", thông báo);
13. }
Machine Translated by Google

Hình học
Không gian tên Autodesk.Revit.DB chứa nhiều lớp liên quan đến hình học và các loại liên quan đến đồ họa được sử dụng để mô tả biểu diễn đồ họa trong API. Các lớp liên quan
đến hình học bao gồm:

• Lớp GeometryObject - Bao gồm các lớp dẫn xuất từ lớp GeometryObject.

• Các lớp của Trình trợ giúp Hình học - Bao gồm các lớp bắt nguồn từ lớp APIObject và các kiểu giá trị

• Các lớp Tiện ích Hình học - Bao gồm các lớp để tạo hình học không nguyên tố và tìm giao điểm của các chất rắn

• Các lớp thu thập - Bao gồm các lớp dẫn xuất từ giao diện IEnumerable hoặc IEnumerator.

Trong phần này, bạn học cách sử dụng các kiểu đồ họa khác nhau liên quan đến cách lấy dữ liệu hình học từ một phần tử, cách biến đổi một phần tử và hơn thế nữa.

Ví dụ: Lấy dữ liệu hình học từ tường


Hướng dẫn này minh họa cách lấy dữ liệu hình học từ một bức tường. Thông tin sau được bao gồm:

• Lấy các cạnh hình học của tường.

• Nhận các mặt hình học của tường.


Lưu ý Việc truy xuất dữ liệu hình học từ Phần tử trong ví dụ này bị hạn chế vì Phiên bản không được xem xét. Ví dụ, quét tường bao gồm không có sẵn trong mã mẫu. Mục

tiêu của hướng dẫn này là cung cấp cho bạn ý tưởng cơ bản về cách truy xuất dữ liệu hình học nhưng không bao gồm tất cả các điều kiện. Để biết thêm thông tin về cách

truy xuất dữ liệu hình học từ Phần tử, hãy tham khảo Ví dụ: Lấy dữ liệu hình học từ một chùm tia.

Tạo các tùy chọn hình học

Để có được thông tin hình học của bức tường, bạn phải tạo một đối tượng Geometry.Options cung cấp các tùy chọn tùy chỉnh chi tiết. Mã như sau:

Vùng mã 20-1: Tạo hình học.


Autodesk.Revit.DB.Options geomOption = application.Create.NewGeometryOptions ();

if (null! = geomOption)

geomOption.ComputeRefutions = true;

geomOption.DetailLevel = Autodesk Autodesk.Revit.DB.DetailLevels.Fine;

// Có thể đặt DetailLevel hoặc View, nhưng không thể đặt cả hai

//geomOption.View = commandData.Application.ActiveUIDocument.Document.ActiveView;

TaskDialog.Show ("Revit", "Tùy chọn hình học được tạo thành công.");

Lưu ý Để biết thêm thông tin, hãy tham khảo Geometry.Options.

Truy xuất mặt và cạnh

Hình học tường là một khối vững chắc được tạo thành từ các mặt và các cạnh. Hoàn thành các bước sau để lấy các mặt và các cạnh:

1. Lấy một thể hiện Geometry.Element bằng cách sử dụng thuộc tính Wall class Geometry. Phiên bản này chứa tất cả các đối tượng hình học trong
Thuộc tính đối tượng, chẳng hạn như một nét liền, một đường, v.v.

2. Lặp lại thuộc tính Object để có được một thể hiện khối hình học chứa tất cả các mặt và cạnh hình học trong Mặt và Cạnh
đặc tính.

3. Lặp lại thuộc tính Faces để lấy tất cả các mặt hình học.

4. Lặp lại thuộc tính Edges để lấy tất cả các cạnh hình học.
Machine Translated by Google

Mã mẫu sau:

Vùng mã 20-2: Lấy mặt và cạnh

1. private void GetFacesAndEdges (Tường tường) 2. { 3.

Chuỗi faceInfo = "";


4.
5. Autodesk.Revit.DB.Options opt = new Options ();
6. Autodesk.Revit.DB.GeometryElement geomElem = wall.get_Geometry (opt); foreach (GeometryObject
7. geomObj trong geomElem) {
số 8.

9. Solid geomSolid = geomObj as Solid; if (null !


10. = geomSolid) {
11.
12. int khuôn mặt =
13. 0; tổng gấp đôiArea = 0;
14. foreach (Khuôn mặt geomFace trong geomSolid.Faces) {
15.
16. khuôn mặt +
" "
17. +; faceInfo + = "Khuôn mặt" + khuôn mặt + diện tích: + geomFace.Area.ToString () + "\ n";
18. totalArea + = geomFace.Area;
19.
20. } faceInfo + = "Số khuôn mặt:" faceInfo + khuôn mặt + "\ n";
"
21. + = "Tổng diện tích: + totalArea.ToString
() + " \ n "; foreach (Cạnh geomEdge
22. trong geomSolid.Edges) {
23.
24. // lấy các cạnh hình học của bức tường
25. }
26. }
27. }
28. TaskDialog.Show ("Revit", faceInfo);
29. }

Lớp GeometryObject
Thuộc tính đã lập chỉ mục Element.Geometry [] có thể được sử dụng để kéo hình học của bất kỳ phần tử mô hình nào (phần tử 3D). Điều này áp dụng cho cả các
trường hợp gia đình hệ thống như tường, sàn và mái nhà, cũng như các trường hợp gia đình thuộc nhiều loại, ví dụ như cửa ra vào, cửa sổ, đồ nội thất, hoặc
quần chúng.

Hình học đã trích xuất được trả lại cho bạn dưới dạng Autodesk.Revit.DB.GeometryElement. Bạn có thể lặp qua các thành viên hình học của phần tử đó bằng cách sử
dụng phương thức GetEnumerator ().

Thông thường, các đối tượng được trả về ở cấp cao nhất của hình được trích xuất sẽ là một trong số:

• Rắn - biểu diễn ranh giới được tạo thành từ các mặt và các cạnh

• Lưới - một mảng hình tam giác 3D

• Đường cong - một đường cong 3D có giới hạn

• Điểm - mức dữ liệu điểm có thể nhìn thấy tại một vị trí 3D nhất định

• PolyLine - một loạt các đoạn thẳng được xác định bởi các điểm 3D

• GeometryInstance - một ví dụ của một phần tử hình học được định vị trong phần tử
Machine Translated by Google

Hình này minh họa thứ bậc của các đối tượng được tìm thấy bằng cách trích xuất hình học.

Một đường cong đại diện cho một đường dẫn trong 2 hoặc 3 chiều trong mô hình Revit. Các đường cong có thể đại diện cho toàn bộ phạm vi hình học của một phần tử (ví dụ: CurveElements) hoặc có

thể xuất hiện dưới dạng một phần hình học của một phần tử (ví dụ: đường tâm của tường hoặc ống dẫn). Các đường cong và tập hợp các đường cong được sử dụng làm đầu vào trong nhiều

các phương pháp tạo phần tử trong API.

• Tham số hóa đường cong

• Phân tích đường cong

• Các loại đường cong

• Biểu diễn toán học của các loại đường cong


• Tạo đường cong

• Bộ sưu tập đường cong

Phân tích đường cong

Có một số thành viên Curve là những công cụ thích hợp để sử dụng trong phân tích hình học. Trong một số trường hợp, các API này làm được nhiều hơn những gì bạn có thể mong đợi bằng cách xem

xét nhanh tên của chúng.

Giao nhau()

Phương pháp Intersect cho phép bạn so sánh hai đường cong để tìm xem chúng khác nhau như thế nào hoặc chúng giống nhau như thế nào. Nó có thể được sử dụng theo cách bạn có thể mong đợi, để lấy

điểm hoặc (các) điểm mà hai đường cong cắt nhau, nhưng nó cũng có thể được sử dụng để xác định:

• Đường thẳng hàng

• Dòng chồng chéo

• Đường cong giống hệt nhau

• Các đường cong hoàn toàn khác biệt không có giao lộ

Giá trị trả về xác định các kết quả khác nhau này và kết quả đầu ra IntersectionSetResult chứa thông tin về (các) điểm giao nhau.

Dự án()

Phương thức Project chiếu một điểm lên đường cong và trả về thông tin về điểm gần nhất trên đường cong, tham số của nó và khoảng cách từ điểm chiếu.

Tessntic ()

Điều này chia đường cong thành một loạt các đoạn tuyến tính, chính xác trong một dung sai mặc định. Đối với Curve.Tessosystem (), dung sai lớn hơn một chút so với 1/16 ”. Dung sai xấp xỉ này là

dung sai được Revit sử dụng bên trong sao cho phù hợp cho mục đích hiển thị.

Lưu ý rằng chỉ các dòng có thể được tách thành đầu ra của chỉ hai điểm tessellation; các đường cong phi tuyến tính sẽ luôn xuất ra nhiều hơn hai điểm ngay cả khi đường cong có bán kính cực lớn

mà về mặt toán học có thể tương đương với một đường thẳng.
Machine Translated by Google

Bộ sưu tập đường cong

API Revit sử dụng các loại tập hợp đường cong khác nhau làm đầu vào:

• CurveLoop - điều này đại diện cho một chuỗi các đường cong cụ thể được nối từ đầu đến cuối. Nó có thể đại diện cho một vòng kín hoặc một vòng mở. Tạo nó bằng cách sử dụng:

o CurveLoop.Create ()

o CurveLoop.CreateViaCopy ()

o CurveLoop.CreateViaThicken ()

• CurveArray - lớp tập hợp này đại diện cho một tập hợp các đường cong tùy ý. Tạo nó bằng cách sử dụng hàm tạo của nó.

• CurveArrArray - lớp tập hợp này là một tập hợp các CurveArrays. Khi điều này được sử dụng, tổ chức của các phần tử con của mảng này có ý nghĩa

đối với phương thức này được chuyển đến; ví dụ, trong NewExtrusion () nhiều CurveArrays sẽ đại diện cho các vòng đóng khác nhau.

Các phương thức API mới hơn sử dụng bộ sưu tập .NET của Curves thay cho CurveArray và CurveArrArray.

Tạo đường cong

Các đường cong thường cần thiết làm đầu vào cho các phương pháp Revit API. Các đường cong có thể được tạo các phương thức tĩnh trên các lớp liên kết:

• Line.CreateBound ()

• Line.CreateUnbound ()

• Arc.Create ()

• Ellipse.Create ()

• NurbSpline.Create ()

• HermiteSpline.Create ()

• Curve.CreateTransformed ()

Các phương pháp tạo đường cong ngăn cản việc tạo ra các đường cong ngắn hơn dung sai của Revit. Dung sai này được hiển thị thông qua thuộc tính

Application.ShortCurveTolerance.

Tham số đường cong

Các đường cong trong Revit API có thể được mô tả dưới dạng các hàm toán học của tham số đầu vào “u”, trong đó vị trí của đường cong tại bất kỳ điểm nào đã cho trong không gian XYZ là

một hàm của "u".

Các đường cong có thể bị ràng buộc hoặc không bị ràng buộc. Các đường cong không liên kết không có điểm cuối, đại diện cho một phần trừu tượng vô hạn (một đường không liên kết) hoặc một đường cong tuần hoàn (một hình tròn hoặc

hình elip).

Trong Revit, tham số “u” có thể được biểu diễn theo hai cách:

• Một tham số 'chuẩn hóa'. Giá trị bắt đầu của tham số là 0,0 và giá trị kết thúc là 1,0. Đối với một số loại đường cong, điều này làm cho việc đánh giá đường cong dọc theo các phạm vi

của nó rất dễ dàng, ví dụ: điểm giữa của một đoạn thẳng ở tham số 0,5. (Lưu ý rằng đối với các phương trình đường cong phức tạp hơn như Splines, giả thiết này không phải lúc nào

cũng được thực hiện).

• Một tham số 'thô'. Giá trị bắt đầu và giá trị kết thúc của tham số có thể là bất kỳ giá trị nào. Đối với một đường cong nhất định, giá trị của giá trị thô tối thiểu và tối đa

tham số có thể được lấy thông qua Curve.GetEndParameter (int). Các tham số thô rất hữu ích vì đơn vị của chúng giống với đơn vị mặc định của Revit (feet). Vì vậy, để có được vị trí

5 feet dọc theo đường cong từ điểm bắt đầu, bạn có thể lấy tham số thô ở đầu và thêm 5 vào đó. Các thông số thô cũng là cách duy nhất để đánh giá các đường cong không liên kết.

Các phương thức Curve.ComputeNormalizedParameter () và Curve.ComputeRawParameter () tự động chia tỷ lệ giữa hai loại tham số. Phương thức Curve.IsInside () đánh giá một tham số thô để xem nó

có nằm trong giới hạn của đường cong hay không.

Bạn có thể sử dụng tham số để đánh giá nhiều thuộc tính khác nhau của đường cong tại bất kỳ vị trí nhất định nào:

• Vị trí XYZ của đường cong đã cho. Điều này được trả về từ Curve.Evaluate (). Có thể cung cấp thông số thô hoặc thông số chuẩn hóa. Nếu bạn cũng vậy

gọi ComputeDeri Phái sinh (), đây cũng là thuộc tính .Origin của Transform được phương thức đó trả về.

• Vectơ đạo hàm / tiếp tuyến đầu tiên của đường cong đã cho. Đây là thuộc tính .BasisX của Transform được trả về bởi Curve.ComputeDeriuct ().

• Đạo hàm / vectơ pháp tuyến cấp hai của đường cong đã cho. Đây là thuộc tính .BasisY của Transform được trả về bởi Curve.ComputeDeriuct ().

• Vectơ pháp tuyến của đường cong đã cho, được định nghĩa là tích chéo của vectơ tiếp tuyến và pháp tuyến. Đây là thuộc tính .BasisZ của Transform

được trả về bởi Curve.ComputeDeriuct ().

Tất cả các vectơ được trả về đều không được chuẩn hóa (nhưng bạn có thể chuẩn hóa bất kỳ vectơ nào trong Revit API với XYZ.Normalize ()). Lưu ý rằng sẽ không có giá trị nào được đặt cho vectơ

pháp tuyến và sinh chuẩn khi đường cong là một đường thẳng. Bạn có thể tính một vectơ pháp tuyến cho đường thẳng trong một mặt phẳng nhất định bằng cách sử dụng tiếp tuyến

vectơ.
Machine Translated by Google

Mẫu API "Tính toán hướng" sử dụng vectơ tiếp tuyến với đường cong vị trí tường để tìm các bức tường bên ngoài quay về phía nam:

Tìm và làm nổi bật các bức tường bên ngoài hướng về phía nam
Machine Translated by Google

Các loại đường cong

Revit sử dụng nhiều loại đường cong khác nhau để biểu diễn hình học đường cong trong tài liệu. Bao gồm các:

Loại đường cong Lớp API Revit Sự định nghĩa Ghi chú

Một đoạn thẳng được xác định bởi các Nhận điểm cuối từ
Đường ranh giới Hàng
điểm cuối của nó. Curve.GetEndpoint ()

Xác định những điều này với Curve.IsBound.

Đánh giá vectơ điểm và tiếp tuyến tại tham số thô


Một đường vô hạn được xác định bởi
Dòng không ràng buộc
= 0 để tìm các tham số đầu vào cho phương trình
một vị trí và hướng
của

hàng.

Bắt đầu và kết thúc ở một góc độ nhất định.

Các góc này có thể nhận được bằng các giá trị
Hồ quang Hồ quang Một cung tròn giới hạn
tham số thô ở mỗi đầu cung.

Xác định bằng Curve.IsBound.

Vòng tròn Hồ quang Một vòng kết nối không bị ràng buộc
Sử dụng tham số thô để đánh giá (từ 0 đến 2π)

Chỉ được sử dụng trong các ứng dụng cụ thể

Một đường xoắn quấn quanh một hình trụ tạo trong cầu thang và lan can, và không được sử dụng
Hình trụ
CyliricalHelix thành một góc không đổi với trục của hình trụ hoặc gặp phải khi truy cập các đường cong của các
xoắn ốc
phần tử Revit khác và

hình học.

Cung hình elip Hình elip Một đoạn hình elip bị ràng buộc

Xác định bằng Curve.IsBound. Sử dụng tham số thô

Hình elip Hình elip Hình elip không liên kết để đánh giá (từ 0 đến 2π)

Được sử dụng cho các splines được phác thảo trong nhiều loại
NURBS NurbSpline Một B-spline hợp lý không đồng nhất
Các công cụ Revit, cộng với hình học đã nhập

Được sử dụng cho các công cụ như Curve by Points


Một đường nội suy giữa một bộ và các ống dẫn /
Hermite HermiteSpline ống mềm, cộng điểm

hình học nhập khẩu

Các biểu diễn toán học của tất cả các loại đường cong Revit có thể được tìm thấy tại đây.

Biểu diễn toán học của các loại đường cong

Phần này mô tả các dạng đường cong gặp phải trong hình học Revit, các thuộc tính của chúng và các biểu diễn toán học của chúng.

Đường ranh giới

Các đường giới hạn được xác định bởi các điểm cuối của chúng. Trong Revit API, lấy các điểm cuối của dòng từ phương thức GetEndPoint () cấp đường cong.

Phương trình cho một điểm trên đường giới hạn theo tham số chuẩn hóa “u” và điểm cuối của đường là

Dòng chưa ràng buộc

Các dòng không bị ràng buộc được xử lý đặc biệt trong API Revit. Hầu hết các thuộc tính của đường cong không thể được sử dụng, tuy nhiên, có thể dùng Đánh giá () và ComputeDeriuctor () để lấy các vị trí dọc theo

đường cong khi một tham số thô được cung cấp.

Phương trình cho một điểm đối với một đường thẳng không liên kết theo tham số thô “u” và gốc đường và vectơ hướng chuẩn hóa là

Cung và Vòng kết nối


Machine Translated by Google

Cung và Vòng tròn được đại diện trong API Revit bởi lớp Arc. Chúng được xác định theo bán kính, tâm và pháp tuyến vectơ của chúng đối với mặt phẳng của cung tròn, có thể truy cập trực tiếp

trong API Revit từ lớp Arc dưới dạng thuộc tính.

Các vòng kết nối có thuộc tính IsBound được đặt thành true. Điều này có nghĩa là chúng chỉ có thể được đánh giá bằng cách sử dụng một tham số thô (phạm vi từ 0 đến 2π) và phương trình cho

một điểm trên đường tròn theo tham số thô là

trong đó giả thiết được đưa ra là đường tròn nằm trong mặt phẳng XY.

Cung bắt đầu và kết thúc ở một góc nhất định. Các góc này có thể nhận được bằng các giá trị tham số thô ở mỗi đầu cung và các giá trị góc giữa các giá trị này có thể được cắm vào cùng một

phương trình như trên.

Hình trụ Helixes

Các đường xoắn hình trụ được thể hiện trong API Revit bởi lớp CyliricalHelix. Chúng được xác định theo điểm cơ sở của trục của hình trụ mà xung quanh xoắn được quấn, bán kính, vectơ x và y,

tung độ, góc bắt đầu và góc kết thúc.

Hình elip và cung elip

Các đoạn hình elip và cung elip được biểu diễn trong API Revit bởi lớp Ellipse. Tương tự như cung và đường tròn, chúng được xác định trong một mặt phẳng cho trước theo bán kính X và Y, tâm và

pháp tuyến vectơ của chúng đối với mặt phẳng của hình elip.

Hình elip đầy đủ có thuộc tính IsBound được đặt thành true. Tương tự như các vòng tròn, chúng có thể được đánh giá thông qua tham số thô từ 0 đến 2π:

NurbSpline

NURBS (B-splines hợp lý không đồng nhất) được sử dụng cho các đoạn spline do người dùng phác thảo dưới dạng các đường cong hoặc các phần của bản phác thảo đối tượng 3D. Chúng cũng được

sử dụng để đại diện cho một số loại dữ liệu hình học được nhập.

Dữ liệu cho NurbSpline bao gồm:

• Mảng điểm điều khiển, có độ dài n + 1

• Mảng trọng số, cũng có độ dài n + 1

• Độ của đường cong, có giá trị nhỏ hơn một bậc so với bậc của đường cong (k)

• Vectơ nút, có độ dài n + k +1

NurbSplines như được sử dụng trong các công cụ phác thảo của Revit có thể được tạo ra từ các điểm kiểm soát và mức độ một mình bằng cách sử dụng một thuật toán. Các tính toán được thực hiện

bởi thuật toán Revit có thể được sao chép ra bên ngoài, hãy xem mẫu này bên dưới:

1. NurbSplinespline = curve.GeometryCurve as NurbSpline; 2.


DoubleArrayknots = spline.Knots; 3.

4. // Chuyển thành tập hợp chung 5. List


<double> knotList = new List <double> (); 6. for (int i =
0; i <knots.Size; i ++) 7. { 8. 9. } 10.

knotList.Add (knots.get_Item (i));

11. // Chuẩn bị - lấy khoảng cách giữa mỗi điểm điều khiển 12. IList <XYZ>
controlPoints = spline.CtrlPoints; 13. int numControlPoints =
controlPoints.Count; 14. double [] chordLengths = new double [numControlPoints
- 1]; 15. for (int iControlPoint = 1; iControlPoint <numControlPoints; ++
iControlPoint) 16. {

17. hợp âm đôiLength =


18. controlPoints [iControlPoint] .DistanceTo (controlPoints [iControlPoint - 1]);
19. chordLengths [iControlPoint - 1] = chordLength;
20. }
21.
22. int Degree = spline.Degree; 23.
int order = độ + 1; 24. int numKnots =
numControlPoints + order; 25. double [] computedKnots =
new double [numKnots]; 26. int iKnot = 0; 27.

28. // Bắt đầu nút với mức độ đa dạng + 1.


Machine Translated by Google

29. double startKnot = 0.0; 30.


nút thắt đôi = startKnot; 31. for
(iKnot = 0; iKnot <order; ++ iKnot) 32. { 33. 34. } 35.

computedKnots [iKnot] = knot;

36. // Các nút bên trong dựa trên độ dài của hợp âm 37.
double prevKnot = knot; 38.

39. for (/ * blank * /; iKnot <= numControlPoints; ++ iKnot) 40.


// Vòng lặp cuối tính toán nút kết thúc nhưng không đặt nút bên trong.
41. {
42. nút képIncrement = 0,0; for (int
43. jj = iKnot - order; jj <iKnot - 1; ++ jj) {
44.
45. knotIncrement + = chordLengths [jj];
46. }
47.
48. knotIncrement / = độ; nút thắt
49. = trướcKnot + nút tăng tốc; if (iKnot
50. <numControlPoints)
51. computedKnots [iKnot] = knot; khác
52. phá vỡ; // Để "nút thắt" thành nút thắt
53. cuối; không gia tăng "ii".
54.
55. presKnot = nút thắt;
56. }
57.
58. // Nút kết thúc với mức độ đa dạng + 1. 59. for (/ *
blank * /; iKnot <numKnots; ++ iKnot) 60. { 61. 62. }

computedKnots [iKnot] = knot;

HermiteSpline

Các đường cong Hermite được sử dụng cho các đường cong được nội suy giữa một tập hợp các điểm điều khiển, như Đường cong theo Điểm và các ống dẫn và đường ống linh

hoạt trong MEP. Chúng cũng được sử dụng để đại diện cho một số loại dữ liệu hình học được nhập. Trong Revit API, lớp HermiteSpline cung cấp quyền truy cập vào mảng điểm,

vectơ tiếp tuyến và tham số thông qua các thuộc tính ControlPoints, Tangents và Parameters.

Phương trình cho đường cong giữa hai nút trong một spline Hermite là

trong đó Pk và Pk + 1 đại diện cho các điểm tại mỗi nút, Mk và Mk + 1 là các vectơ tiếp tuyến, và uk và uk + 1 là các tham số tại các nút và các hàm cơ bản là:

GeometryInstances
GeometryInstance đại diện cho một tập hợp các hình học được Revit lưu trữ trong cấu hình mặc định, và sau đó được chuyển đổi thành vị trí thích hợp do thuộc tính của

phần tử. Tình huống phổ biến nhất mà GeometryInstances gặp phải là trong các trường hợp Gia đình. Revit sử dụng GeometryInstances để cho phép nó lưu trữ một bản sao duy

nhất của hình học cho một họ nhất định và sử dụng lại nó trong nhiều trường hợp.

Lưu ý rằng không phải tất cả các phiên bản Family sẽ bao gồm GeometryInstances. Khi Revit cần tạo một bản sao duy nhất của họ hình học cho một đối tượng nhất định

(do ảnh hưởng của các phép nối cục bộ, giao điểm và các yếu tố khác liên quan đến vị trí đối tượng) sẽ không gặp phải GeometryInstance; thay vào đó, hình học Solid sẽ

được tìm thấy ở cấp cao nhất của hệ thống phân cấp.

GeometryInstance cung cấp khả năng đọc hình học của nó thông qua các phương thức GetSymbolGeometry () và GetInstanceGeometry (). Các phương thức này trả về một

Autodesk.Revit.DB.GeometryElement khác có thể được phân tích cú pháp giống như trả về cấp đầu tiên.

GetSymbolGeometry () trả về hình học được biểu diễn trong hệ tọa độ của họ. Ví dụ: sử dụng điều này khi bạn muốn có hình ảnh của bảng "chung chung" mà không liên

quan đến hướng và vị trí sắp xếp trong dự án. Đây cũng là quá tải duy nhất trả về các đối tượng hình học Revit thực tế cho bạn chứ không phải các bản sao. Điều này

rất quan trọng bởi vì các phép toán sử dụng hình học này làm đầu vào để tạo các phần tử khác (ví dụ: xác định kích thước hoặc vị trí của các họ dựa trên khuôn mặt)

yêu cầu tham chiếu đến hình học ban đầu.


Machine Translated by Google

GetInstanceGeometry () trả về hình học được biểu diễn trong hệ tọa độ của dự án nơi đặt thể hiện. Ví dụ: sử dụng điều này khi bạn muốn có một bức tranh về hình học

cụ thể của đối tượng trong dự án (ví dụ: đảm bảo rằng các bảng được đặt song song với các bức tường của căn phòng). Điều này luôn trả về một bản sao của hình học

phần tử, vì vậy mặc dù nó sẽ phù hợp để triển khai một nhà xuất khẩu hoặc một công cụ phân tích hình học, nhưng sẽ không thích hợp để sử dụng nó để tạo ra các phần

tử Revit khác tham chiếu đến hình học này.

Ngoài ra còn có các quá tải cho cả GetInstanceGeometry () và GetSymbolGeometry () biến đổi hình học theo bất kỳ hệ tọa độ tùy ý nào. Các phương thức này luôn trả về

các bản sao tương tự như GetInstanceGeometry ().

GeometryInstance cũng lưu trữ một phép chuyển đổi từ không gian tọa độ biểu tượng sang tọa độ cá thể. Biến đổi này có thể truy cập được dưới dạng thuộc tính

Chuyển đổi. Nó cũng là phép biến đổi được sử dụng khi trích xuất bản sao của hình học thông qua GetInstanceGeometry (). Để biết thêm chi tiết, hãy tham khảo

Geometry.Transform.

2 cá thể họ được đặt với các phép biến đổi khác nhau - hình dạng giống nhau sẽ nhận được từ cả hai

Các phiên bản có thể được lồng vào một số cấp độ sâu đối với một số gia đình. Nếu bạn gặp các trường hợp lồng nhau, chúng có thể được phân tích cú pháp theo cách tương tự như mức đầu tiên

ví dụ.

Hai mẫu được trình bày để giải thích cách phân tích hình học của các cá thể.

Trong mẫu này, các đường cong được trích xuất từ phương pháp GeometryInstance GetInstanceGeometry ().

Vùng mã: Lấy các đường cong từ một phiên bản


1. public void GetAndTransformCurve (ứng dụng Autodesk.Revit.ApplicationServices.Application, phần tử
Autodesk.Revit.DB.Element, Options geoOptions) 2. 3. { 4. 5.

// Lấy phần tử hình học của phần tử đã chọn


Autodesk.Revit.DB.GeometryElement geoElement = element.get_Geometry (geoOptions);

6. 7. // Lấy foreach đối tượng


hình học (GeometryObject geoObject in geoElement) {
8. 9.
10. // Lấy cá thể hình học chứa thông tin hình học Autodesk.Revit.DB.GeometryInstance instance
11. =
12. geoObject dưới dạng Autodesk.Revit.DB.GeometryInstance;
13. if (null ! = instance) {
14.
15. GeometryElement instanceGeometryElement = instance.GetInstanceGeometry (); foreach
16. (GeometryObject o in instanceGeometryElement) {
17.
18. // Cố gắng tìm các đường
19. cong Curve curve = o as Curve;
20. if (curve! = null) {
21.
22. // Đường cong đã được chuyển thành hệ tọa độ dự án
23. }
24. }
25. }
26. }
27. }
Machine Translated by Google

Trong mẫu này, chất rắn thu được từ một thể hiện bằng cách sử dụng GetSymbolGeometry (). Các điểm cấu thành sau đó được chuyển thành hệ tọa độ dự án bằng

GeometryInstance.Transform.

Vùng mã: Nhận thông tin chắc chắn từ một phiên bản
xem bản sao đơn giản vào khay nhớ tạm?

1. private void GetAndTransformSolidInfo (Ứng dụng ứng dụng, Phần tử phần tử, Tùy chọn geoOptions) 2. { 3.

// Lấy phần tử hình học của phần tử đã chọn


4. Autodesk.Revit.DB.GeometryElement geoElement = element.get_Geometry (geoOptions);
5.

// Lấy foreach đối tượng


6. 7. hình học (GeometryObject geoObject in geoElement) {

8. 9. // Lấy cá thể hình học chứa thông tin hình học Autodesk.Revit.DB.GeometryInstance
10. instance = geoObject as Autodesk.Revit.DB.GeometryInstance; if (null ! = instance) {
11.
12.
13.
14. GeometryElement instanceGeometryElement = instance.GetSymbolGeometry (); foreach
15. (GeometryObject instObj trong instanceGeometryElement) {
16.
17. Solid solid = instObj as Solid; if (null
18. == solid || 0 == solid.Faces.Size || 0 == solid.Edges.Size) {
19.
20. tiếp tục;
21. }
22.
23. Biến đổi instTransform = instance.Transform; // Lấy các
24. mặt và các cạnh từ solid, và biến đổi các điểm đã hình thành foreach (Mặt face trong
25. solid.Faces) {
26.
27. Mesh mesh = face.Triangulate (); foreach
28. (XYZ ii trong mesh.Vertices) {
29.
30. Điểm XYZ = ii; XYZ
31. gonePoint = instTransform.OfPoint (point);
32. }
33.
34. } foreach (Cạnh viền trong solid.Edges) {
35.
36. foreach (XYZ ii in edge.Tessilities ()) {
37.
38. Điểm XYZ = ii; XYZ
39. gonePoint = instTransform.OfPoint (point);
40. }
41. }
42. }
43. }
44. }
45. }

Ghi chú

Để biết thêm chi tiết về hình học được truy xuất của các cá thể họ, hãy tham khảo Ví dụ: Lấy dữ liệu hình học từ một chùm.
Machine Translated by Google

Mắt lưới

Lưới là một tập hợp các ranh giới hình tam giác gọi chung là hình dạng 3D. Các lưới thường gặp bên trong hình học phần tử Revit nếu các phần tử đó được tạo ra

từ các hoạt động nhập nhất định và cũng được sử dụng trong một số phần tử Revit gốc như TopographySurface. Bạn cũng có thể nhận được các Meshes là kết quả của

các cuộc gọi tới Face.Triangulate () cho bất kỳ mặt Revit nào đã cho.

Một lưới đại diện cho một hình xuyến

Mẫu mã sau đây minh họa cách lấy hình dạng của một mặt Revit dưới dạng Mesh:

Vùng mã: Trích xuất hình dạng của lưới


1. private void GetTriariesFromFace (Khuôn mặt) 2. 3. { 4.

// Lấy lưới
5. 6.

Mesh mesh = face.Triangulate ();


7. 8.
9. for (int i = 0; i <mesh.NumTriangle; i ++)
10.
11. {
12.
13. Tam giác MeshTriangle = mesh.get_Triangle (i);
14.
15. XYZ vertex1 = tam giác.get_Vertex (0);
16.
17. XYZ đỉnh2 = tam giác.get_Vertex (1);
18.
19. XYZ đỉnh3 = tam giác.get_Vertex (2);
20.
21. }
22.
23. }

Lưu ý rằng dung sai xấp xỉ được sử dụng cho mục đích hiển thị Revit được sử dụng bởi quá tải không tham số của phương thức Triangulate () (được sử dụng ở

trên) khi xây dựng Mesh. Quá tải của Triangulate () chiếm một lần cho phép mức độ chi tiết được đặt trong khoảng từ 0 (thô hơn) đến 1 (mịn hơn).

Điểm

Một điểm đại diện cho một tọa độ nhìn thấy được trong không gian 3D. Chúng thường gặp trong các phần tử họ đại chúng như ReferencePoint. Lớp Point cung cấp quyền

truy cập đọc vào tọa độ của nó và khả năng lấy tham chiếu đến điểm để sử dụng làm đầu vào cho các hàm khác.

PolyLines

Đường đa tuyến là một tập hợp các đoạn thẳng được xác định bởi một tập hợp các điểm tọa độ. Chúng thường gặp trong hình đã nhập. Lớp PolyLine cung cấp khả

năng đọc các tọa độ:

• PolyLine.NumberOfCoferences - số điểm trong đường polyline

• PolyLine.GetCoosystem () - lấy một tọa độ theo chỉ mục

• PolyLine.GetCoosystem () - nhận một bộ sưu tập tất cả các tọa độ trong polyline

• PolyLine.Evaluate () - cho một tham số chuẩn hóa (từ 0 đến 1) đánh giá một điểm XYZ dọc theo phạm vi của toàn bộ polyline
Machine Translated by Google

Chất rắn, mặt và cạnh

Solid là một đối tượng Revit API đại diện cho một tập hợp các mặt và các cạnh. Thông thường trong Revit, các bộ sưu tập này là các tập hoàn toàn kèm theo, nhưng cũng có thể gặp một tập

bao hoặc một phần bị giới hạn. Lưu ý rằng đôi khi hình học Revit sẽ chứa các chất rắn không sử dụng có chứa các cạnh và mặt bằng không. Kiểm tra các thành viên Cạnh và Mặt để lọc ra những chất

rắn này.

API Revit cung cấp khả năng đọc các tập hợp các mặt và các cạnh, cũng như tính toán diện tích bề mặt, thể tích và tâm của vật rắn.

• Khuôn mặt

• Phân tích khuôn mặt

• Tham số hóa cạnh và mặt


• Các kiểu khuôn mặt

• Tách khuôn mặt


• Biểu diễn toán học của các loại khuôn mặt

• Phân tích vững chắc


• Tạo khối và mặt

Tham số hóa cạnh và mặt

Các cạnh là các đường cong ranh giới của một mặt nhất định.

Lặp lại các cạnh của Mặt bằng thuộc tính EdgeLoops. Mỗi vòng lặp đại diện cho một ranh giới khép kín trên mặt. Các cạnh luôn được tham số hóa từ 0 đến 1. Có thể trích xuất biểu diễn Đường cong

của một Cạnh bằng các hàm Edge.AsCurve () và Edge.AsCurveFollowingFace ().

Một cạnh thường được xác định bằng cách tính toán giao điểm của hai mặt. Nhưng Revit không tính toán lại giao điểm này khi nó vẽ đồ họa. Vì vậy, cạnh lưu trữ một danh sách các điểm - điểm

kết thúc cho một cạnh thẳng và một danh sách được đánh dấu cho một cạnh cong. Các điểm là tọa độ tham số trên hai mặt. Những điểm này có sẵn thông qua phương thức TessnticOnFace ().

Các phần tạo ra "các cạnh cắt". Đây là các cạnh nhân tạo - không đại diện cho một phần của hình học cấp mô hình và do đó không cung cấp Tham chiếu.

Hướng cạnh

Hướng thường là theo chiều kim đồng hồ trên mặt đầu tiên (đầu tiên đại diện cho một mặt tùy ý mà Revit đã xác định cho một cạnh cụ thể). Nhưng vì hai mặt khác nhau gặp nhau tại một cạnh cụ

thể và cạnh đó có cùng hướng tham số bất kể bạn quan tâm đến mặt nào, nên đôi khi bạn cần phải tìm ra hướng của cạnh trên một mặt cụ thể.

Hình dưới đây minh họa cách thức hoạt động của nó. Đối với Mặt 0, tất cả các cạnh đều được tham số hóa theo chiều kim đồng hồ. Đối với Mặt 1, cạnh được chia sẻ với Mặt 0 không

được tham số hóa lại; do đó đối với Mặt 1, cạnh có hướng đảo ngược và một số cạnh giao nhau trong đó các thông số của cả hai cạnh là 0 (hoặc 1).
Machine Translated by Google

Tham số hóa cạnh

Mẫu API “PanelEdgeLengthAngle” cho biết cách nhận ra các cạnh được đảo ngược cho một mặt nhất định. Nó sử dụng vectơ tiếp tuyến tại các điểm cuối của cạnh để

tính toán góc giữa các cạnh liền kề và phát hiện xem có lật vectơ tiếp tuyến tại mỗi giao điểm hay không để tính toán góc thích hợp.

Kết quả PanelEdgeLengthAngle


Machine Translated by Google

Khuôn mặt

Các khuôn mặt trong Revit API có thể được mô tả dưới dạng các hàm toán học của hai tham số đầu vào “u” và “v”, trong đó vị trí của khuôn mặt tại bất kỳ điểm nào trong

không gian XYZ là một hàm của các tham số. Hướng U và V được xác định tự động dựa trên hình dạng của khuôn mặt đã cho. Các đường của U hoặc V không đổi có thể được

biểu diễn dưới dạng đường lưới trên mặt, như thể hiện trong ví dụ dưới đây:

Đường lưới U và V trên mặt hình trụ

Bạn có thể sử dụng các thông số UV để đánh giá nhiều đặc tính của khuôn mặt tại bất kỳ vị trí nào:

• Tham số có nằm trong ranh giới của khuôn mặt hay không, sử dụng Face.IsInside ()

• Vị trí XYZ của khuôn mặt đã cho ở giá trị tham số UV được chỉ định. Điều này được trả về từ Face.Evaluate (). Nếu bạn cũng đang gọi

ComputeDeriuct (), thì đây cũng là thuộc tính .Origin của Transform được phương thức đó trả về.

• Vectơ tiếp tuyến của mặt đã cho theo phương U. Đây là thuộc tính .BasisX của Transform được Face.ComputeDeriuct trả về ()

• Vectơ tiếp tuyến của mặt đã cho theo phương. Đây là thuộc tính .BasisY của Transform được trả về bởi Face.ComputeDeriuct ().

• Vectơ pháp tuyến của mặt đã cho. Đây là thuộc tính .BasisZ của Transform được trả về bởi Face.ComputeDeriuct ().

Tất cả các vectơ được trả về là không chuẩn hóa.


Machine Translated by Google

Phân tích khuôn mặt

Có một số thành viên Face là những công cụ thích hợp để sử dụng trong phân tích hình học.

Giao nhau()

Phương thức Intersect tính toán giao điểm giữa mặt và đường cong. Nó có thể được sử dụng để xác định:

• (Các) điểm giao nhau giữa hai đối tượng

• Cạnh gần giao điểm nhất, nếu có một cạnh gần vị trí này

• Các đường cong hoàn toàn trùng khớp với một khuôn mặt

• Các đường cong và mặt không giao nhau

Dự án()

Phương thức Project chiếu một điểm trên mặt đầu vào và trả về thông tin về điểm chiếu, khoảng cách đến mặt và cạnh gần nhất với điểm chiếu.

Tam giác ()

Phương pháp Triangulate thu được một lưới tam giác xấp xỉ với khuôn mặt. Có hai quá tải đối với phương thức này. Phương thức không tham số tương tự như

Curve.Tessaries () ở chỗ các điểm của lưới chính xác trong dung sai đầu vào mà Revit sử dụng (lớn hơn một chút so với 1/16 ”). Phương thức Triangulate thứ hai chấp nhận

một mức độ chi tiết là một đối số nằm trong khoảng từ 0 (thô) đến 1 (tinh).

Tách khuôn mặt

Một khuôn mặt có thể được chia thành các vùng bằng lệnh Split Face. Thuộc tính Face.HasRegions sẽ báo cáo nếu khuôn mặt chứa các vùng được tạo bằng lệnh Split Face,

trong khi phương thức Face.GetRegions () sẽ trả về danh sách các khuôn mặt, một cho khuôn mặt chính của đối tượng lưu trữ Mặt phân chia (chẳng hạn như bức tường của

sàn) và một mặt cho mỗi vùng Mặt phân chia.

Lớp FaceSplitter đại diện cho một phần tử chia một khuôn mặt. Thuộc tính FaceSplitter.SplitElementId cung cấp id của phần tử có khuôn mặt được chia bởi phần tử này. Lớp

FaceSplitter có thể được sử dụng để lọc và tìm các khuôn mặt này theo loại như hình dưới đây.

Vùng mã: Tìm các phần tử tách khuôn mặt

1. Autodesk.Revit.DB.Options opt = app.Create.NewGeometryOptions (); 2.


opt.ComputeRefutions = true; 3. opt.IncludeNonVbrokenObjects = true; 4. Bộ
sưu tập FilteredElementCollector = new FilteredElementCollector (doc); 5.
ICollection <FaceSplitter> splitElements = collector.OfClass (typeof (FaceSplitter)).
Cast <FaceSplitter> () .ToList (); 6. foreach (FaceSplitter faceSplitter trong splitElements) 7. { 8.

Phần tử splitElement = doc.GetElement (faceSplitter.SplitElementId);


9. Autodesk.Revit.DB.GeometryElement geomElem = faceSplitter.get_Geometry (opt); foreach
10. (GeometryObject geomObj trong geomElem) {
11.
12. Line line = geomObj as Line; if
13. (line! = null) {
14.
15. XYZ end1 = line.GetEndPoint (0);
16. XYZ end2 = line.GetEndPoint (1);
17. double length = line.ApproximateLength;
18. }
19. }
20. }
Machine Translated by Google

Các loại khuôn mặt

Revit sử dụng nhiều loại đường cong khác nhau để biểu diễn hình học khuôn mặt trong tài liệu. Bao gồm các:

Loại khuôn mặt Lớp API Revit Sự định nghĩa Ghi chú

Một mặt phẳng xác định bởi các vectơ gốc và


chiếc máy bay Mặt phẳng
vectơ đơn vị tại U và V.

.Radius cung cấp "vectơ bán kính" -


Một mặt được xác định bằng cách đùn một đường
Hình trụ Hình trụ các vectơ đơn vị của đường tròn nhân với giá
tròn dọc theo một trục.
trị bán kính.

.Radius cung cấp "vectơ bán kính" -


Một khuôn mặt được xác định bằng cách quay của một
Hình nón ConicalFace các vectơ đơn vị của đường tròn nhân với giá
đường quanh một trục.
trị bán kính.

.Radius cung cấp các vectơ đơn vị của mặt phẳng


Một mặt được xác định bằng cách quay
Khuôn mặt xoay RevolvedFace quay, không liên quan đến “bán kính”.
một đường cong tùy ý về một trục.

Cả (các) đường cong và (các) điểm đều có


Một mặt được xác định bằng cách quét một
thể được lấy làm thuộc tính.
Bề mặt được cai trị RisedFace đường giữa hai đường cong biên dạng hoặc

một đường cong biên dạng và một điểm.

Một mặt được xác định bởi phép


Hermite mặt HermiteFace
nội suy Hermite giữa các điểm.

Các biểu diễn toán học của tất cả các loại mặt Revit có thể được tìm thấy << cần liên kết tại đây >>.

Biểu diễn toán học của các loại khuôn mặt

Phần này mô tả các dạng khuôn mặt gặp phải trong hình học Revit, các thuộc tính của chúng và các biểu diễn toán học của chúng.

Mặt phẳng

Một mặt phẳng được xác định bởi gốc và vectơ đơn vị ở U và V. Phương trình tham số của nó là

Hình trụ

Một mặt được xác định bằng cách đùn một đường tròn dọc theo một trục. API Revit cung cấp các thuộc tính sau:

• Nguồn gốc của khuôn mặt.

• Trục ép đùn.

• “Các vectơ bán kính” trong X và Y. Các vectơ này là các vectơ đơn vị của đường tròn nhân với bán kính của đường tròn. Lưu ý rằng các vectơ đơn vị có thể

đại diện cho khung điều khiển thuận tay phải hoặc tay trái.

Phương trình tham số cho mặt này là:

ConicalFace

Một khuôn mặt được xác định bằng cách quay của một đường quanh một trục. API Revit cung cấp các thuộc tính sau:

• Nguồn gốc của khuôn mặt.


• Trục của hình nón.

• “Các vectơ bán kính” trong X và Y. Các vectơ này là các vectơ đơn vị nhân với bán kính của hình tròn được tạo thành bởi vòng quay. Lưu ý rằng đơn vị

vectơ có thể đại diện cho khung điều khiển thuận tay phải hoặc tay trái.

• Nửa góc của khuôn mặt.

Phương trình tham số cho mặt này là:


Machine Translated by Google

RevolvedFace

Một mặt được xác định bằng cách quay một đường cong tùy ý về một trục. API Revit cung cấp các thuộc tính sau:

• Nguồn gốc của khuôn mặt •

Trục của khuôn mặt

• Đường cong biên dạng

• Các vectơ đơn vị cho đường cong xoay (được gọi không chính xác là “Bán kính”)

Phương trình tham số cho mặt này là:

RisedFace

Một bề mặt được trị liệu được tạo ra bằng cách quét một đường giữa hai đường cong biên dạng hoặc giữa đường cong và một điểm. API Revit cung cấp (các) đường cong và (các) điểm dưới

dạng thuộc tính.

Phương trình tham số cho bề mặt này là:

nếu cả hai đường cong đều hợp lệ. Nếu một trong các đường cong được thay thế bằng một điểm, các phương trình sẽ đơn giản hóa thành một trong số:

Một mặt bị trị không có đường cong và hai điểm là suy biến và sẽ không được trả lại.

HermiteFace

Một mặt spline Hermite lập phương. API Revit cung cấp:

• Mảng các tham số u và v cho các điểm nội suy spline • Một mảng các điểm 3D tại

mỗi nút (mảng được tổ chức theo chiều tăng u, sau đó tăng v) • Một mảng các vectơ tiếp tuyến tại mỗi nút • Một

mảng các vectơ xoắn tại mỗi nút

Biểu diễn tham số của bề mặt này, giữa các nút (u1, v1) và (u2, v2) là:

Ở đâu , , MH là ma trận Hermite:

Và B là ma trận hệ số thu được từ các thuộc tính mặt tại các điểm nội suy:
Machine Translated by Google

Phân tích vững chắc

Giao điểm giữa vật rắn và đường cong

Phương thức Solid.IntersectWithCurve () tính toán giao điểm giữa một thể tích đóng và một đường cong. Lớp SolidCurveIntersectionOptions có thể chỉ định xem

kết quả từ phương thức IntersectWithCurve () sẽ bao gồm các đoạn đường cong bên trong khối rắn hay bên ngoài. Các đoạn đường cong bên trong vật rắn sẽ bao

gồm các đoạn đường cong trùng với (các) mặt của vật rắn. Cả các đoạn đường cong và các thông số của các đoạn đều có sẵn trong kết quả.

Ví dụ sau sử dụng phương thức IntersectWithCurve () để tính chiều dài của cốt thép nằm trong một cột.

Vùng mã: Tìm giao điểm giữa đường đặc và đường cong

1. void FindColumnRebarIntersects (Tài liệu tài liệu, cột FamilyInstance) 2. { 3.

// Tìm thanh cốt thép được lưu trữ bởi


4. cột này RebarHostData rebarHostData = RebarHostData.GetRebarHostData (column); if
5. (null ! = rebarHostData) {
6.
7. IList <Rebar> rebars = rebarHostData.GetRebarsInHost (); if
(rebars.Count> 0) {
8. 9.

10. Tùy chọn geomOptions = new Options ();


11. geomOptions.ComputeRefferences = true;
12. geomOptions.DetailLevel = ViewDetailLevel.Fine;
13. GeometryElement geomElement = column.get_Geometry (geomOptions); foreach
14. (GeometryObject geomObj trong geomElement) {
15.
16. GeometryInstance geomInst = geomObj as GeometryInstance; if (null ! =
17. geomInst) {
18.
19. GeometryElement columnGeometry = geomInst.GetInstanceGeometry (); foreach
20. (GeometryObject obj trong columnGeometry) {
21.
22. Solid solid = obj as Solid; if
23. (null ! = solid) {
24.
25. Tùy chọn SolidCurveIntersectionOptions = new SolidCurveIntersectionOptions (); foreach
26. (Thép cây trong thanh cốt thép) {
27.
28. // Lấy các đường tâm của thanh cốt thép để tìm giao điểm của chúng với đường cong IList <Curve>
29. collumn = rebar.GetCenterlineCurves (false, false, false); foreach (Đường cong trong các đường
30. cong) {
31.
32. Giao điểm SolidCurveIntersection = solid.IntersectWithCurve (đường cong, tùy chọn); for (int n =
33. 0; n <giao nhau.SegmentCount; n ++) {
34.
35. // tính toán chiều dài cốt thép nằm trong cột Curve curveInside
36. = protocol.GetCurveSegment (n); double rebarLengthinColumn =
37. curveInside.Length;
38. }
39. }
40. }
41. }
42. }
43. }
44. }
45. }
46. }
47. }
Machine Translated by Google

Tạo khối và khuôn mặt

Chất rắn và bề mặt đôi khi được sử dụng làm đầu vào cho các tiện ích khác. API Revit cung cấp một số quy trình có thể được sử dụng để tạo hình học như vậy

từ đầu hoặc lấy nó từ các đầu vào khác.

Hình học đã biến đổi

Phương pháp

• GeometryElement.GetTransformed ()

trả về một bản sao của phần tử hình học đầu vào với một phép biến đổi được áp dụng. Bởi vì hình học này là một bản sao, các thành viên của nó không thể được sử dụng làm tham chiếu đầu vào

cho các phần tử Revit khác, nhưng nó có thể được sử dụng để phân tích và trích xuất hình học.

Tiện ích tạo hình học

Lớp GeometryCreationUtilities là một lớp tiện ích cho phép xây dựng các hình khối cơ bản:

• đùn

• Cách mạng

• Quét
• Trộn

• SweptBlend

Hình học kết quả không được thêm vào tài liệu như một phần của bất kỳ phần tử nào. Tuy nhiên, Solid đã tạo có thể được sử dụng làm đầu vào cho các hàm API

khác, bao gồm:

• Là (các) mặt đầu vào cho các phương thức trong khung Hình ảnh hóa Phân tích (SpatialFieldManager.AddSpatialFieldPrimitive ()) - điều này cho phép người dùng

trực quan hóa hình dạng đã tạo liên quan đến các phần tử khác trong tài liệu

• Là đầu vào vững chắc để tìm các phần tử 3D theo giao điểm

• Là một hoặc nhiều đầu vào cho hoạt động Boolean

• Là một phần của phép tính hình học (ví dụ: sử dụng Face.Project (), Face.Intersect () hoặc các phương pháp hình học Face, Solid và Edge khác)

Ví dụ sau sử dụng lớp GeometryCreationUtilities để tạo hình trụ dựa trên vị trí và chiều cao. Ví dụ, điều này có thể được sử dụng để tạo các khối xung quanh các

đầu của bức tường nhằm tìm các bức tường khác trong phạm vi gần với các điểm cuối của bức tường:

Vùng mã: Tạo hình trụ rắn


1. Private Solid CreateCyli TrụVolume (điểm XYZ, chiều cao gấp đôi, bán kính gấp đôi ) 2. { 3.

// xây dựng hình trụ xung quanh điểm cuối


4. Danh sách <CurveLoop> curveloops = new Danh sách <CurveLoop> ();
CurveLoop circle = new CurveLoop ();
5. 6.
7. // Để tạo hình khối, cần có hai đường cong, ngay cả đối với các hình dạng chu trình // khép kín
số 8.
như hình tròn . ; circle.Append (m_app.Create.NewArc (point, radius, Math.PI, 2 * Math.PI,
XYZ.BasisX, XYZ.BasisY)); curveloops.Add (vòng tròn);
9. 10.
11.
12.
13.
14. Solid createCylinder = GeometryCreationUtilities.CreateExtrusionGeometry (curveloops, XYZ.BasisZ, chiều cao);
15.
16. trả về createCylinder;
17. }

Phép toán boolean

Lớp BooleanOperationsUtils cung cấp các phương thức để kết hợp một cặp đối tượng hình học rắn.

Phương thức ExecuteBooleanOperation () lấy một bản sao của chất rắn đầu vào và kết quả là tạo ra một chất rắn mới. Đối số đầu tiên của nó có thể là bất kỳ chất rắn

nào, lấy trực tiếp từ một phần tử Revit hoặc được tạo thông qua một thao tác khác như GeometryCreationUtils.

Phương thức ExecuteBooleanOperationModizingOriginalSolid () thực hiện thao tác boolean trực tiếp trên solid đầu vào đầu tiên. Đầu vào đầu tiên phải là chất rắn

không lấy trực tiếp từ phần tử Revit. Thuộc tính GeometryObject.IsElementGeometry có thể xác định xem vật rắn có thích hợp làm đầu vào cho phương pháp này hay
không.
Machine Translated by Google

Các tùy chọn cho cả hai phương pháp bao gồm kiểu hoạt động: Union, Difference hoặc Intersect. Ví dụ sau minh họa cách lấy giao điểm của hai

chất rắn rồi tìm khối lượng.

Vùng mã: Khối lượng giao nhau

1. private void ComputeIntersectionVolume (Solid solidA, Solid solidB)


2.
3.
{ 4.
5. Giao điểm đặc = BooleanOperationsUtils.ExecuteBooleanOperation (solidA, solidB, BooleanOperationsType.Intersect);

6.
7. double volumeOfIntersection = giao nhau.Volume;
số 8.

9. }

Lớp học của người trợ giúp hình học

Một số lớp của Trình trợ giúp hình học có trong API. Các lớp Trình trợ giúp được sử dụng để mô tả thông tin hình học cho các phần tử nhất định, chẳng hạn như xác
định CropBox cho một chế độ xem bằng cách sử dụng lớp BoundBoxXYZ.

• BoundBoxXYZ - Một hình hộp chữ nhật 3D được sử dụng trong các trường hợp như xác định khu vực phần xem 3D.

• Transform - Chuyển đổi không gian 3D affine.

• Tham chiếu - Tham chiếu ổn định đến một đối tượng hình học trong mô hình Revit, được sử dụng khi tạo các phần tử như kích thước.

• Mặt phẳng - Một bề mặt phẳng trong hình học.

• Tùy chọn - Tùy chọn của người dùng để phân tích hình học.

• XYZ - Đối tượng biểu diễn tọa độ trong không gian 3D.

• UV - Đối tượng biểu diễn tọa độ trong không gian 2D.

• BoundBoxUV - Một hình chữ nhật 2D song song với các trục tọa độ.

Biến đổi

Các phép biến đổi được giới hạn ở các phép biến đổi 3x4 (Ma trận) trong ứng dụng Revit, biến đổi vị trí của một đối tượng trong không gian mô hình so với phần còn
lại của không gian mô hình và các đối tượng khác. Các phép biến đổi được xây dựng từ vị trí và định hướng trong không gian mô hình. Ba Vectơ hướng (thuộc tính
BasisX, BasisY và BasisZ) và điểm gốc cung cấp tất cả thông tin biến đổi. Ma trận được tạo thành bởi bốn giá trị như sau:

Áp dụng phép biến đổi cho điểm như sau:


Machine Translated by Google

Phương thức Transform OfPoint thực hiện chức năng trước đó. Đoạn mã sau đây là một mẫu của quá trình biến đổi tương tự.

Vùng mã 20-7: Ví dụ về chuyển đổi

public static XYZ TransformPoint (điểm XYZ, biến đổi Transform)


{
nhân đôi x = point.X;
nhân đôi y = point.Y;
kép z = điểm.Z;

// biến đổi cơ sở của hệ tọa độ cũ thành // hệ tọa độ mới


XYZ b0 = biến đổi.get_Basis (0);
XYZ b1 = biến đổi.get_Basis (1);
XYZ b2 = biến đổi.get_Basis (2);
XYZ origin = biến đổi.Origin;

// biến đổi gốc tọa độ cũ sang // hệ tọa độ mới

double xTemp = x * b0.X + y double * b1.X + z * b2.X + origin.X;


yTemp = x * b0.Y + y double
x * b0.Z
zTemp
+ y= * b1.Y + z * b2.Y + gốc.Y;
trả về XYZ mới (xTemp, yTemp, zTemp); * b1.Z + z * b2.Z + origin.Z;

Các thuộc tính và phương thức của lớp Geometry.Transform được xác định trong các phần sau.

Xác thực

Chuyển đổi danh tính.

CreateReflection ()

Phản ánh một mặt phẳng xác định.

Hình 112: Mối quan hệ của Wall Reflection

Như hình trước cho thấy, một bức tường được phản chiếu bởi một mặt phẳng tham chiếu. Phương thức CreateReflection () cần thông tin về mặt phẳng hình học cho
mặt phẳng tham chiếu.

Vùng mã 20-8: Sử dụng thuộc tính Reflection

1. Phản chiếu chuyển đổi riêng (ReferencePlane refPlane) 2. {

3. Biến đổi mirTrans = Transform.CreateReflection (refPlane.Plane);


4.
trả về mirTrans;
5. 6. }
Machine Translated by Google

CreateRotation () và CreateRotationAtPoint ()

Xoay theo một góc xác định quanh một trục xác định tại (0,0,0) hoặc tại một điểm xác định.

CreateTranslation ()

Dịch theo một vectơ được chỉ định. Với dữ liệu XYZ vectơ, một phép biến đổi được tạo như sau:

Bản ngã

Yếu tố quyết định chuyển đổi.

HasReflection

Đây là giá trị Boolean cho biết liệu phép biến đổi có tạo ra phản xạ hay không.

Tỉ lệ

Một giá trị đại diện cho quy mô chuyển đổi.

Nghịch đảo

Một phép biến đổi nghịch đảo. Ma trận biến đổi A khả nghịch nếu tồn tại ma trận biến đổi B sao cho A * B = B * A = I (đồng nhất).

IsIdentity

Giá trị Boolean cho biết liệu phép biến đổi này có phải là một danh tính hay không.

IsTranslation

Giá trị Boolean cho biết liệu phép biến đổi này có phải là một phép dịch hay không.

Geometry.Transform cung cấp các phương pháp để thực hiện các phép toán ma trận cơ sở.

nhân

Nhân một phép biến đổi với một phép biến đổi được chỉ định và trả về kết quả.

Toán tử * - Nhân hai phép biến đổi được chỉ định.

ScaleBasis

Cân các vectơ cơ sở và trả về kết quả.

ScaleBasisAndOrigin

Tỷ lệ các vectơ cơ sở và điểm gốc biến đổi trả về kết quả.

OfPoint

Áp dụng phép biến đổi cho điểm. Thuộc tính Origin được sử dụng.
Machine Translated by Google

OfVector

Áp dụng phép biến đổi cho vectơ. Thuộc tính Nguồn gốc không được sử dụng.

Gần như bằng nhau

So sánh hai phép biến hình. MostEqual phù hợp với cơ chế tính toán và độ chính xác trong mã lõi Revit. Ngoài ra, Equal và toán tử == không được triển khai trong lớp Transform.

API cung cấp một số phím tắt để hoàn thành việc chuyển đổi hình học. Thuộc tính Transformed trong một số lớp hình học được sử dụng để thực hiện công việc, như được hiển
thị trong bảng sau.

Bảng 48: Các phương pháp được biến đổi

Tên lớp Mô tả chức năng

Curve.get_Transformed (Biến đổi chuyển đổi) Áp dụng phép biến đổi được chỉ định cho một đường cong

GeometryElement.GetTransformed (Biến đổi biến đổi) Biến đổi một bản sao của hình học trong phần tử gốc.

Profile.get_Transformed (Biến đổi chuyển đổi) Biến đổi cấu hình và trả về kết quả.

Mesh.get_Transformed (Biến đổi chuyển đổi) Biến đổi lưới và trả về kết quả.

Ghi chú

Phương thức được biến đổi sẽ tự nhân bản chính nó sau đó trả về kết quả được sao chép đã biến đổi.

Ngoài các phương thức này, lớp Instance (là lớp cha cho các phần tử như cá thể họ, cá thể liên kết và nội dung CAD đã nhập) có hai phương thức cung cấp biến đổi cho một

Phiên bản nhất định. Phương thức GetTransform () nhận được biến đổi cơ bản cho cá thể dựa trên cách đặt cá thể đó, trong khi GetTotalTransform () cung cấp biến đổi được

sửa đổi với biến đổi phía bắc thực, đối với các trường hợp như cá thể nhập.

Tài liệu tham khảo

Tham chiếu rất hữu ích trong việc tạo phần tử.

• Tạo thứ nguyên yêu cầu tham chiếu.

• Tham chiếu xác định một đường dẫn trong cây biểu diễn hình học một cách linh hoạt.

• Cây được sử dụng để xem việc tạo biểu diễn hình học cụ thể.

API hiển thị bốn loại tham chiếu dựa trên các loại con trỏ Chọn khác nhau. Chúng được truy xuất từ API theo những cách khác nhau:

1. Đối với thuộc tính Point - Curve.EndPointReference

2. Đối với Curve (Line, Arc, v.v.) - Thuộc tính Curve.Reference

3. Đối với thuộc tính Face - Face.Reference

4. Đối với Cut Edge - thuộc tính Edge.Reference

Các loại tham chiếu khác nhau không thể được sử dụng tùy tiện. Ví dụ:

• Phương thức NewLineBoundaryConditions () yêu cầu tham chiếu cho Line

• Phương thức NewAreaBoundaryConditions () yêu cầu tham chiếu cho Face

• Phương thức NewPointBoundaryConditions () yêu cầu một tham chiếu cho Point.

Phương thức Reference.ConvertToStableRepresentation () có thể được sử dụng để lưu một tham chiếu đến một đối tượng hình học, ví dụ như một mặt, cạnh hoặc đường cong,

dưới dạng một chuỗi và sau đó trong cùng một phiên Revit (hoặc thậm chí trong một phiên khác, nơi giống nhau tài liệu hiện có) sử dụng phương thức ParseFromStableRepresentation

() để có được một Tham chiếu giống hệt nhau bằng cách sử dụng chuỗi làm đầu vào.
Machine Translated by Google

Tùy chọn

Geometry thường được trích xuất từ thuộc tính đã lập chỉ mục Element.Geometry. Hình dạng ban đầu của dầm, cột hoặc dấu ngoặc nhọn, trước khi đối tượng được sửa đổi bởi

nối, cắt, đối phó, mở rộng hoặc xử lý hậu kỳ khác, có thể được trích xuất bằng phương thức FamilyInstance.GetOriginalGeometry ().
Cả Element.Geometry và FamilyInstance.GetOriginalGeometry () đều chấp nhận một lớp tùy chọn mà bạn phải cung cấp. Lớp tùy chọn tùy chỉnh loại đầu ra bạn nhận được
dựa trên các thuộc tính của nó:

• ComputeRefferences - Cho biết có tính toán tham chiếu hình học hay không khi truy xuất thông tin hình học. Giá trị mặc định
là false, vì vậy nếu thuộc tính này không được đặt thành true, thì tham chiếu sẽ không thể truy cập được.

• Bao gồm không thể thay thế - Cho biết cũng trả về các đối tượng hình học không hiển thị trong chế độ xem mặc định.

• Chế độ xem - Nhận thông tin hình học từ một chế độ xem cụ thể. Lưu ý rằng nếu một chế độ xem được chỉ định, mức chi tiết cho chế độ xem này sẽ được sử dụng trong
vị trí của "DetailLevel".

• DetailLevel - Cho biết mức chi tiết được ưu tiên. Mặc định là Trung bình.

ComputeRefferences

Nếu bạn đặt thuộc tính này thành false, API sẽ không tính toán tham chiếu hình học. Tất cả các thuộc tính Tham chiếu được truy xuất từ cây hình học không trả về gì. Để biết
thêm chi tiết về tài liệu tham khảo, hãy tham khảo phần Tài liệu tham khảo. Không thể đặt tùy chọn này thành true khi được sử dụng với FamilyInstance.GetOriginalGeometry ().

Bao gồm không thể chia sẻ

Hầu hết các hình học không nhìn thấy là hình học xây dựng và hình học có điều kiện mà người dùng nhìn thấy khi chỉnh sửa phần tử (tức là mặt phẳng trung tâm của một phiên bản
họ cửa sổ). Mặc định cho thuộc tính này là sai. Tuy nhiên, một số hình dạng có thể nhìn thấy có điều kiện này đại diện cho các đối tượng trong thế giới thực, chẳng hạn như
các ống dẫn cách nhiệt xung quanh trong Revit MEP, và nó nên được trích xuất.

Lượt xem

Nếu người dùng đặt thuộc tính Chế độ xem thành một chế độ xem khác, thông tin hình học được truy xuất có thể khác. Xem lại các ví dụ sau để biết thêm thông tin:

1. Trong Revit, vẽ cầu thang trong chế độ xem 3D , sau đó chọn các thuộc tính Vùng cắt , Vùng cắt có thể nhìn thấy và Hộp phần trong chế độ xem 3D. Trong Vùng cắt, sửa
đổi hộp phần trong chế độ xem 3D để hiển thị một phần của cầu thang. Nếu bạn lấy thông tin hình học cho cầu thang bằng cách sử dụng API và đặt chế độ xem 3D làm thuộc
tính Options.View, chỉ một phần của hình dạng cầu thang có thể được truy xuất. Các hình ảnh sau đây cho thấy cầu thang trong ứng dụng Revit (trái) và một cầu thang
được vẽ bằng API (phải).

Hình 113: Các hộp phần khác nhau hiển thị các hình học khác nhau
Machine Translated by Google

Vẽ cầu thang trong Revit sau đó vẽ mặt cắt như trong hình bên trái. Nếu bạn lấy thông tin cho cầu thang này bằng cách sử dụng API và đặt chế độ xem phần
này làm thuộc tính Options.View, chỉ một phần của hình dạng cầu thang có thể được truy xuất. Cầu thang được vẽ bằng API được hiển thị trong hình bên phải.

Hình 114: Truy xuất chế độ xem phần Hình học

DetailLevel

API xác định ba kiểu liệt kê trong Geometry.Options.DetailLevels. Ba bảng liệt kê tương ứng với ba Mức chi tiết trong ứng dụng Revit, được hiển thị như sau.

Hình 115: Ba cấp độ chi tiết

Thông tin hình học khác nhau được truy xuất dựa trên các cài đặt khác nhau trong thuộc tính DetailLevel. Ví dụ: vẽ một chùm trong ứng dụng Revit, sau đó lấy
hình học từ chùm bằng cách sử dụng API để vẽ nó. Các hình ảnh sau đây cho thấy kết quả vẽ:
Machine Translated by Google

Hình 116: Hình học chi tiết cho một chùm

BoundBoxXYZ

BoundBoxXYZ xác định một hình hộp chữ nhật 3D bắt buộc phải song song với bất kỳ trục tọa độ nào. Tương tự như lớp Instance, BoundBoxXYZ lưu trữ dữ
liệu trong không gian tọa độ cục bộ. Nó có thuộc tính Transform để chuyển đổi dữ liệu từ không gian tọa độ cục bộ hộp sang không gian mô hình. Nói
cách khác, để có được ranh giới hộp trong không gian mô hình (giống như trong Revit), hãy biến đổi từng thành viên dữ liệu bằng cách sử dụng thuộc tính
Transform. Các phần sau minh họa cách sử dụng BoundBoxXYZ.

Xác định ranh giới xem

BoundBoxXYZ có thể được sử dụng để xác định ranh giới chế độ xem thông qua thuộc tính View.CropBox. Các hình ảnh sau đây sử dụng chế độ xem mặt cắt để cho
thấy cách BoundBoxXYZ được sử dụng trong ứng dụng Revit.

Hình 117: BoundBoxXYZ trong chế độ xem mặt cắt


Machine Translated by Google

Các đường gạch ngang trong các hình trước hiển thị ranh giới chế độ xem phần được hiển thị dưới dạng thuộc tính CropBox (một phiên bản BoundBoxXYZ).

Hình 118: Chế độ xem mặt cắt đã tạo

Hình trước hiển thị chế độ xem phần tương ứng. Tường bên ngoài ranh giới chế độ xem không được hiển thị.

Xác định một hộp phần

BoundBoxXYZ cũng được sử dụng để xác định hộp phần cho chế độ xem 3D được truy xuất từ thuộc tính View3D.SectionBox. Chọn thuộc tính Hộp Phần trong Hộp thoại Thuộc tính . Hộp phần được

hiển thị như sau:

Hình 119: Hộp phần xem 3D

Sử dụng khác

• Xác định một hộp xung quanh hình học của một phần tử. (Thuộc tính Element.BoundBox). Cá thể BoundBoxXYZ được truy xuất theo cách này song song với các trục tọa độ.

• Được sử dụng trong phương thức ViewSection.CreateDetail ().


Machine Translated by Google

Bảng sau xác định các mục đích sử dụng chính cho lớp này.

Bảng 49: Các thuộc tính của BoundBoxXYZ

Tên tài sản Cách sử dụng

Lớn nhất nhỏ nhất Tọa độ tối đa / tối thiểu. Hai thuộc tính này xác định một hộp 3D song song với bất kỳ trục tọa độ nào. Thuộc tính Transform cung cấp một

ma trận biến đổi có thể biến đổi hộp đến vị trí thích hợp.

Biến đổi Chuyển đổi từ không gian tọa độ hộp sang không gian mô hình.

Đã bật Cho biết hộp giới hạn đã được bật hay chưa.

MaxEnabled / Xác định xem giới hạn tối đa / tối thiểu có hoạt động đối với một thứ nguyên nhất định hay không.

MinEnabled
Nếu thuộc tính Enable là false, hai thuộc tính này cũng sẽ trả về false.

Nếu chế độ xem cắt được bật, cả thuộc tính MaxEnabled và thuộc tính MinEnabled đều trả về true.

Nếu chế độ xem cắt bị tắt, cả thuộc tính MaxEnabled và thuộc tính MinEnabled đều trả về false.

Thuộc tính này cho biết liệu mặt hộp cắt của chế độ xem có thể được sử dụng để cắt chế độ xem của phần tử hay không.

Nếu BoundBoxXYZ được truy xuất từ thuộc tính View3D.SectionBox, giá trị trả về phụ thuộc vào việc thuộc tính Section Box có được chọn trong hộp

thoại Thuộc tính dạng xem 3D hay không. Nếu vậy, tất cả các thuộc tính Đã bật đều trả về true.

Nếu BoundBoxXYZ được truy xuất từ thuộc tính Element.BoundBox, tất cả các thuộc tính Đã bật đều đúng.

Bounds Gói cho các thuộc tính Max / Min.

BoundEnabled Gói cho các thuộc tính MaxEnabled / MinEnabled.

Mẫu mã sau minh họa cách xoay BoundBoxXYZ để sửa đổi hộp phần chế độ xem 3D.

Vùng mã 20-9: Xoay BoundBoxXYZ


1. private void RotateBoundsBox (View3D view3d) 2. { 3. 4.

Hộp BoundBoxXYZ = view3d.GetSectionBox (); if (false ==


box.Enabled) {
5.
6. TaskDialog.Show ("Revit", "Hộp phần cho View3D không được kích hoạt."); trở về;
7.
số 8.
}
9. // Tạo một phép biến đổi xoay, XYZ origin =
10. new XYZ (0, 0, 0); Trục XYZ = new XYZ (0,
11. 0, 1); Biến đổi xoay =
12. Transform.CreateRotationAtPoint (trục, 2, điểm gốc); // Biến đổi GetSectionBox của View3D
13. () bằng hộp xoay chuyển từ box.Transform = box.Transform.Multiply (xoay); view3d.SetSectionBox (hộp);
14.
15.
16. }
Machine Translated by Google

BoundBoxUV

BoundBoxUV là một lớp giá trị xác định một hình chữ nhật 2D song song với các trục tọa độ. Nó hỗ trợ các thành viên dữ liệu Min và Max.
Họ cùng nhau xác định ranh giới của BoundBoxUV. BoundBoxUV được truy xuất từ thuộc tính View.Outline là chế độ xem đường biên trong chế độ xem không gian
giấy.

Hình 120: Xem phác thảo

Hai điểm xác định một BoundBoxUV.

• Điểm nhỏ nhất - Điểm cuối dưới cùng bên trái.

• Điểm tối đa - Điểm cuối phía trên bên phải.

Hình 121: BoundBoxUV Max và Min

Lưu ý BoundBoxUV không thể hiển thị một hình chữ nhật gradient như hình sau cho thấy.

Hình 122: Hình chữ nhật dốc


Machine Translated by Google

Lớp sưu tập

API cung cấp các lớp thu thập sau dựa trên các mục mà chúng chứa:

Bảng 50: Các lớp Bộ sưu tập Hình học

Lớp / Loại Các lớp bộ sưu tập tương ứng Các trình lặp tương ứng

Bờ rìa EdgeArray, EdgeArrayIterator,

EdgeArrayArray EdgeArrayArrayIterator

Đối mặt FaceArray FaceArrayIterator

GeometryObject GeometryObjectArray GeometryObjectArrayIterator

Ví dụ InstanceArray InstanceArrayIterator

Lưới thép MeshArray MeshArrayIterator

Tài liệu tham khảo ReferenceArray ReferenceArrayIterator

Chất rắn SolidArray SolidArrayIterator

Giá trị nhân đôi DoubleArray DoubleArrayIterator

Tất cả các lớp này sử dụng các phương thức và thuộc tính rất giống nhau để thực hiện công việc tương tự. Để biết thêm chi tiết, hãy tham khảo Bộ sưu tập.

Ví dụ: Lấy dữ liệu hình học từ một chùm tia

Phần này minh họa cách lấy chất rắn và đường cong từ chùm tia. Bạn có thể truy xuất dữ liệu hình học cột và dấu ngoặc nhọn theo cách tương tự. GeometryElement có
thể chứa hình học mong muốn dưới dạng Solid hoặc GeometryInstance tùy thuộc vào việc một chùm được nối hay độc lập và mã này bao gồm cả hai trường hợp.

Lưu ý Nếu bạn muốn lấy đường cong lái xe của dầm và thanh giằng, hãy gọi thuộc tính FamilyInstance Location nơi có sẵn LocationCurve.

Mã mẫu được hiển thị như sau:

Vùng mã 20-10: Lấy chất rắn và đường cong từ chùm

1. public void GetCurvesFromABeam (Autodesk.Revit.DB.FamilyInstance beam, Autodesk.Revit.DB.Options tùy chọn) 2. { 3.

Autodesk.Revit.DB.GeometryElement geomElem = beam.get_Geometry (tùy chọn);


4.
Các đường cong Autodesk.Revit.DB.CurveArray = new CurveArray (); Chất
5. 6. rắn Autodesk.Revit.DB.SolidArray = new SolidArray ();
7.

// Tìm tất cả các chất rắn và chèn chúng vào mảng rắn
8. AddCurvesAndSolids (geomElem, đường cong ref, chất rắn ref );
9. 10. }
11.
12. private void AddCurvesAndSolids (Autodesk.Revit.DB.GeometryElement geomElem, 13.
ref Autodesk.Revit.DB.CurveArray đường cong, ref
14. Autodesk.Revit.DB.SolidArray chất rắn)
15.
{ 16. foreach (Autodesk.Revit.DB.GeometryObject geomObj trong geomElem) {
17.
18. Autodesk.Revit.DB.Curve curve = geomObj as Autodesk.Revit.DB.Curve; if (null ! = curve)
19. {
20.
21. Curve.Append (đường cong);
22. tiếp tục;
23. }
24. Autodesk.Revit.DB.Solid solid = geomObj as Autodesk.Revit.DB.Solid; if (null ! = solid)
25. {
26.
27. chất rắn.Append (chất rắn);
28. tiếp tục;
29. }
30. // Nếu GeometryObject này là Instance, hãy gọi AddCurvesAndSolids
31. Autodesk.Revit.DB.GeometryInstance geomInst = geomObj là Autodesk.Revit.DB.GeometryInstance; if (null ! = geomInst)
32.
Machine Translated by Google

33. {
34. Autodesk.Revit.DB.GeometryElement goneGeomElem = geomInst.GetInstanceGeometry (geomInst.Transform); AddCurvesAndSolids (biến đổiGeomElem,
35. đường cong ref, chất rắn ref );
36. }
37. }
38. }

Ví dụ trên sử dụng thuộc tính FamilyInstance.Geometry để truy cập hình dạng thực của chùm tia. Để có được hình dạng ban đầu của một cá thể họ trước khi nó được sửa
đổi bằng cách nối, cắt, ghép, mở rộng hoặc xử lý hậu kỳ khác, hãy sử dụng phương thức FamilyInstance.GetOriginalGeometry ().

Lưu ý Để biết thêm thông tin về cách truy xuất đối tượng kiểu Geometry.Options, hãy tham khảo Geometry.Options.

Phân tích đùn của một chất rắn

Lớp tiện ích Ext ExtractionAnalyzer cho phép bạn cố gắng "lắp" một phần hình học nhất định vào hình dạng của một cấu hình đùn. Một thể hiện của lớp này là một

lớp sử dụng một lần sẽ được cung cấp một hình học vững chắc, một mặt phẳng và một hướng. Sau khi khởi chạy Ext ExtrusionAnalyzer, bạn có thể truy cập kết quả

thông qua các thành viên sau:

• Phương thức GetExtrusionBase () trả về biên dạng cơ sở được tính toán của vật rắn đùn được căn chỉnh với mặt phẳng đầu vào.

• Phương thức CalculFaceAlignment () có thể được sử dụng để xác định tất cả các mặt từ hình học ban đầu có và không thẳng hàng với các mặt của
đùn tính toán. Điều này có thể hữu ích để tìm ra nếu một bức tường, chẳng hạn, có một đường nối nghiêng ở trên cùng như trường hợp có một đường nối với mái nhà.

Nếu một mặt không thẳng hàng, một cái gì đó được kết hợp với hình học đang ảnh hưởng đến nó.

• Để xác định phần tử tạo ra mặt không được căn chỉnh, hãy chuyển mặt đó vào Element.GetGeneratingElementIds (). Để biết thêm chi tiết về tiện ích này,
xem phần sau.

Tiện ích ExtrusionAnalyzer hoạt động tốt nhất đối với hình học ít nhất là hơi “giống đùn”, ví dụ, hình dạng của một bức tường có thể bị ảnh hưởng hoặc có thể

không bị ảnh hưởng bởi các đường nối cuối, nối sàn, nối mái, lỗ hở do cửa sổ và cửa ra vào, hoặc các sửa đổi khác. Hiếm khi đối với các kết hợp hình dạng và hướng

cụ thể, máy phân tích có thể không xác định được mặt nhất quán để hoạt động như cơ sở của quá trình đùn - một lỗi không hợp lệ sẽ được đưa vào
những tình huống này.

Trong ví dụ này, máy phân tích đùn được sử dụng để tính toán và phác thảo bóng được hình thành từ vật rắn đầu vào và hướng mặt trời.

Vùng mã: Sử dụng Trình phân tích đùn để tính toán và vẽ đường viền bóng.

1. /// <bản tóm tắt>


2. /// Vẽ bóng của vật rắn được chỉ định với hướng mặt trời được chỉ định. 3. /// </summary> 4. /// <remarks>
Bóng sẽ được phác thảo với các đường cong mô hình được thêm vào tài liệu.

5. /// Một giao dịch phải được mở trong tài liệu. </remarks> 6. /// <param name =
"document"> Tài liệu. </param> 7. /// <param name = "solid" > Vật rắn đích. </param>
8. /// <param name = "targetLevel"> Mức mục tiêu để đo và 9. /// vẽ bóng. </param>
10. /// <param name = "sunDirection"> Hướng từ mặt trời (hoặc nguồn sáng). </param> 11. ///
<returns> Các đường cong tạo ra bóng đổ. </returns> 12. /// <throws cref =
"Autodesk .Revit.Exceptions.InvalidOperationException "> 13. /// Bị ném bởi Ext ExtractionAnalyzer khi kết hợp hình học và
hướng 14. /// không cho phép phân tích thành công. </throws> 15. private static ICollection <ElementId> DrawShadow (Tài liệu
tài liệu , Solid solid, Level targetLevel, XYZ sunDirection) 16.

17.
{ 18. // Tạo mặt phẳng mục tiêu từ mức.
19. Mặt phẳng phẳng = document.Application.Create.NewPlane (XYZ.BasisZ, new XYZ (0,
20. 0, targetLevel.ProjectElevation));
21.
22. // Tạo bộ phân tích đùn.
23. Máy phân tích Ext ExtrusionAnalyzer = ExtrusionAnalyzer.Create (solid, plane, sunDirection);
24.
25. // Lấy mặt kết quả tại cơ sở của đùn được tính toán.
26. Kết quả khuôn mặt = analyzer.GetExtoratedBase ();
27.
28. // Chuyển các cạnh của khuôn mặt thành các đường cong.
29. CurveArray đường cong = document.Application.Create.NewCurveArray (); foreach
30. (EdgeArray edgeLoop in result.EdgeLoops ) {
31.
32. foreach (Cạnh cạnh trong edgeLoop) {
33.
34. Curve.Append (edge.AsCurve ());
35. }
Machine Translated by Google

Vùng mã: Sử dụng Trình phân tích đùn để tính toán và vẽ đường viền bóng.
36. }
37.
38. // Lấy đối tượng nhà máy đường cong mô hình.
39. Autodesk.Revit.Creation.ItemFactoryBase itemFactory;
40. if (document.IsFamilyDocument)
41. itemFactory = document.FamilyCreate; else
42. itemFactory = document.Create;
43.
44.
45. // Thêm một mặt phẳng phác thảo cho các đường cong.
46. SketchPlane sketchPlane =
47. itemFactory.NewSketchPlane (document.Application.Create.NewPlane (đường cong));
48. document.Regenerate ();
49.
50. // Thêm các đường cong đổ bóng
51. ModelCurveArray curveElements = itemFactory.NewModelCurveArray (curve, sketchPlane);
52.
53. // Trả về id của các đường cong đã tạo
54. Danh sách <ElementId> curveElementIds = new Danh sách <ElementId> ();
55. foreach (ModelCurve curveElement in curveElements) {
56.
57. curveElementIds.Add (curveElement.Id);
58. }
59.
60. return curveElementIds;
61. }

Tiện ích ở trên có thể được sử dụng để tính toán bóng của một khối lượng nhất định đối với cài đặt mặt trời và bóng đổ hiện tại cho chế độ xem:

Tìm hình học bằng phép chiếu tia


ReferenceIntersector

Lớp này cho phép ứng dụng sử dụng các công cụ chọn của Revit để tìm các phần tử và hình học. Lớp này sử dụng một tia từ một điểm theo một hướng xác định để tìm dạng

hình học bị tia tới.

Lớp chỉ giao nhau giữa hình học 3D và yêu cầu chế độ xem 3D khi tạo. Có thể sử dụng chế độ xem 3D đã được cắt bởi một hộp mặt cắt hoặc có các tùy chọn đồ họa và

hình học cụ thể cho chế độ xem cụ thể, để tìm các giao điểm không thể tìm thấy trong mô hình 3D chưa cắt và chưa cắt.

Lớp ReferenceIntersector hỗ trợ lọc đầu ra dựa trên phần tử hoặc kiểu tham chiếu. Đầu ra có thể được tùy chỉnh dựa trên hàm tạo được sử dụng hoặc bằng cách sử dụng các

phương thức và thuộc tính của lớp trước khi gọi một phương thức để thực hiện phép chiếu tia.
Machine Translated by Google

Có 4 hàm tạo.

Tên Sự mô tả

Tạo một ReferenceIntersector được thiết lập để trả về các giao điểm từ tất cả các phần tử và
ReferenceIntersector (View3D)
đại diện cho tất cả các loại mục tiêu tham chiếu.

ReferenceIntersector (ElementFilter, FindReferenceTarget, Tạo một ReferenceIntersector được thiết lập để trả về các giao điểm từ bất kỳ phần tử nào vượt qua

View3D) bộ lọc.

Tạo một ReferenceIntersector được đặt để chỉ trả về các giao điểm từ một phần tử mục tiêu duy nhất.
ReferenceIntersector (ElementId, FindReferenceTarget, View3D)

ReferenceIntersector (ICollection <ElementId>, Tạo một ReferenceIntersector được thiết lập để trả về các giao điểm từ bất kỳ phần tử mục tiêu nào.

FindReferenceTarget, View3D)

Bảng liệt kê FindReferenceTarget bao gồm các tùy chọn: Phần tử, Lưới, Cạnh, Đường cong, Mặt hoặc Tất cả.

Có hai phương pháp để chiếu một tia, cả hai phương pháp này đều lấy gốc của tia và hướng của nó. Phương thức Find () trả về một tập hợp các đối tượng

ReferenceWithContext phù hợp với tiêu chí của ReferenceIntersector. Đối tượng này chứa tham chiếu giao nhau, có thể vừa là phần tử vừa là tham chiếu hình học giao nhau giữa tia. Một

số tham chiếu phần tử được trả về sẽ có một đối tượng hình học tương ứng cũng giao nhau (ví dụ: tia đi qua các lỗ trong tường sẽ giao nhau giữa tường và phần tử mở). Nếu chỉ quan

tâm đến các giao điểm thực, ứng dụng sẽ loại bỏ tất cả các tham chiếu có Tham chiếu thuộc loại Phần tử.

Phương thức FindNearest () hoạt động tương tự như phương thức Find (), nhưng chỉ trả về tham chiếu giao nhau gần nhất với gốc tia.

Trả về ReferenceWithContext bao gồm một tham số lân cận. Đây là khoảng cách giữa gốc của tia sáng và giao điểm. Ứng dụng có thể sử dụng khoảng cách này để loại trừ các mục quá xa so

với nguồn gốc cho một phân tích hình học cụ thể. Một ứng dụng cũng có thể sử dụng khoảng cách này để thực hiện một số vấn đề thú vị liên quan đến việc phân tích hình học tại chỗ của

mô hình.

Ghi chú:

• Phương thức này tìm thấy cả hai Tham chiếu sẽ chỉ được tìm thấy và trả về cho các phần tử nằm trước tia.

• Phương pháp này sẽ không trả về các giao điểm trong các tệp được liên kết.

• Phương pháp này sẽ không trả về các điểm giao cắt với các phần tử không có trong tùy chọn thiết kế đang hoạt động.

Tìm các phần tử gần các phần tử

Một công dụng chính của công cụ này là tìm các phần tử gần với các phần tử khác. Điều này cho phép ứng dụng sử dụng công cụ làm “mắt” của nó và xác định mối quan hệ giữa các

phần tử chưa có mối quan hệ tích hợp sẵn.

Ví dụ Fro, khả năng dò tia có thể được sử dụng để tìm các cột được nhúng trong tường. Vì cột và tường không duy trì mối quan hệ trực tiếp, lớp này cho phép chúng tôi tìm kiếm

các ứng cử viên tiềm năng bằng cách theo dõi các tia ngay bên ngoài phạm vi của bức tường và tìm kiếm các giao điểm với các cột.

Ví dụ: Tìm các cột được nhúng trong tường


Machine Translated by Google

Đo khoảng cách

Lớp này cũng có thể được sử dụng để đo khoảng cách thẳng đứng từ giếng trời đến tầng gần nhất.

Ví dụ: đo bằng ReferenceIntersector.FindNearest ()

Vùng mã: Đo khoảng cách bằng phương pháp chiếu tia

1. lớp công khai RayProjection: IExternalCommand 2. { 3.

public Result Execute (ExternalCommandData revit, ref string message, ElementSet element) {
4.
5. Tài liệu doc = revit.Application.ActiveUIDocument.Document;
6.
7. Lựa chọn lựa chọn = revit.Application.ActiveUIDocument.Selection;
số 8.

9. // Nếu skylight được chọn, hãy xử lý nó.


10. FamilyInstance skylight = null; if
11. (selection.Elements.Size == 1) {
12.
13. foreach (Phần tử e trong lựa chọn. Thực hiện) {
14.
15. if (e là FamilyInstance) {
16.
17. Ví dụ FamilyInstance = e as FamilyInstance; bool isWindow
18. = (instance.Category.Id.IntegerValue == (int) BuiltInCategory.OST_Windows); bool isHostedByRoof =
19. (instance.Host.Category.Id.IntegerValue == (int) BuiltInCategory.OST_Roofs);
20.
21. if (isWindow && isHostedByRoof) {
22.
23. giếng trời = dụ;
24. }
25. }
26. }
27. }
Machine Translated by Google

28.
29. if (skylight == null) {
30.
31. message = "Vui lòng chọn một giếng trời."; trả về
32. kết quả.Cancell;
33. }
34.
35. // Tính chiều cao
36. Dòng dòng = TínhLineAboveFloor (doc, giếng trời);
37.
38. // Tạo đường cong mô hình để hiển thị khoảng cách Plane
39. plane = revit.Application.Application.Create.NewPlane (new XYZ (1, 0, 0), line.GetEndPoint (0)); SketchPlane sketchPlane =
40. SketchPlane.Create (doc, plane);
41.
42. ModelCurve curve = doc.Create.NewModelCurve (line, sketchPlane);
43.
44. // Hiển thị thông báo có giá trị độ dài
45. TaskDialog.Show ("Khoảng cách", "Khoảng cách đến tầng:" + String.Format ("{0: f2}", line.Length));
46.
47. trả về Kết quả.
48. }
49.
50. /// <summary> ///
51. Xác định đoạn thẳng kết nối giếng trời với tầng gần nhất. /// </summary> /// <returns> Đoạn đường
52. thẳng. </returns> Dòng riêng TínhLineAboveFloor (Tài liệu doc, FamilyInstance skylight) {
53.
54.
55.
56. // Tìm chế độ xem 3D để sử dụng cho hàm tạo ReferenceIntersector
57. FilteredElementCollector collector = new FilteredElementCollector (doc); Func <View3D,
58. bool> isNotTemplate = v3 =>! (V3.IsTemplate); View3D view3D = collector.OfClass (typeof
59. (View3D)). Cast <View3D> () .First <View3D> (isNotTemplate);
60.
61. // Sử dụng tâm của hộp giới hạn giếng trời làm điểm bắt đầu.
62. Hộp BoundBoxXYZ = skylight.get_BoundsBox (view3D); XYZ center =
63. box.Min.Add (box.Max) .Multiply (0.5);
64.
65. // Chiếu theo chiều âm Z xuống sàn.
66. XYZ rayDirection = new XYZ (0, 0, -1);
67.
68. Bộ lọc ElementClassFilter = new ElementClassFilter (typeof (Tầng));
69.
70. ReferenceIntersector refIntersector = new ReferenceIntersector (bộ lọc, FindReferenceTarget.Face, view3D); ReferenceWithContext
71. referenceWithContext = refIntersector.FindNearest (center, rayDirection);
72.
73. Tham chiếu tham chiếu = referenceWithContext.GetReference (); Giao lộ XYZ
74. = tham chiếu.GlobalPoint;
75.
76. // Tạo đoạn thẳng từ điểm bắt đầu và điểm giao nhau.
77. Kết quả dòng = Line.CreateBound (tâm, giao điểm); trả về kết quả;
78.
79. }
80. }

Ray nảy / phân tích

Các tham chiếu được trả về bởi ReferenceIntersector.Find () bao gồm giao điểm trên hình. Biết được giao điểm trên mặt, vật liệu của mặt và hướng tia cho phép

ứng dụng phân tích sự phản xạ và khúc xạ trong tòa nhà. Hình ảnh sau đây thể hiện việc sử dụng giao điểm để phản xạ các tia cắt nhau bởi các phần tử mô hình; các

đường cong mô hình đã được thêm vào để biểu diễn đường đi của mỗi tia.
Machine Translated by Google

Ví dụ: Tia phát ra từ các mặt giao nhau

Tìm giao lộ / va chạm

Một cách sử dụng khác của lớp ReferenceIntersector sẽ là phát hiện các giao điểm (chẳng hạn như chùm tia hoặc đường ống) giao nhau / giao thoa với đường tâm của một chùm tia

hoặc đường ống nhất định.

Ví dụ: Định tuyến lại các yếu tố xung quanh giao thoa
Machine Translated by Google

Các lớp Tiện ích Hình học

HostObjectUtils

Lớp HostObjectUtils cung cấp các phương thức như một lối tắt để định vị các mặt nhất định của HostObjects phức hợp. Các tiện ích này truy xuất các mặt đóng vai trò là

ranh giới của CompoundStructure của đối tượng:

• HostObjectUtils.GetSideFaces () - áp dụng cho Walls và FaceWalls; bạn có thể có được các mặt hoàn thiện bên ngoài hoặc bên trong.

• HostObjectUtils.GetTopFaces () và HostObjectUtils.GetBottomFaces () - áp dụng cho mái, sàn và trần nhà.

SolidUtils

Lớp SolidUtils chứa các phương thức để thực hiện các hoạt động trên chất rắn.

• SolidUtils.SplitVolumes () - lấy một khối rắn bao gồm các khối riêng biệt kèm theo và trả về các đối tượng Solid mới được tạo đại diện cho mỗi khối. Nếu

không cần tách, chất rắn đầu vào được trả lại.

• SolidUtils.TessosystemSolidOrShell () - tam giác một đầu vào đã cho Solid (có thể là một hoặc nhiều khối lượng đóng hoàn toàn hoặc một vỏ mở). Trả về một

Đối tượng TriangulatedSolidOrShell cho phép truy cập vào thành phần ranh giới tam giác được lưu trữ của một khối rắn hoặc một thành phần được kết nối tam giác

của một cái vỏ.

Tham giaGeometryUtils

Lớp JoinGeometryUtils chứa các phương thức để nối và bỏ liên kết các phần tử cũng như để quản lý thứ tự mà các phần tử được tham gia. Những tiện ích này không có sẵn cho

các tài liệu gia đình.

• JoinGeometryUtils.AreElementsJoined () - xác định xem hai phần tử có được tham gia hay không

• JoinGeometryUtils.GetJoinedElements () - trả về tất cả các phần tử được kết hợp với phần tử đã cho

• JoinGeometryUtils.JoinGeometry () - tạo một phép nối giữa hai phần tử có chung một mặt comon. Cạnh có thể nhìn thấy giữa các phần tử được nối là

loại bỏ. và các phần tử được nối sau đó có cùng độ đậm dòng và mẫu tô.

• JoinGeometryUtils.UnjoinGeometry () - loại bỏ một phép nối giữa hai phần tử đã nối

• JoinGeometryUtils.SwitchJoinOrder () - đảo ngược thứ tự mà hai phần tử được nối với nhau. Phần tử cắt trở thành phần tử cắt và phần tử cắt

ngược lại.

• JoinGeometryUtils.IsCuttingElementInJoin () - xác định xem phần tử đầu tiên trong hai phần tử được nối có cắt phần tử thứ hai hay ngược lại.

FacetingUtils

Lớp này được sử dụng để chuyển một cấu trúc tam giác thành một cấu trúc trong đó một số tam giác đã được hợp nhất thành tứ giác.

• FacetingUtils.ConvertTriangleToQuads () - phương thức này lấy TriangulationInterface (được xây dựng từ TriangulatedSolidOrShell) làm đầu vào và

trả về một tập hợp các hình tam giác và tứ giác đại diện cho đối tượng hình tam giác ban đầu.

Phòng và Hình học Không gian

API Revit cung cấp quyền truy cập vào hình học 3D của các yếu tố không gian (phòng và không gian).

Lớp SpatialElementGeometryCalculator có thể được sử dụng để tính toán hình học của một phần tử không gian và thu được các mối quan hệ giữa hình học và các yếu tố biên của

phần tử đó. Có 2 tùy chọn có thể được cung cấp cho tiện ích này:

• SpatialElementBoundaryLocation - sử dụng mặt hoàn thiện hay đường tâm phần tử biên để tính toán

• StoredFreeBoundaryFaces - có bao gồm các mặt không ánh xạ trực tiếp đến phần tử ranh giới trong kết quả hay không.

Kết quả tính toán hình học được chứa trong lớp SpatialElementGeometryResults. Từ lớp SpatialElementGeometryResults, bạn có thể lấy:

• Khối lượng Solid đại diện cho hình học (phương pháp GetGeometry ())

• Thông tin về mặt ranh giới (tập hợp SpatialElementBoundarySubfaces)

Mỗi giao diện con cung cấp:

• Mặt của yếu tố không gian

• Mặt khớp của phần tử biên

• Mặt con (phần của phần tử không gian được giới hạn bởi phần tử ranh giới cụ thể này)

• Loại giao diện phụ (dưới cùng, trên cùng hoặc bên cạnh)
Machine Translated by Google

Một số lưu ý về việc sử dụng tiện ích này:

• Máy tính duy trì một bộ nhớ đệm bên trong cho hình học mà nó đã xử lý. Nếu bạn định tính toán hình học cho một số phần tử trong cùng một

bạn nên sử dụng một phiên bản duy nhất của lớp này. Lưu ý rằng bộ nhớ cache sẽ bị xóa khi có bất kỳ thay đổi nào đối với tài liệu.

• Sàn hầu như không bao giờ được đưa vào như các yếu tố ranh giới. Revit sử dụng phác thảo 2D của căn phòng để tạo thành các mặt dưới cùng và không khớp chúng với

hình học sàn.

• Các khe hở được tạo bởi các tính năng cắt tường như cửa ra vào và cửa sổ không được bao gồm trong các mặt được trả về.

• Các tính toán hình học phù hợp với các khả năng được cung cấp bởi Revit. Trong một số trường hợp Revit đưa ra các giả định về cách tính thể tích ranh giới của các

phòng và không gian, các giả định này sẽ có trong đầu ra của tiện ích.

Ví dụ sau đây tính toán hình học của một căn phòng và tìm các mặt ranh giới của nó

Vùng mã: Vùng mặt sử dụng SpatialElementGeometryCalculator


1. Máy tính SpatialElementGeometryCalculator = new SpatialElementGeometryCalculator (doc); 2.

3. // tính toán hình học căn phòng 4.


SpatialElementGeometryResults results = Calculator.CalculateSpatialElementGeometry (room);
5.
6. // lấy solid đại diện cho hình học của căn phòng 7. Solid
roomSolid = results.GetGeometry ();
số 8.

9. foreach (Mặt đối mặt trong roomSolid.Faces) 10.


{ 11. 12.
double faceArea = face.Area;

13. // lấy các mặt phụ cho mặt của căn phòng IList
14. <SpatialElementBoundarySubface> subfaceList = results.GetBoundaryFaceInfo (face); foreach (Giao diện phụ
15. SpatialElementBoundarySubface trong subfaceList) {
16.
17. if (subfaceList.Count> 1) // có nhiều mặt con xác định mặt {
18.
19. // lấy diện tích của từng mặt con kép
20. subfaceArea = subface.GetSubface (). area;
21.
22. // các mặt phụ tồn tại trong các tình huống như khi tường bao quanh phòng bị // chia theo chiều
23. ngang và các mặt của mỗi tường ngăn kết hợp với nhau để tạo ra // toàn bộ mặt của căn phòng
24.
25. }
26. }
27. }

Ví dụ sau đây tính toán hình học của một căn phòng và tìm vật liệu của các mặt thuộc về các yếu tố xác định căn phòng.

Vùng mã: Vật liệu mặt sử dụng SpatialElementGeometryCalculator


1. public void MaterialFromFace () 2. { 3.

chuỗi s = ""; Tài


4. liệu doc = this.Document; UIDocument
5. uidoc = new UIDocument (doc); Room room =
6. doc.GetElement (uidoc.Selection.PickObject (ObjectType.Element) .ElementId) as Room;
7.

SpatialElementBoundaryOptions spatialElementBoundaryOptions = new SpatialElementBoundaryOptions ();


8. 9. spatialElementBoundaryOptions.SpatialElementBoundaryLocation = SpatialElementBoundaryLocation.Finish; Máy tính
10. SpatialElementGeometryCalculator = mới SpatialElementGeometryCalculator (doc, spatialElementBoundaryOptions)
;
11. Kết quả SpatialElementGeometryResults = Calculator.CalculateSpatialElementGeometry (phòng); Solid roomSolid =
12. results.GetGeometry ();
13.
14. foreach (Face roomSolidFace in roomSolid.Faces) {
15.
16. foreach (Giao diện phụ SpatialElementBoundarySubface trong kết quả.GetBoundaryFaceInfo (roomSolidFace)) {
17.
18. Face bindingElementface = subface.GetBoundsElementFace (); ElementId id =
19. bindingElementface.MaterialElementId; s + = doc.GetElement (id) .Name + ",
"
20. id = + id.IntegerValue.ToString () + "\ n";
21. }
22. }
23. TaskDialog.Show ("revit", s);
24. }
Machine Translated by Google
Machine Translated by Google

Phác thảo
Để tạo các phần tử hoặc chỉnh sửa hồ sơ của chúng trong Revit, trước tiên bạn phải tạo các đối tượng phác thảo. Ví dụ về các yếu tố yêu cầu bản phác thảo bao gồm:

• Mái nhà

• Sàn nhà

• Cầu thang

• Lan can.

Bản phác thảo cũng được yêu cầu để xác định các loại hình học khác, chẳng hạn như:

• Máy ép đùn

• Các sơ hở

• Vùng

Trong API nền tảng Revit, các chức năng phác thảo được biểu diễn bằng các lớp phác thảo 2D và 3D như sau:

• Bản phác thảo 2D:

o SketchPlane

o Phác thảo

o ModelCurve

o và hơn thế nữa

• Bản phác thảo 3D:

o GenericForm

o Path3D

Ngoài Sketch Elements, ModelCurve cũng được mô tả trong chương này. Để biết thêm chi tiết về Phân loại phần tử, hãy xem Phân loại phần tử trong Elements
Essential tiết diện.

Lớp phác thảo 2D

Lớp Sketch đại diện cho các đường cong được bao bọc trong một mặt phẳng được sử dụng để tạo mô hình 3D. Các tính năng chính được đại diện bởi các thuộc tính
SketchPlane và CurveLoop.

Khi chỉnh sửa tệp Revit, bạn không thể truy xuất đối tượng Sketch bằng cách lặp lại phép liệt kê Document.Elements vì tất cả các đối tượng Sketch đều là Phần tử
tạm thời. Khi truy cập thông tin mô hình 3D của Gia đình, các đối tượng Sketch rất quan trọng để tạo thành hình học. Để biết thêm chi tiết, hãy tham khảo 3D Sketch.

SketchPlane là cơ sở cho tất cả các lớp phác thảo 2D như ModelCurve và Sketch. SketchPlane cũng là cơ sở cho các Phần tử chú thích 2D như DetailCurve. Cả ModelCurve
và DetailCurve đều có thuộc tính SketchPlane và cần có SketchPlane trong phương pháp tạo tương ứng. SketchPlane luôn ẩn trong Revit UI.

Mọi ModelCurve phải nằm trong một SketchPlane. Nói cách khác, bất cứ nơi nào bạn vẽ ModelCurve trong giao diện người dùng hoặc bằng cách sử dụng API,
SketchPlane phải tồn tại. Do đó, ít nhất một SketchPlane tồn tại trong chế độ xem 2D nơi ModelCurve được vẽ.

Chế độ xem 2D bao gồm các kiểu xem CeilingPlan, FloorPlan và Elevation. Theo mặc định, SketchPlane được tạo tự động cho tất cả các chế độ xem này. Tên SketchPlane
liên quan đến chế độ xem 2D trả về tên chế độ xem như Cấp 1 hoặc Hướng Bắc.

Hình 77: Chọn Mặt phẳng để xác định Mặt phẳng làm việc mới
Machine Translated by Google

Khi bạn chỉ định một mặt phẳng làm việc mới, bạn có thể chọn Chọn một mặt phẳng như minh họa trong hình trước. Sau khi bạn chọn một mặt phẳng, hãy chọn một mặt
phẳng trên một phần tử cụ thể chẳng hạn như bức tường như hình sau cho thấy. Trong trường hợp này, thuộc tính SketchPlane.Name trả về một chuỗi liên quan đến phần
tử đó. Ví dụ, trong hình sau, thuộc tính SketchPlane.Name trả về 'Generic - 8' giống với thuộc tính Wall.Name.

Hình 78: Chọn một mặt phẳng trên tường làm Mặt phẳng làm việc

Lưu ý SketchPlane khác với mặt phẳng làm việc vì mặt phẳng làm việc có thể nhìn thấy và có thể được chọn. Nó không có một lớp cụ thể trong API hiện tại, nhưng
được đại diện bởi lớp Phần tử. Một mặt phẳng làm việc phải được xác định dựa trên một SketchPlane cụ thể. Cả thuộc tính Work plane và SketchPlane Category đều trả
về null. Mặc dù SketchPlane luôn vô hình, nhưng luôn có một SketchPlane tương ứng với một mặt phẳng làm việc. Mặt phẳng làm việc được sử dụng để thể hiện
SketchPlane trong văn bản và hình ảnh.

Thông tin sau áp dụng cho các thành viên SketchPlane:

• Các thuộc tính ID, UniqueId, Name và Plane trả về một giá trị;

• Thuộc tính tham số trống

• Thuộc tính vị trí trả về một đối tượng Vị trí

• Các thuộc tính khác trả về null.

Mặt phẳng chứa thông tin hình học SketchPlane. SketchPlane thiết lập một hệ tọa độ phẳng với Plane như hình sau minh họa:

Hình 79: Hệ tọa độ SketchPlane và Mặt phẳng


Machine Translated by Google

Mẫu mã sau minh họa cách tạo SketchPlane mới:

Vùng mã 17-1: Tạo SketchPlane mới

1. riêng SketchPlane CreateSketchPlane (ứng dụng UIApplication) 2. { 3.

// thử tạo một mặt phẳng phác thảo mới XYZ


4. newNormal = new XYZ (1, 1, 0); // vectơ pháp tuyến XYZ newOrigin = new
XYZ (0, 0, 0); // điểm gốc // tạo mặt phẳng hình học Plane
5. 6. learningryPlane = application.Application.Create.NewPlane (newNormal,
7. newOrigin);

8. 9. // tạo mặt phẳng phác thảo


10. SketchPlane sketchPlane = SketchPlane.Create (application.ActiveUIDocument.Document, Hình họcPlane);
11.
12. trả về sketchPlane;
13. }

Bản phác thảo 3D

3D Sketch được sử dụng để chỉnh sửa một gia đình hoặc tạo một đối tượng 3D. Trong API nền tảng Revit, bạn có thể hoàn thành Bản phác thảo 3D bằng cách sử dụng
các lớp sau.

• đùn

• Cuộc cách mạng

• Trộn

• Quét

Nói cách khác, có bốn hoạt động mà qua đó mô hình 2D chuyển thành mô hình 3D. Để biết thêm chi tiết về phác thảo 2D, hãy tham khảo 2D Sketch.

Phun ra

Revit sử dụng các đùn để xác định hình học 3D cho các gia đình. Bạn tạo một đùn bằng cách xác định một bản phác thảo 2D trên một mặt phẳng; Revit sau đó tạo
ra bản phác thảo giữa điểm bắt đầu và điểm kết thúc.

Truy vấn đối tượng Biểu mẫu đùn cho một biểu mẫu chung để sử dụng trong mô hình hóa gia đình và tạo khối lượng. Lớp đùn có các thuộc tính sau:

Bảng 40: Thuộc tính đùn

Tài sản Sự mô tả

Đùn bắt đầu Trả về điểm Bắt đầu đùn. Nó là một loại Đôi.

ĐùnEnd Trả về điểm kết thúc đùn. Nó là một loại Đôi.

Phác thảo Trả về bản phác thảo đùn. Nó chứa một mặt phẳng phác thảo và một số đường cong.

Giá trị của các thuộc tính ExtrusionStart và ExtrusionEnd phù hợp với các tham số trong Revit UI. Hình dưới đây minh họa các thông số tương ứng và kết quả đùn.
Machine Translated by Google

Hình 80: Các thông số đùn trong giao diện người dùng

Hình 81: Kết quả ép đùn

Cuộc cách mạng

Lệnh Revolve tạo ra hình học xoay quanh một trục. Bạn có thể sử dụng lệnh revolve để tạo các tay nắm cửa hoặc các tay nắm khác trên đồ nội thất, mái vòm hoặc cột.

Truy vấn đối tượng Biểu mẫu Cách mạng cho một biểu mẫu chung để sử dụng trong lập mô hình gia đình và đại chúng. Giai cấp Cách mạng có các thuộc tính sau:
Machine Translated by Google

Bảng 41: Thuộc tính Revolution

Tài sản Sự mô tả

Trục Trả về Trục. Nó là một đối tượng ModelLine.

EndAngle Trả về Góc kết thúc. Nó là một loại Đôi.

Phác thảo Trả về bản phác thảo đùn. Nó chứa một SketchPlane và một số đường cong.

EndAngle nhất quán với cùng một thông số trong Revit UI. Các hình ảnh sau đây minh họa tham số tương ứng Revolution, bản phác thảo và kết quả.

Hình 82: Tham số tương ứng

Hình 83: Bản phác thảo cuộc cách mạng


Machine Translated by Google

Hình 84: Kết quả cuộc cách mạng

Ghi chú

• Không thể truy cập Góc Bắt đầu bằng API Nền tảng Revit.

• Nếu Góc kết thúc là dương, thì Chiều quay là chiều kim đồng hồ. Nếu nó là âm, chiều quay là ngược chiều kim đồng hồ
Trộn

Lệnh Blend trộn hai cấu hình với nhau. Ví dụ: nếu bạn phác thảo một hình chữ nhật lớn và một hình chữ nhật nhỏ hơn trên đó, Revit Architecture sẽ kết hợp
hai hình với nhau.

Truy vấn đối tượng Blend Form cho một biểu mẫu chung để sử dụng trong mô hình hóa gia đình và khối lượng. Lớp Blend có các thuộc tính sau:

Bảng 42: Thuộc tính hỗn hợp

Tài sản Sự mô tả

BottomSketch Trả về Bản phác thảo Dưới cùng. Nó là một đối tượng Sketch.

TopSketch Trả về Top Sketch Blend. Nó là một đối tượng Sketch.

FirstEnd Trả về kết thúc đầu tiên. Nó là một loại Đôi.

SecondEnd Trả về kết thúc thứ hai. Nó là một loại Đôi.

Giá trị thuộc tính FirstEnd và SecondEnd nhất quán với các thông số giống nhau trong Revit UI. Các hình ảnh sau đây minh họa các thông số tương ứng Blend,
các bản phác thảo và kết quả.

Hình 85: Các tham số hòa trộn trong giao diện người dùng
Machine Translated by Google

Hình 86: Trộn phác thảo trên và phác thảo dưới

Hình 87: Kết quả trộn

Quét

Lệnh Sweep quét một hồ sơ dọc theo đường dẫn 2D đã tạo hoặc đường dẫn 3D đã chọn. Đường dẫn có thể là một vòng mở hoặc vòng kín, nhưng phải xuyên qua
mặt phẳng biên dạng.

Truy vấn đối tượng Sweep Form cho một biểu mẫu chung để sử dụng trong lập mô hình gia đình và khối lượng. Lớp Sweep có các thuộc tính sau:

Bảng 43: Thuộc tính quét

Tài sản Sự mô tả

Path3d Trả về Bản phác thảo đường dẫn 3D. Nó là một đối tượng Path3D.

PathSketch Trả về bản phác thảo đường dẫn kế hoạch. Nó là một đối tượng Sketch.

Hồ sơ Trả về Sketch hồ sơ. Nó là một đối tượng Sketch.

EnableTrajSegmentation Trả về trạng thái Phân đoạn quỹ đạo. Nó là một Boolean.

MaxSegmentAngle Trả về Góc phân đoạn tối đa. Nó là một loại Đôi.

Việc tạo Đường dẫn 2D cũng tương tự như các hình thức khác. Đường dẫn 3D được tìm nạp bằng cách chọn các đường cong 3D đã tạo.
Machine Translated by Google

Hình 88: Chọn đường dẫn Sweep 3D

Lưu ý Thông tin sau áp dụng cho Dọn dẹp:

• Thuộc tính Path3d chỉ khả dụng khi bạn sử dụng Pick Path để lấy đường dẫn 3D.

• PathSketch khả dụng cho dù đường dẫn là 3D hay 2D.

Hình 89: Bản phác thảo hồ sơ quét

Lưu ý : ProfileSketch vuông góc với đường dẫn.

Quét phân đoạn rất hữu ích để tạo khuỷu tay làm việc của ống dẫn cơ khí. Tạo một đường quét phân đoạn bằng cách thiết lập hai tham số quét và phác thảo một
đường dẫn với các vòng cung.

Hình 90: Cài đặt phân đoạn tương ứng trong giao diện người dùng
Machine Translated by Google

Lưu ý Thông tin sau áp dụng cho Quét được phân đoạn:

• Các tham số chỉ ảnh hưởng đến các cung trong đường dẫn.

• Số phân đoạn tối thiểu cho một lần quét là hai.

• Thay đổi lượt quét phân đoạn thành lượt quét không phân đoạn bằng cách bỏ chọn hộp kiểm Phân đoạn quỹ đạo. Thuộc tính
EnableTrajSegmentation trả về false.

• Nếu thuộc tính EnableTrajSegmentation là false, giá trị của MaxSegmentAngle là 360 ° mặc định.

Hình 91: Kết quả quét

ModelCurve
ModelCurve đại diện cho các dòng mô hình trong dự án. Nó tồn tại trong không gian 3D và hiển thị trong tất cả các chế độ xem.

Các hình ảnh sau minh họa bốn lớp dẫn xuất ModelCurve:

Hình 92: ModelLine và ModelArc

Hình 93: ModelEllipse và ModelNurbSpline


Machine Translated by Google

Tạo ModelCurve

Chìa khóa để tạo ModelCurve là tạo Geometry.Curve và SketchPlane nơi đặt Curve. Dựa trên kiểu Geometry.Curve bạn nhập, ModelCurve tương ứng
được trả về có thể được chuyển xuống đúng kiểu của nó.

Mẫu sau minh họa cách tạo đường cong mô hình mới (ModelLine và ModelArc):

Vùng mã 17-2: Tạo đường cong mô hình mới

1. // nhận xử lý ứng dụng từ tài liệu 2.


Autodesk.Revit.ApplicationServices.Application application = document.Application; 3.

4. // Tạo đường hình học trong ứng dụng Revit 5. XYZ


startPoint = new XYZ (0, 0, 0); 6. XYZ endPoint = new XYZ
(10, 10, 0); 7. Line geomLine = Line.CreateBound (startPoint,
endPoint);
số 8.

9. // Tạo cung hình học trong ứng dụng Revit 10. XYZ end0 =
new XYZ (1, 0, 0); 11. XYZ end1 = new XYZ (10, 10, 10); 12.
XYZ pointOnCurve = new XYZ (10, 0, 0); 13. Arc geomArc =
Arc.Create (end0, end1, pointOnCurve); 14.

15. // Tạo mặt phẳng hình học trong ứng dụng Revit 16. XYZ
origin = new XYZ (0, 0, 0); 17. XYZ normal = new XYZ (1, 1,
0); 18. Plane geomPlane = application.Create.NewPlane (normal,
origin); 19.

20. // Tạo mặt phẳng phác thảo trong tài liệu hiện tại 21.
SketchPlane sketch = SketchPlane.Create (document, geomPlane); 22.

23. // Tạo phần tử ModelLine bằng cách sử dụng đường hình học và mặt phẳng phác thảo đã tạo 24.
ModelLine line = document.Create.NewModelCurve (geomLine, sketch) as ModelLine; 25.

26. // Tạo phần tử ModelArc bằng cách sử dụng cung hình học và mặt phẳng phác thảo đã tạo 27.
ModelArc arc = document.Cree.NewModelCurve (geomArc, sketch) as ModelArc;

Các thành viên

GeometryCurve
Thuộc tính GeometryCurve được sử dụng để lấy hoặc thiết lập đường cong hình học của mô hình. Ngoại trừ ModelHermiteSpline, bạn có thể nhận được Geometry.Curves
khác nhau từ bốn ModelCurves;

• Hàng

• Hồ quang

• Hình elip

• Ngoại tuyến.

Mẫu mã sau minh họa cách lấy một Đường cong cụ thể từ ModelCurve.

Vùng mã 17-3: Lấy đường cong cụ thể từ ModelCurve

1. // lấy mô hình hình học ModelCurve của mô hình mô hình 2.


Autodesk.Revit.DB.Curve geoCurve = modelCurve.GeometryCurve; 3. 4. if (geoCurve
là Autodesk.Revit.DB.Line) 5. { 6. 7. }

Dòng geoLine = geoCurve as Line;

You might also like