53
Chương I SketchUp Scripting by [email protected] 1 Gi i thi u vngôn ngkch bn trong SketchUp

Chuong 1,2 va 3

Embed Size (px)

Citation preview

Page 1: Chuong 1,2 va 3

Chương I SketchUp Scripting by [email protected]

1

Giới thiệu về ngôn ngữ kịch bản trong SketchUp

Page 2: Chuong 1,2 va 3

Chương I SketchUp Scripting by [email protected]

2

Hiện nay có nhiều phần mềm trợ giúp bạn tạo dựng mô hình 3D, và các cuộc tranh luận

xem phần mềm nào cung cấp các tính năng là tốt nhất vẫn diễn ra vô cùng gay gắt. Nhưng khi nói đến việc dễ dàng sử dụng và được ưu thích thì phần mềm SketchUp luôn chiến thắng. Giao diện sử dụng của nó rất trực quan nên hầu hết người dùng đều có thể dễ dàng hiểu được những điều cơ bản về nó trong một vài phút. Khả năng vừa học tập vừa tích lũy kinh nghiệm khi sử dụng nó khá tốt nên người mới cũng có thể trở thành chuyên gia trong một vài giờ.

Hầu hết các phần mềm tạo dựng mô hình 3D đều nhắm tới những đối tượng sử dụng cụ thể. AutoCad hướng tới các kỹ sư ( như kiến trúc, xây dựng, cơ khí, điện…) trong khi Maya, Blender hoặc 3ds Max hướng tới các nhà làm phim hoạt hình, game và nghệ sỹ đồ họa. Nhưng SketchUp thì lại có một tầm nhìn lớn hơn, điều này thể hiện qua khẩu hiệu và lý do tồn tại của nó là “3D cho mọi người-3D for Everyone”.

Như những gì đã nói, SketchUp đã sống theo đúng mục tiêu của mình. Không những chỉ có kiến trúc sư và kỹ sư chấp nhận nó, mà còn thợ mộc, nghệ sỹ đồ họa, nhà làm phim hoạt hình, nhà toán học và những nhà sáng tạo khác trong mọi lĩnh vực cũng chọn nó. Và nếu như SketchUp có thể không đáp ứng được nhu cầu cụ thể nào đó thì bạn có thể tăng cường thêm các tính năng khác cho nó bằng các Plugin-và đây chính là chủ đề được tìm hiểu rất kỹ trong cuốn sách này.

Mặc dù SketchUp là dành cho mọi người, nhưng cuốn sách này thì không. Bởi vì chúng ta sẽ không sử dụng các thao tác “chọn rồi kích” quen thuộc nữa mà tập trung giao tiếp với SketchUp bằng các dòng lệnh văn bản. Và phát triển hơn nữa là chúng ta sẽ lưu trữ các dòng lệnh này trong các tập tin được gọi là các kịch bản-Script. Với các kịch bản đúng, bạn có thể thực hiện tất cả mọi thứ mà bạn vẫn thường làm trong SketchUp và nhiều thứ khác hơn nữa.

1.1 Mười lý do để học ngôn ngữ kịch bản cho SketchUp. Giao diện sử dụng của SketchUp chính là một trong những điểm mạnh của nó. Vì vậy nghe

có vẻ kỳ lạ, thậm chí là lỗi thời khi có một cuốn sách viết về các dòng lệnh văn bản dành cho SketchUp. Nhưng có rất nhiều lý do tại sao việc học học tập ngôn ngữ kịch bản-Scripting cho SketchUp lại là một ý tưởng hay. Dưới đây trình bày mười ưu điểm chính của kịch bản-Script:

1. Quản lý các thiết kế phức tạp: Các Group và các Component trong SketchUp khiến nó có thể tạo ra hệ thống phân cấp của các đối tượng khi xây dựng mô hình. Một mô hình có quy mô lớn, chẳng hạn như trung tâm mua sắm có thể bao hồm hàng ngàn các Component mẹ, các Component con và thậm chí là con của con của Component con. Việc quản lý hệ thống phân cấp các đối tượng sẽ trở nên dễ dàng hơn khi sử dụng Script so với việc sử dụng cửa sổ làm việc (work space) của phần mềm. Script cũng có thể khiến nó trở nên dễ dàng hơn cho những người khác muốn quan sát và phân tích mô hình của bạn.

2. Plugin-Phần bổ trợ: Plugin cho SketchUp sẽ chỉ thêm các tính năng bổ trợ cho phần mềm, chẳng hạn như trình đơn mới, công cụ mới trên thanh công cụ, hộp thoại mới và nhiều khả năng khác nữa. Như chúng ta đã biết, một plugin chỉ là một tin Script nằm trong đúng thư mục Plugin ở thư mục cài đặt SketchUp lên ổ cứng. Và tại chương 10 của cuốn sách sẽ giải thích cách mà plugin được mã hóa và sử dụng.

3. Truy cập các đối tượng thiết kế mà không cần dùng con trỏ chuột: Trong SketchUp khả năng tìm và chọn đối tượng hoàn toàn phụ thuộc vào độ khéo léo của việc sử dụng chuột của bạn. Đây không phải là vấn đề khi mô hình của bạn được tạo từ các hình đơn giản, nhưng nó sẽ trở nên khó điều khiển hơn khi mô hình lớn và phức tạp như lưới đa giác chẳng hạn. Với một kịch bản-Script, thật dễ dàng để quay trở lại tất cả các đối tượng trong quá trình xây dựng mô hình và chỉ thực hiện trên những đối tượng mà bạn quan tâm.

4. Tạo dựng bất cứ thứ thì, bất cứ chỗ nào: Thông thường, bạn chỉ có thể tạo dựng các mô hình trong khung nhìn (Camera view) của SketchUp mà hiện tại bạn đang quan sát. Ngoài ra

Page 3: Chuong 1,2 va 3

Chương I SketchUp Scripting by [email protected]

3

bạn còn phải dựa vào việc truy bắt điểm, các trục tọa độ đầy màu sắc và hộp thoại VCB trong SketchUp. Đối với một dự án tạo dựng mô hình mới bắt đầu trong SketchUp thì chỉ có thể tạo ra các hình học trong các mặt phẳng xy, xz và yz. Với Script dành cho SketchUp thì sẽ không còn bị những hạn chế này áp đặt nữa, bạn có thể tạo dựng bất cứ thứ gì bạn thích và bất cứ chỗ nào bạn muốn.

5. Chuyển động-Animation: SketchUp cung cấp một cách để tạo ra sự chuyển động, đó là bạn có thể thay đổi khung nhìn quan sát (camera view) hoặc tạo ra sự trình diễn liên tục của nhiều cảnh-Scene. Nhưng với những chuyển động kiểu khung xương thì sao, Script có thể giúp bạn tạo ra một hệ thống chuyển động phức hợp từ các đối tượng đơn lẻ sử dụng các chuyển động quay đơn giản (lệnh Rotation). Để hiểu những gì tôi nói thì bạn có thể bỏ qua những chương đầu và đến với Chương 12 để học cách tạo ra một con Robot nhảy nhót.

6. Hỗ trợ miễn phí và thân thiện: Google vẫn duy trì một nhóm trực tuyến đặc biệt chuyên hỗ trợ và thông báo về các Script cho SketchUp: https://groups.google.com/d/forum/google-sketchup-developers . Tất cả các câu hỏi đều được hoan nghênh và nhận được câu trả lời trong vòng 24 giờ. Hơn nữa có một số diễn đàn như http://www.sketchucation.com cũng cung cấp và hỗ trợ vô số thông tin.

7. Tự động hóa: Một trong những lợi thế chính của việc lưu trữ các dòng lệnh cho SketchUp trong một tập tin kịch bản là bạn bạn chỉ cần gõ các dòng lệnh đúng một lần, và sau đó bạn có thể thực hiện các kịch bản này lặp đi lặp lại. Để thay đổi, bạn có thể dễ dàng chỉnh sửa lại kịch bản bằng một phần mềm soạn thảo văn bản nào đó, có thể cắt và dán các dòng lệnh giữa các tập tin kịch bản-Script với nhau.

8. Truy suất thông tin từ Web: Sẽ đề cập ở trong Chương 13, Script sẽ giúp bạn tạo ra các hộp thoại Web (WebDialog) để truy cập vào các trang Web. Các hộp thoại này có thể đáp ứng như một cầu nối giữa mã JavaScript và mô hình của bạn trong SketchUp.

9. Phong phú các kịch bản-Script có sẵn: Cộng đồng phát triển SketchUp đang hoạt động và phát triển rất mạnh. Nếu bạn có nhu cần thêm những tính năng mới cho phần mềm SketchUp để phục vụ việc tạo dựng mô hình, thì có khả năng là một ai đó đã viết và mã hóa kịch bản-Script phù hợp với mục đích, yêu cầu của bạn. Và tập tin mã hóa Script đó cũng có thể có sẵn trên mạng Internet để bạn tải về miễn phí hoặc phải mua.

10. Niềm vui: Tôi đã từng viết các ứng dụng thêm cho rất nhiều phần mềm tạo dựng mô hình 3D nhưng tất cả chúng không mang lại cái cảm giác thực hiện giống như đã làm với ngôn ngữ Script cho SketchUp.

1.2 Một ví dụ đơn giản. Tôi biết, tôi biết rồi. Chúng ta vẫn đang trong chương đầu tiên của cuốn sách này mà tôi lại

đi vào sâu chi tiết chuyên môn. Tôi xin lỗi, nhưng trước khi tiếp tục tìm hiểu thêm, tôi muốn các bạn có một chút ý tưởng về việc thế nào là một dòng lệnh trong SketchUp. Nếu bạn là người ham thích tìm hiểu và muốn thực hiện điều gì đó, tôi khuyên bạn nên bắt đầu bật phần mềm SketchUp, chọn mục của Ruby Console trong trình đơn Window trên menu chính. Khi đó một hộp thoại có tên là Ruby Console sẽ xuất hiện, đây chính là nơi mà tất cả các lệnh dành cho SketchUp sẽ được nhập vào đó.

Nếu bây giờ bạn muốn dựng một đoạn thẳng đi từ gốc tọa độ [0,0,0] đến điểm có tọa độ [5,5,5]. Thông thường để dựng được đoạn thẳng này thì bạn cần phải mất tới 3 lần kích chuột. Đó là một lần kích chuột để chọn công cụ Line trên thanh công cụ, một lần kích chuột vào điểm gốc của hệ tọa độ và một lần kích chuột con con trỏ chuột nằm ở vị trí có tọa độ [5,5,5]. Nhưng bạn cũng có thể dựng đoạn thẳng đó với một dòng lệnh sau đây vào trong hộp thoại Ruby Console :

Sketchup.active_model.entities.add_line [0,0,0], [5,5,5]

Page 4: Chuong 1,2 va 3

Chương I SketchUp Scripting by [email protected]

4

Nhấn phím Enter để lệnh đó được thực thi, khi đó SketchUp sẽ dựng một đoạn thẳng

nối giữa hai điểm [0,0,0] và [5,5,5] giống như khi bạn sử dụng công cụ Line. Bạn sẽ nghĩ là phải mất nhiều thời gian để gõ lệnh hơn là việc di chuyển và kích chuột. Nhưng nếu bạn lưu trữ lệnh đó trong một tập tin kịch bản thì bạn có thể thực hiện nó (và các lệnh khác nữa) một cách hoàn toàn tự động. Đây không phải là một lợi ích lớn khi bạn dựng chỉ một đoạn thẳng, nhưng khi bạn dựng các đường parabol, xoắn, và B- spline thì tập tin kịch bản-Script sẽ rất tiện dụng.

Việc tự động hóa các lệnh có thể phức tạp nên nhiều người sử dụng sẽ luôn luôn thích thao tác “chọn rồi kích” hơn. điều đó không có gì là sai cả. Và ý tưởng về việc giao tiếp với SketchUp bằng những dòng lệnh sẽ khiến bạn cảm thấy lo lắng? đó cũng không có vấn đề gì vì cuốn sách này không phải dành cho tất cả mọi người.

Tuy nhiên, nếu dòng lệnh trên gây một chút tò mò và kích thích sự ham muốn tìm hiểu thêm của bạn thì đây chính là cuốn sách dành cho bạn. Nó sẽ không chỉ cho bạn thấy cách làm thế nào để tạo ra tất cả các dạng mô hình có thể tưởng tượng được trong SketchUp mà bạn cũng sẽ có thể thêm các tính năng có thể tùy chỉnh cho SketchUp, chẳng hạn như các công cụ, trình đơn mới và các plugin.

1.3 Ngôn ngữ kịch bản-Scripting và Ruby trong SketchUp. Các lệnh dùng trong SketchUp được cấu tạo từ các thuật ngữ cụ thể của SketchUp, nhưng

ngôn ngữ cơ bản lại là Ruby. Ruby là một ngôn ngữ lập trình chính được sử dụng trong sự phát triển của các ứng dụng web ( Ruby on Rails ). Mặc dù ngôn ngữ này tương đối mới nhưng Ruby đã rất cuốn hút người dùng, và có rất nhiều trang web cung cấp tài nguyên cho việc hướng dẫn và hỗ trợ nó.

Có rất nhiều lợi ích khi các lệnh của SketchUp dựa trên ngôn ngữ Ruby. Trong đó có ba lợi ích quan trọng nhất như sau:

1. Tiềm năng rộng mở: Kịch bản-Script của SketchUp sẽ rất hạn chế nếu bạn chỉ sử dụng để dựng đường, bề mặt và các đối tượng hình học tương tự. Nhưng với các tính năng cao cấp của Ruby như cấu trúc điều khiển, vòng lặp, lệnh có điều kiện và định hướng đối tượng thì các kịch bản cho SketchUp có thể thực hiện tất cả công việc cần sử lý mà bạn mong đợi từ một phần mềm hiện đại, từ truy cập hệ thống cấp cao đến tối ưu hóa đồ họa cấp thấp.

2. Phong phú các hàm có sẵn: Nếu bạn được yêu cầu xác định một vị trí nào đó bằng cách sử dụng hệ tọa độ cầu thay vì việc sử dụng hệ thống tọa độ đề các vuông góc truyền thống thì bắt buộc bạn phải sử dụng đến các công thức tính lượng giác như sin và cos để tính toán, và đôi khi nó sẽ gây khó nhọc do phải viết mã từ đống hỗn độn. Nhưng nhờ có Ruby thì bạn chỉ cần goi hai hàm Math.sin và Math.cos. Cần phải đọc một tập tin, phần tích một chuỗi hoặc kết nối vào một hệ thống từ xa? Với bộ thư viện các hàm chuẩn của Ruby thì sẽ không tốn một giọt mồ hôi. Nếu bạn truy cập vào trang tài liệu miễn phí tại địa chỉ http://www.ruby-doc.org bạn có thể khám phá trực tuyến toàn bộ các khả năng của Ruby.

3. Định hướng đối tượng: Từ đối tượng-Object được dùng rất nhiều trong cuốn sách này. Một mặt nó dùng để đề cập một thứ gì đó mà bạn đã dựng trong một dự án SketchUp, chẳng hạn

Page 5: Chuong 1,2 va 3

Chương I SketchUp Scripting by [email protected]

5

như một đoạn thẳng, một đường tròn hoặc một khối lập phương. Mặt khác, đối tượng cũng có thể được dùng để đề cập tới một kiểu cấu trúc dữ liệu cụ thể nào đó. Nếu những điều này khiến bạn bối rối, đừng lo lắng. Tất cả điều bạn cần phải nhớ lúc này đó là định hướng đối tượng là một trong những ưu tiên quan trọng trong việc phát triển phần mềm hiện đại và định hướng đối tượng không chỉ được lập trình hướng tới việc bảo trì, có cấu trúc mã tốt mà còn sử dụng để khiến bạn trở nên khôn ngoan hơn,

Và tất nhiên, nếu bạn đã từng lập trình trong Ruby thì lợi ích lớn nhất của giao tiếp với SketchUp bằng Ruby chính là bạn đã quen thuộc với ngôn ngữ lập trình. Trong trường hợp đó, bạn có thể bỏ qua rất nhiều các phần tài liệu giới thiệu trong cuốn sách này và tôi khuyên bạn nên đi thẳng đến Chương 3 khi bạn có cơ hội.

Nhưng bởi vì mới xuất hiện gần đây, nên kinh nghiệm về Ruby là rất hiếm ngay trong cả số các lập trình viên chuyên nghiệp. Vì vậy, đừng lo lắng nếu bạn chưa bao giờ viết các kịch bản-Script bằng Ruby trước khi đọc cuốn sách này. Vì tôi sẽ cho rằng bạn chưa bao giờ nghe nói về Ruby. Và thực tế, tôi luôn giả định rằng bạn chưa bao giờ viết mã bằng Ruby trước khi trình bày tất cả các vấn đề.

Đây cũng là một thách thức: Tôi muốn cuốn sách này trở nên thân thiện nhất có thể cho những người mới mà không gây quá nhàm chán cho những người đã biết. Phần sau đây giải thích cuốn sách này được trình bày như thế nào để phù hợp với nhu cầu của cả người mới và người đã biết.

1.4 Nội dung trình bày trong cuốn sách. Để giới thiệu đầy đủ về Ruby thì đòi hỏi ít nhất phải mất ba chương, và lúc đầu tiên tôi đã

lên kế hoạch dành ba chương đầu cho mục đích này. Nhưng do ngôn ngữ kịch bản-Scripting cho SketchUp gây rất nhiều hứng thú nên tôi quyết định đặt rải rác các chương về Ruby giữa những chương tập trung về SketchUp. Vì vậy các chương 2,5 và 8 chỉ tập trung vào việc nghiên cứu Ruby. Vì thế nếu bạn là đã là một chuyên gia về Ruby thì có thể bỏ qua các chương này.

Đối với các chương nói cụ thể về SketchUp, tôi đã cố gắng để xắp xếp cách trình bày một cách trực quan, từ đơn giản đến phức tạp và từ bao quát đến cụ thể.

Cuốn sách được chia làm ba phần với sự xắp xếp các chương như sau:

Phần I: Bao gồm các chương từ 2 đến 6, cung cấp một khái niệm cơ bản về Ruby và SketchUp. Sau khi đã hiểu hết các chương này thì bạn có thể tạo ra bất kỳ loại hình dạng nào trong không gian làm việc của SketchUp (Workspace). Và bạn cũng có thiết lập vị trí, scale và sự xuất hiện của các đối tượng mà bạn đã tạo ra.

Phần II: Bao gồm các chương từ 7 đến 9, giải thích làm thế nào để tạo ra và quản lý hệ thống phân cấp, và đính kèm thông tin qua các thuộc tính (attribute), các lựa chọn (option) và sự quan sát. Những khả năng này không cần thiết cho các mô hình đơn giản nhưng nó sẽ trở nên cực kỳ quan trọng nếu mô hình của bạn trở nên phức tạp.

Phần III: Bao gồm các chương từ 10 đến 13, thảo luận các hoạt động tiên tiến khác trong SketchUp mà bạn không thể thực hiện bằng cách sử dụng không gian làm việc truyền thống của SketchUp (work space). Các chương thảo luận về plugin và tất cả các cách thức khác nhau mà bạn có thể thêm cho giao diện sử dụng của SketchUp. Hai chủ đề cuối cùng là thú vị nhất và gắn kết chặt chẽ với tất cả các ý tưởng chủ đề của cuốn sách: Chuyển động-Animation và WebDialog.

Trong suốt cuốn sách này, các ví dụ về kịch bản-Script cho SketchUp sẽ được cung cấp để làm rõ các khái niệm và thể hiện cách thức mà lệnh được sử dụng trong mã hóa. Để tải về các ví dụ về Script, hãy truy cập vào trang web http://www.automaticsketchup.com. Trang web này cũng cung thông tin về lỗi và cập nhật nội dung của cuốn sách.

Page 6: Chuong 1,2 va 3

Chương I SketchUp Scripting by [email protected]

6

1.5 Lời cuối. Với cái nhìn thoáng qua đầu tiên, SketchUp có thể trông giống như ứng dụng vẽ của trẻ em

hơn là một ứng dụng xây dựng mô hình chuyên nghiệp. Nhưng một khi bạn trở nên quen thuộc hơn với SketchUp, bạn có thể sẽ đánh giá cao khả năng mở rộng tuyệt vời của các chức năng và khả năng của nó. Và điều này mới chỉ là phần nổi của tảng băng trôi. Nếu bạn thực sự muốn tạo ra những thứ tốt nhất từ SketchUp thì bạn cần phải biết cách làm thế nào để viết được kịch bản-Script.

Chương mở đầu này đã thảo luận hơi dài dòng về những giá trị của ngôn ngữ kịch bản-Scripting cho SketchUp, nhưng tôi muốn chú trọng một lần nữa vào khía cạnh của niềm vui. Bình thường, tôi không thích lập trình lắm nhưng ngôn ngữ kịch bản cho SkethcUp không giống như các mã hóa thông thường. Khi thực hiện, một kịch bản-Script cho SketchUp có thể ngay lập tức tạo ra các đối tượng, các mô hình, các vật liệu và thậm chí cả chuyển động. Đối với một người không có năng khiếu hội họa vụng về như bản thân tôi, người chỉ có thể vẽ ra những hình người dạng que, thì đó chính là niềm vui tinh khiết.

Kịch bản-Script cho SketchUp dựa trên ngôn ngữ lập trình Ruby, và trong các chương tiếp theo, tôi sẽ làm hết sức mình để giải thích của Ruby ở mức độ đủ phù hợp với khả năng tiếp nhận của SketchUp. Nếu bạn muốn biết thêm thông tin về Ruby, tôi khuyên bạn nên truy cập vào trang web http://www.ruby-doc.org và cuốn sách trực tuyến miễn phí Programming Ruby: The Pragmatic Programmer’s Guide Ruby tại địa chỉ http://www.rubycentral.com/book/. Để được hỗ trợ thêm về Script cho SketchUp, bạn không thể có lựa chọn nào tốt hơn ngoài hai trang web http://www.sketchucation.com và https://groups.google.com/d/forum/google-sketchup-developers.

Page 7: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

7

Bài học thứ nhất về Ruby:

Cấu trúc dữ liệu

Page 8: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

8

Để giao tiếp được với SketchUp bằng mã hóa, bạn cần phải biết cách sử dụng ngôn ngữ của nó là Ruby. Mục tiêu của chương này là trình bày vừa đủ các kiến thức cơ bản về lập trình Ruby để giúp bạn cảm thấy thoải mái với ngôn ngữ và cấu trúc dữ liệu cơ bản của nó. Trình bày bắt đầu với việc giới thiệu về các con số, chuỗi, khai báo biến, hằng và mảng.

Tại mỗi bước đều có rất nhiều ví dụ được cung cấp để bạn có thể nhập và thực hiện các lệnh trên SketchUp. Tôi khuyên bạn không nên chỉ thực hành theo những ví dụ mà chúng tôi cung cấp mà nên thử nghiệm với tất cả các lệnh khác nhau, điều này sẽ nâng cao sự hiểu biết của bạn về ngôn ngữ lập trình Ruby và cũng làm cho bạn cảm thấy thoải mái với toàn thể môi trường mã hóa.

Phần cuối cùng của chương sẽ quan tâm tới lập trình định hướng đối tượng trong Ruby, và giới thiệu về đối tượng (Object), lớp (Class) và phương thức (Method). Một khi các vấn đề đã được sáng tỏ thì bạn đã sẵn sàng cho Chương 3, được xây dựng trên nền tảng Chương 2 để trình diễn các mô hình cơ bản của SketchUp. Đó mới thực sự là lúc mà niềm vui bắt đầu nhưng chúng ta không nên “chưa học bò đã lo học chạy”, hãy tập trung vào chương này đã.

2.1 Hộp thoại Ruby Console. Nếu bạn chưa sẵn sàng thì hãy bật phần mềm SketchUp, chọn mục của Ruby Console

trong trình đơn Window trên menu chính. Khi đó một hộp thoại có tên là Ruby Console sẽ xuất hiện, đây chính là nơi mà bạn có thể nhập và thực hiện từng dòng lệnh một. Chương sau sẽ giải thích cách để tạo ra các kịch bản-Script để lưu trữ nhiều câu lệnh Ruby, còn bây giờ chúng ta sẽ tìm hiểu các lệnh Ruby riêng lẻ.

Giao diện hộp thoại Ruby Console rất đơn giản khi sử dụng: nhập dòng lệnh vào hộp nhập ở phía dưới cùng của hộp thoại và nhấn phím Enter. Kết quả sẽ được hiển thị ngay ở phần trên cùng của hộp thoại. Để xem nó hoạt động như thế nào, hãy nhập dòng lệnh sau :

2 + 2

Bây giờ hãy nhấn phím Enter. Khi đó hộp thoại Ruby Console sẽ hiển thị dòng lệnh và kết

quả của nó.

Page 9: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

9

2 + 2 là một dòng lệnh Ruby hợp lệ, và nó tương tự như một biểu thức toán học. Biểu thức toán học là một cách đơn giản nhất để bắt đầu tìm hiểu về Ruby, và phần tiếp theo đây sẽ giải thích chi tiết hơn.

2.2 Số và biểu thức toán học. Khi bạn tạo mô hình trong SketchUp bằng Ruby, một trong những công việc thường xuyên

nhất đòi hỏi phải định rõ các điểm để phân biệt đoạn thẳng và bề mặt. Mỗi điểm được cấu tạo bởi ba tọa độ (x,y,z), vì vậy phải hiểu được cách thức mà Ruby sử dụng các số là điều quan trọng cơ bản nhất. Và phần này sẽ bàn về các định dạng số, phép toán, và thứ tự thực hiện của các phép toán. 2.2.1 Số nguyên và số thập phân:

Trong cuốn sách này, chúng ta sẽ quan tâm tới hai loại số là: số nguyên (Integer) và số thập phân (Floating-Point). Một số nguyên đại diện cho một số và không có dấu thập phân. Một ký hiệu dấu cộng “+” ở đàng trước số chỉ ra rằng số đó là số nguyên dương và một ký hiệu dấu trừ “–” chỉ ra rằng số đó là số nguyên âm, nếu không có ký hiệu nào trước số thì số đó được coi là số số nguyên dương.

Đối với những số có giá trị lớn thì thường được sử dụng các dấu ( như dấu phẩy “,”) để ngăn cách giữa các hàng trăm, hàng nghìn, hàng triệu… Ngoài ra Ruby còn cho phép bạn sử dụng dấu gạch dưới “_” để ngăn cách. Ví dụ, với số 1,000,000 có thể được thể hiện là 1000000 hoặc 1_000_000. Để kiểm tra điều này, hãy nhập dòng lệnh sau đây:

5_000 / 4

Kết quả là 1250 cũng giống như khi bạn nhập 5000 / 4

Số thập phân là số có sử dụng dấu thập phân “.” để ngăn cách phần nguyên và phần thập phân của nó. Trong Ruby, mỗi số thập phân bắt buộc phải có it nhất một số ở đằng trước và một số ở đằng sau dấu thập phân. Có nghĩa là bạn có thể thể hiện là ½ tương đương 0.5 hoặc 0.500 nhưng không bao giờ là .5

Một số thập phân cũng có thể thêm dấu “+” hoặc “-“ ở đằng trước để được hiểu là số thập phân dương hoặc âm. Và chữ e được viết ở đằng sau khi số quá lớn. Các số thập phân sau đây được coi là hợp lệ: -25.4 ; 1.4959e11 ; 123_456.789_012 và 3,14159 .

Ruby cũng cung cấp nhiều kiểu số học khác , bao gồm cả số phức và số hữu tỷ. Nhưng đối với các mục đích của cuốn sách này thì bạn sẽ chỉ cần biết số nguyên và số thập phân là đủ.

2.2.2 Phép toán: Ruby cũng nhận dạng tất cả các phép toán thông dụng khi sử dụng trong C hoặc ngôn ngữ

lập trình khác, đó là: +, -, * và /. Ngoài ra còn thêm phép toán số mũ và số dư.

Phép toán Ý nghĩa Ví dụ với số nguyên Ví dụ với số thập phân

+ Cộng 4 + 5 = 9 4.0 + 5.0 = 9.0

- Trừ 12 – 4 = 8 12.0 – 4.0 = 8.0

* Nhân 7 * 3 = 21 7.0 * 3.0 = 21.0

/ Chia 20 / 8 = 2 20.0 / 8.0 = 2.5

% Dư 20 % 8 = 4 20.0 % 8.0 = 4.0

** Mũ 3 ** 2 = 9 3.0 ** 2.0 = 9.0

Page 10: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

10

Điều quan trọng là phải biết rằng loại của kết quả tạo ra (là số nguyên hay số thập phân) được quyết định bởi các số đầu vào, và số đầu vào được gọi là “toán hạng”. Nếu lấy một số nguyên trừ đi một số nguyên khác thì kết quả sẽ luôn luôn là một số nguyên , và cũng có kết quả tương tự đối với các phép toán cộng, nhân và chia .

Nếu một toán hạng là một số nguyên và một toán hạng khác là một số thập phân thì kết quả của phép tính sẽ luôn luôn là một số thập phân. Điều này được thể hiện trong các ví dụ sau đây :

90 – 82 trả về 8

90.0 - 82 trả về 8.0

3 * 4 trả về 12

3 * 4.0 trả về 12.0

4 / 3 trả về 1

4 / 3.0 trả về 1.33333333333333

3 / 4 trả về 0

3 / 4.0 trả về 0.75

Bốn phép tính cuối cùng trong ví dụ trên thể hiện việc sử dụng phép toán chia và kết quả của chúng có lẽ không được rõ ràng tường minh như các phép tính trước. Nếu một trong các toán hạng là số thập phân thì kết quả của phép toán chia là thường là số thập phân. Nhưng nếu cả hai toán hạng đều là số nguyên, chẳng hạn như 4 /3 thì chỉ có kết quả là phần số nguyên đằng trước dấu thân phân được trả về còn phần thập phân đằng sau bị bỏ đi.

Để có được số dư còn lại của phép toán chia hai số nguyên, bạn cần phải sử dụng phép toán % (Dư). Cách tốt nhất để hiểu được điều này là sử dụng ví dụ. Nếu lấy 17 chia cho 5 thì kết quả là 3 và phần dư còn lại là 2. Trong Ruby, thì điều này được hiểu như sau 17/5 = 3 và 17% 5 = 2. Nếu là một phép chia hết thì kết quả phép toán dư luôn luôn là số không 0.

16 / 8 trả về 2

16 / 8 .0 trả về 2.0

16 % 8 trả về 0

Phép toán cuối cùng ** thể hiện phép tính lũy thừa, a ** n được tính toán tương tự như

an = a * a … * a. n

Trong đó: n là số nguyên dương và n được gọi là số mũ.

Ví dụ: 2 ** 3 trả về 8 vì 23 = 8.

Số mũ (n) cũng có thể không phải là một số nguyên và bạn có thể tính toán căn bậc 2 bằng cách thiết lập nó là ½ hoặc tính căn bậc 3 bằng cách thiết lập là ⅓. Điều đó có nghĩa là nếu số mũ là số nguyên thì đó là tính lũy thừa, còn nếu số mũ là phân số thì đó là tính khai căn. Lưu ý số mũ 1/2 phải nhập là 1/2.0 và 1/3 phải nhập là 1/3.0 nếu không số mũ sẽ bằng 0 vì đây là phép chia giữa hai số nguyên.

Tương tự như vậy nếu số mũ là số âm thì kết quả sẽ trả về là giá trị nghịch đảo của phép toán lũy thừa, nghĩa là a ** -n = 1/(an). Ví dụ 2.0**-3=1/(2.0**3)=1/8.

Các ví dụ sau đây thể hiện việc sử dụng phép toán mũ **:

4 ** 2 trả về 16

Page 11: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

11

4 ** -2 trả về 0.0625

4 ** 0.5 trả về 2.0

4 ** 0 trả về 1

4 ** (1/2) trả về 1 (Số mũ cho kết quả= 0, phép chia giữa hai số nguyên)

2.2.3 Thứ tự thực hiện của các phép toán: Nếu một dòng lệnh của Ruby có chứa khá nhiều phép toán, thì thứ tự thực hiện của các

phép toán này không nhất thiết phải được thực hiện từ trái sang phải. Các quy tắc sau đây sẽ được áp dụng theo trình tự ưu tiên từ trên xuống dưới:

1. Thực hiện tất cả các phép toán nằm trong ngoặc đơn từ trái sang phải. 2. Thực hiện tất cả phép toán mũ từ trái sang phải.

3. Thực hiện tất cả phép toán nhân rồi chia từ trái sang phải. 4. Thực hiện tất cả phép toán cộng rồi trừ từ trái qua phải.

Ví dụ, hãy nhìn dòng lệnh sau đây:

1 + 3 * (6 – 4) ** 3 / (1 + 3)

Đầu tiên Ruby sẽ tính toán các phép tính nằm trong ngoặc đơn: ( 6-4 = 2) và ( 1+3=4). Tiếp theo, nó sẽ thực hiện phép toán mũ (23 = 8), và dòng lệnh sẽ đơn giản hoá thành:

1 + 3 * 8 / 4

Cuối cùng, Ruby thực hiện phép toán nhân (3 * 8 = 24) và phép toán chia (24 /4 = 6). Câu trả lời cuối cùng được tính toán là 1+ 6 = 7 .

2.2.4 Các hàm chuyển đổi đơn vị trong SketchUp:

Trước khi chúng ta tạm biệt chủ đề về các con số và phép toán, còn một điều quan trọng cần là phải đề cập tới là các hàm chuyển đổi đơn vị đo do SketchUp cung cấp.

Hàm Ý nghĩa Ví dụ

cm Chuyển đổi từ cm sang inch 2.54.cm = 1

degrees Chuyển đổi từ độ sang radian 180.degrees = 3.14159265358979

feet Chuyển đổi từ feet sang inch 1.feet = 12.0

inch Chuyển đổi từ inch sang chiều dài --

km Chuyển đổi từ km sang inch 1.km = 39370.0787401575

m Chuyển đổi từ mét sang inch 1.m = 39.3700787401575

mile Chuyển đổi từ dặm-mile sang inch 1.mile = 63360.0

mm Chuyển đổi từ mm sang inch 1.mm = 0.0393700787401575

radians Chuyển đổi từ radian sang độ 3.14159265358979.radians = 180

to_cm Chuyển đổi từ inch sang cm 0.393700787401575.to_cm = 1

to_feet Chuyển đổi inche sang feet 12.to_feet = 1.0

to_inch Chuyển đổi từ chiều dài sang inch --

to_km Chuyển đổi từ inch sang km 39370.0787401575.to_km = 1

Page 12: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

12

to_l Chuyển đổi từ inch sang chiều dài --

to_m Chuyển đổi từ inch sang mét 39.3700787401575.to_m = 1

to_mile Chuyển đổi từ inch sang dặm-mile 63360.to_mile = 1.0

to_mm Chuyển đổi từ inch sang mm 0.0393700787401575.to_mm = 1

to_yard Chuyển đổi từ inch sang yard 36.to_yard = 1.0

yard Chuyển đổi từ yard sang inch 1.yard = 36.0

Hầu như các giá trị chiều dài trong SketchUp được tính bằng đơn vị inch, thậm chí ngay cả khi bạn chọn một mẫu Template với đơn vị sử dụng là hệ mét-Meter. Vì thế mà hầu hết các hàm chuyển đổi trong bảng trên đều là chuyển đổi từ đơn vị inch sang đơn vị khác và từ đơn vị khác sang inch. Để sử dụng các hàm này thì bạn cần phải đặt một dấu chấm “.” ở đằng sau giá trị cần chuyển đổi rồi đến tên hàm như các ví dụ ở trong cột thứ 3. Ví dụ, hãy nhập một dòng lệnh để chuyển đổi chiều dài từ 72 inch sang mét.

72.to_m

Kết quả sẽ là 1.8288 bời vì 1.8288 mét có chiều dài tương đương với 72 inch.

Cuốn sách này thường không chỉ rõ các đơn vị đo kích thước dài hoặc góc trong các ví dụ, nhưng có một điểm quan trọng cần lưu ý. Đa số các hàm sử dụng trong SketchUp thường hay yêu cầu nhập giá trị đo góc với đơn vị là Radian chứ không phải độ. Nhưng do sử dụng với số nguyên thì các ví dụ sẽ đơn giản hơn nên cuốn sách này sẽ bắt đầu với đơn vị đo góc là độ và sau đó sẽ chuyển đổi nó sang radian. Ví dụ, để chuyển đổi từ 30 ° sang radian, bạn sử dụng lệnh sau:

30.degrees

2.3 Chuỗi-String. Mã hóa với các số rất quan trọng, nhưng có rất nhiều trường hợp bạn sẽ cần phải làm việc

với chuỗi văn bản. Các lệnh về chuỗi văn bản trở nên cần thiết khi bạn đọc các ký tự từ một tập tin, xác định nhãn trong SketchUp, hoặc thêm các chú thích cho một công cụ SketchUp mới. Trong kịch bản Script của mình, tôi thường xuyên sử dụng các lệnh về chuỗi văn bản để hiển thị các thông báo trong quá trình thực thi một kịch bản trong SketchUp.

Trong nhiều ngôn ngữ lập trình, các ký tự độc lập đơn lẻ được xem xét rất khác biệt so với tập hợp nhiều ký tự. Ví dụ, trong Java, “a” được coi là một ký tự và " abcd " là một chuỗi. Ruby thì không có sự khác biệt này: cả "a" và " abcd " đều được coi là chuỗi. Một chuỗi có chứa đựng một hoặc nhiều ký tự, bao gồm chữ cái, số , dấu chấm câu và các ký tự đặc biệt .

Trong Ruby, một chuỗi có thể được đặt nằm trong ngoặc đơn (‘’) hoặc dấu ngoặc kép (“”). Ví dụ bạn đặt thêm lệnh \\t để tạo ra một khoảng trống giữa hai chuỗi trong dòng hoặc \\n để đẩy chuỗi sau xuống một dòng mới vào bên trong nhóm chuỗi đó. Nếu các chuỗi được đặt trong dấu ngoặc kép thì trong quá trình thực thi Ruby sẽ nhận ra có lệnh bên trong chuỗi và hiển thị chúng cho phù hợp với lệnh được đặt ra. Nếu các chuỗi đó đặt trong dấu ngoặc đơn thì Ruby sẽ bỏ qua lệnh bên trong. Vì vậy nếu bạn nhập dòng lệnh là “ Line1\\nLine2 ” thì kết quả thu được là Line1 và Line2, và chúng sẽ được in trên hai dòng. Tuy nhiên nếu dòng lệnh là ‘Line1\\nLine2’ thì kết quả thu được là Line1\\nLine2 in trên một dòng.

2.3.1 Các phép toán cơ bản cho chuỗi. Ruby cung cấp một số phép toán để thao tác chuỗi khi mã hóa. Hai trong số chúng được

sử dụng thông dụng nhất là cộng “+” và nhân “*” , và vai trò của chúng cũng rất dễ hiểu.

Page 13: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

13

Phép toán cộng “+” dùng để nối các chuỗi lại với nhau giống như trong dòng lệnh sau đây:

"Hello," + " world"

Hello, world

Phép toán nhân “ *” dùng để lặp lại một chuỗi với số lần nhất định giống như trong dòng lệnh sau đây:

"Hello!" * 3

Hello!Hello!Hello!

2.3.2 Chuỗi con-Substring. Một trong những công việc cũng thường xuyên thực hiện là truy xuất vào các ký tự trong

một chuỗi theo vị trí của chúng. Vị trí của một ký tự trong một chuỗi được gọi là chỉ mục–Index của nó. Trong một chuỗi, chỉ mục-Index là các trị số nằm trong khoẳng từ số 0 đến số bằng độ dài (tính theo ký tự) của chuỗi đó trừ đi 1. Ví dụ chuỗi Hello thì Index nằm trong khoẳng từ 0 đến 4 ( do chuỗi đó có độ dài bằng 5).

Một tập hợp bao gồm một số các ký tự liền kề trong một chuỗi-String được gọi là một chuỗi con-Substring, và bạn có thể truy xuất ra một chuỗi con từ một chuỗi bằng cách xác định phạm vi-Range cho các trị số Index của các ký tự. Một phạm vi-Range sẽ đại diện cho một dải các giá trị và có thể được xác định theo một trong hai cách sau:

Cách thứ nhất, phạm vi-Range được xác định bởi start..end (bắt đầu .. kết thúc), và đại diện cho dải các giá trị từ đầu đến cuối, bao gồm cả số cuối.

Cách thứ hai, phạm vi-Range được xác định bởi start...end (bắt đầu ... kết thúc), và đại diện cho dải các giá trị từ đầu đến cuối, nhưng không bao gồm cả số cuối.

Các ví dụ sau đây cho thấy rõ điều này :

0..4 đại diện cho dải giá trị [0, 1, 2, 3]

0...4 đại diện cho dải giá trị [0, 1, 2, 3, 4]

-5...-3 đại diện cho dải giá trị [–5, –4, –3]

'a'..'e' đại diện cho dải giá trị ['a', 'b', 'c', 'd']

'a'...'e' đại diện cho dải giá trị ['a', 'b', 'c', 'd', 'e']

Để có được một chuỗi con từ một chuỗi hãy đặt Range với các trị số Index mong muốn ở trong ngoặc vuông và đứng ở ngay đằng sau chuỗi đó. Hãy thử các lệnh sau trong hộp thoại Ruby Console:

"HelloWorld"[0..2]

Hel

"HelloWorld"[0...2]

He

"HelloWorld"[1..4]

ello

"HelloWorld"[1...4]

Page 14: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

14

ell

Nếu trị số của Index là số dương thì vị trí của các ký tự được xác định từ phía bên trái chuỗi. Còn nếu trị số của Index là số ấm thì vị trí của các ký tự được xác định từ phía bên phải chuỗi. Giống như trong hình dưới đây:

Các lệnh sau đây giải thích cách thức sử dụng trị số Index âm để tạo ra được chuỗi con : "HelloWorld"[-10..-6]

Hello

"HelloWorld"[-3...-1]

rl

Ngoài việc sử dụng phạm vi-Range để lấy ra một chuỗi con như trên, bạn cũng có thể có có được một chuỗi con bằng cách sử dụng trị số Index của ký tự đầu tiên và chiều dài (length) của chuỗi con cần lấy. Định dạng sử dụng là [ Index , length ] và các ví dụ sau đây cho thấy cách thức này được sử dụng để tạo ra chuỗi con :

"HelloWorld"[3, 4]

loWo

"HelloWorld"[0, 5]

Hello

"HelloWorld"[-5, 5]

World

2.3.3 Các hàm cấp cao cho chuỗi. Ngoài các cách thức tác động đến đến các chuỗi đã được trình bày ở trên, bây giờ bạn có

thể truy suất ra nhiều thứ khác nữa bằng cách thêm một dấu chấm “.” và tên của của một hàm vào ngay đằng sau chuỗi. Ví dụ, length và size là hai hàm trả về số lượng ký tự có trong một chuỗi.

Các ví dụ sau đây cho thấy cách thức hoạt động của hai hàm này: "HelloWorld".length

10

"HelloWorld".size

10

Và bảng sau đây thể hiện các hàm cấp cao dành cho chuỗi.

Page 15: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

15

Hàm Ý nghĩa Ví dụ

downcase Chuyển chuỗi thành chữ thường "Hello".downcase "hello"

hex Chuyển đổi một hexadecimal ( hệ thập lục phân) sang dạng số "0x42".hex 66

include? Kiểm tra xem chuỗi có chứa các ký tự đưa ra không (trả về true hoặc false) "hello".include? "ell" true

index Trả về vị trí (Index) xuất hiện đầu tiên trong chuỗi của ký tự đưa ra (tính từ bên trái sang).

"Hello".index("l") 2 (l là chữ L)

length Trả về số lượng các ký tự có trong chuỗi (bao gồm cả khoảng trống giữa các chuỗi) "Hello".length 5

lstrip Xóa bỏ các khoảng trống (space) ở đầu chuỗi. " Hello ".lstrip "Hello "

replace Thay thế một chuỗi bằng một chuỗi khác "Hello!".replace("Hola!") "Hola!"

reverse Đảo ngược vị trí các ký tự trong chuỗi "Hello".reverse "olleH"

rindex Trả về vị trí (Index) xuất hiện sau cùng trong chuỗi của ký tự đưa ra (tính từ bên trái sang)

"Hello".rindex("l") 3 (l là chữ L)

size Trả về số lượng các ký tự có trong chuỗi (bao gồm cả khoảng trống giữa các chuỗi) "Hello".size 5

split Chia tách chuỗi thành các chuỗi con theo ký tự đưa ra và trả về một mảng chứa các chuỗi con đó.

"Hello,world,again".split(",") ["Hello","world","again"]

strip Xóa bỏ các khoảng trống (space) ở đầu và cuối của chuỗi. " Hello ".strip "Hello"

to_f Chuyển đổi một chuỗi thành một số thập phân và trả về số thập phân "-1.3e10".to_f -13000000000.0

to_i Chuyển một chuỗi thành số và trả về một số số học "2000".to_i 2000

tr Thay thế các ký tự trong chuỗi thành các ký tự đưa ra theo thứ tự "Hello".tr("le","ma") "Hammo"

upcase Chuyển chuỗi thành chữ in hoa "Hello".upcase "HELLO"

Lưu ý:

- Hàm to_f là để chuyển đổi một số nào đó được thể hiện ở dạng chuỗi thành một số thập phân.

- Hàm to_i là để chuyển đổi một số nào đó được thể hiện ở dạng chuỗi thành một số số học. Và dùng số này để tính toán bằng các phép toán.

- Trong ví dụ hàm tr thì là tất cả các chữ “l” trong chuỗi sẽ bị thay thế bằng chữ “m” và chữ “e” sẽ được thay thế bằng chữ “a”. 2.3.4 In (hiển thị) chuỗi.

Ruby cung cấp ba lệnh để hiển thị chuỗi trong giao diện giao tiếp với người dùng, đó là: puts , print và printf. Trong cuốn sách này, các Script ví dụ chủ yếu dựa vào lệnh puts , lệnh này tạo ra một dòng mới sau khi hiển thị chuỗi. Ví dụ sau đây cho thấy cách mà lệnh puts được sử dụng :

Page 16: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

16

puts "Number of characters in Hello: " + "Hello".length.to_s

Number of characters in Hello: 5

Hàm to_s dùng để chuyển một số là kết quả của hàm "Hello".length thành một chuỗi để bạn có thể cộng chuỗi với nhau. Ruby không thường xuyên chuyển đổi một số số học thành một chuỗi nên chúng ta phải dùng hàm này để chuyển đổi.

Lệnh print hoạt động tương tự như lệnh puts, nhưng không tạo ra một dòng mới sau khi hiển thị chuỗi. Lệnh printf hoạt động như lệnh print, nhưng cho phép bạn định dạng chuỗi bằng cách sử dụng các ký tự định dạng đặc biệt. Định dạng trong lệnh printf là một chủ đề phức tạp, và tôi sẽ không thảo luận chuyên sâu về nó. Nhưng với các ví dụ sau đây sẽ cung cấp cho bạn một ý tưởng về cách thức nó được sử dụng như thế nào: printf "The length of %s is %d\n", "Hello", "Hello".length

The length of Hello is 5

printf "The last index of b in bubble is %d\n", "bubble".rindex("b")

The last index of b in bubble is 3

Lệnh printf của Ruby cũng hoạt động giống hệt như lệnh printf thường dùng trong ngôn ngữ C. Chỉ cần tìm kiếm lệnh này trên Internet thì bạn sẽ có tất cả các thông tin về định dạng và cú pháp cho lệnh này.

2.4 Biến-Variable và hằng số-Constant. Chúng ta đã quan tâm hơi nhiều tới các số cơ bản và chuỗi, nhưng trong thực tế thì chúng

ta thường gán tên cho dữ liệu và các tên đó sẽ được sử dụng thay vì là các dữ liệu thô. Trong Ruby, dữ liệu được đặt tên có hai loại là: biến và hằng. Phần này sẽ giải thích chúng được sử dụng như thế nào và sự khác biệt giữa chúng.

2.4.1 Biến. Trong kịch bản Script cho SketchUp, làm việc với tên sẽ thuận tiện so với việc sử dụng số.

Ví dụ, nếu bạn muốn thay đổi chiều cao của một cánh cửa từ 86 inch đến 94 inch nhưng trong kịch bản của bạn có rất nhiều dòng lệnh liên quan đến chiều cao của cửa là số “86” và bạn sẽ rất mất công để thay đổi các số liên quan đến chiều cao từ 86 thành 94. Mọi việc sẽ trở nên dễ dàng hơn nếu bạn sử dụng một tên như door_height thay vì sử dụng một số để thể hiện chiều cao. Bây giờ bạn có thể thay đổi giá trị chiều cao một cách dễ dàng, đó là thiết lập door_height thành 94 bằng một dòng lệnh và giá trị chiều cao này sẽ được sử dụng cho mọi dòng lệnh trước đó và sau này. Và cái tên door_height được gọi là biến.

Chúng ta hãy xem cách thức làm việc này trong SketchUp. Trong hộp thoại Ruby Console, gán giá trị cho biến x bằng là 2 bởi dòng lệnh sau đây:

x = 2

Ngay sau khi bạn nhấn phím Enter, SketchUp sẽ dành riêng một phần của bộ nhớ để nhớ biến x và đặt giá trị 2 của nó ở trong bộ nhớ cấp phát. Bây giờ bạn có thể sử dụng biến này như thể nó là một số học bình thường. Ví dụ với các dòng lệnh:

x + 5 Trả về 7

x * 2 Trả về 4

x ** 3 Trả về 8

Page 17: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

17

Trong các dòng lệnh này, biến x vẫn giữ nguyên giá trị của nó sau mỗi lệnh. Để thay đổi giá trị của một biến, bạn có thể thực hiện các lệnh như sau:

x = x + 1

x = x – 3

x = x * 7

x = x / 9

Bạn có thể thực hiện các lệnh Ryby tắt sau cũng mang lại kết quả tương tự như các lệnh trên:

x += 1

x -= 3

x *= 7

x /= 9

Tất các số được dùng trong các ví dụ trên đều là số nguyên, nhưng nếu thích bạn có thể thiết lập biến x là một số thập phân hoặc một chuỗi. Ví dụ, các dòng lệnh sau đây tạo ra một biến được gán giá trị là chuỗi "Hello" và sử dụng phép toán cộng “+” chuỗi để nối thêm một chuỗi khác:

str = "Hello"

Hello

str += ", world!"

Hello, world!

Tên của biến x và door_height đã chia sẻ một đặc điểm quan trọng : cả hai đều bắt đầu với một chữ cái in thường. Trong Ruby, một biến có thể bắt đầu với dấu gạch dưới (ví dụ _x) hoặc bất kỳ chữ cái in thường nào đó. Nếu dữ liệu được gán cho một cái tên bắt đầu với một chữ cái in hoa thì trong quá trình biên dịch Ruby sẽ coi nó như là một hằng số- sẽ được giải thích ở phần tiếp theo.

2.4.2 Hằng số. Có rất nhiều trường hợp mà bạn sẽ phải làm việc với các giá trị mà chúng không cần phải

thay đổi. Ví dụ, số pi sẽ luôn luôn bằng khoảng 3.14159 và 2,54 cm luôn luôn tương đương với 1 inch. Trong những trường hợp này, sử dụng một biến không phải là một ý tưởng hay vì giá trị của nó có thể được thay đổi trong quá trình thực thi của kịch bản Script.

Vì lý do này, Ruby đã cung cấp hằng số-constant , hoạt động giống như các biến và có thể được gán cho cùng kiểu giá trị giống biến. Nhưng nếu một hằng số được gán giá trị thì Ruby sẽ tạo ra một cảnh báo cho bạn biết rằng giá trị của nó đã được thay đổi. Để xem cách nó thực hiện, bạn cần nhập hai lệnh sau trong hộp thoại Ruby Console :

X = 8

X += 2

Ngay sau khi câu lệnh được thực thi, hình dưới đây sẽ thể hiện thông điệp kết quả trong hộp thoại Ruby console:

"already initialized constant X".

Page 18: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

18

Mặc dù có cảnh báo, nhưng lệnh thứ hai vẫn thay đổi giá trị của X từ 8 sang10, và bạn

có thể xác minh lại điều này với các lệnh tương tự.

Nếu bạn lặp lại các lệnh ở ví dụ trên với x thay vì là X , thì sẽ không có cảnh báo sẽ xuất hiện. Điều này là do Ruby sử dụng các chữ cái đầu tiên của cấu trúc dữ liệu để phân biệt hằng số từ biến. Nếu chữ cái đầu tiên là chữ cái in hoa , Ruby xử lý nó như một hằng số. Nếu trường hợp là chữ cái in thường, Ruby coi nó là một biến.

2.5 Mảng-Array. Tất cả các đối tượng điểm, đường thẳng, và hình học trong một dự án SketchUp đều

được xác định vị trí bởi tọa độ x, y và z của chúng. Để quản lý các tọa độ của chúng thì việc đặt chúng trong một tập hợp gọi là mảng-Array sẽ đễ dàng hơn là quản lý riêng lẻ từng cái một. Một mảng là một cấu trúc dữ liệu có chứa một chuỗi các giá trị có trật tự được gọi là các phần tử-element. Mảng cũng tương tự như chuỗi mà chúng ta nhìn thấy trước đó nhưng chuỗi chỉ bao gồm các ký tự. Còn mảng thì có thể chứa đựng tất cả mọi thứ, đó là số, chuỗi, các biến, các hằng số và thậm chí các mảng khác.

Cũng như chuỗi được đặt trong dấu ngoặc đơn hoặc dấu ngoặc kép, mảng cũng được đặt trong dấu ngoặc vuông.Ví dụ, lệnh sau đây tạo ra một mảng có bảy phần tử:

arr = [1, 2, "ab", 4.0, 'Hello', 6.0, [1, 2, 3]]

Điều đó có nghĩa là tạo ra một mảng gọi là arr có 4 phần từ số 1,2, 4.0, 6.0 và 2 phần tử chuỗi “ab”, ‘Hello’ và 01 phần tử mảng [1, 2, 3].

2.5.1 Truy xuất các phần tử trong mảng

Mỗi phần tử sẽ được truy xuất theo vị trí của nó ở trong mảng, vị trí trí bắt đầu là 0 ứng với phần tử ngoài cùng bên trái. Vị trí của một phân tử trong mảng được gọi là chỉ số-Index của nó. Lệnh sau dùng truy xuất một phần tử trong mảng arr có Index là 2 :

x = arr[2]

ab

Lệnh sau đây dùng để thay thế một phần tử trong mảng có Index là 3 bằng một phần tử khác.

arr[3] = 12

[1, 2, "ab", 12, "Hello", 6.0, [1, 2, 3]]

( Sử dụng dòng lệnh arr để xem lại các phần tử trong mảng arr)

Chỉ số Index của các phần tử mảng cũng tuân theo các quy tắc tương tự như chỉ số của các ký tự trong chuỗi. Index là 0 đại diện cho phần tử đầu tiên, Index là 1 đại diện cho phần tử thứ hai, và Index là 3 đại diện cho phần tử thứ ba... Nếu giá trị của Index là âm thì sẽ truy xuất

Page 19: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

19

bắt đầu từ cuối mảng ( phần tử ngoài cùng ở bên phải). Có nghĩa là, Index là -1 sẽ trả về phần tử cuối cùng của mảng, -2 trả về phần tử thứ hai tính từ phía cuối cùng của mảng.

Cũng như chuỗi, bạn cũng có thể truy xuất nhiều phần tử trong mảng bằng cách xác định một phạm vi-Range cho các chỉ số-Index. Điều này có thể được thực hiện bằng cách đặt hai hoặc ba dấu chấm ở giữa các giá trị Index bắt đầu (start) và kết thúc (end). Kết quả trả về ở đây cũng có thể được gọi là mảng con Subarray. Các dòng lệnh ví dụ sau đây sẽ truy cập nhiều phần tử trong mảng arr (ở ví dụ đầu tiên):

arr[2..5]

["ab", 4.0, "Hello", 6.0]

arr[0...3]

[1, 2, "ab"]

arr[-6..-4]

[2, "ab", 4.0]

Ngoài ra, bạn có thể thiết lập một phạm vi-Range bao gồm một giá trị Index bắt đầu (start) và một số xác định số lượng (length) các phần tử sẽ xuất hiện ở trong mảng con. Lệnh sau đây tạo thành một mảng con với bốn phần tử và giá trị Index trong mảng ban đầu là 2:

arr[2, 4]

["ab", 4.0, "Hello", 6.0]

Hoặc bạn cũng có thể dùng lệnh x= arr[2, 4] để tạo ra mảng con x gồm 4 phần từ

"ab", 4.0, "Hello" và 6.0 từ mảng arr ban đầu.

Chú ý đến sự khác biệt giữa [ 2 .. 4 ] và [ 2, 4 ]. Ghi nhớ điều này nếu bạn gặp bất kỳ lỗi nào liên quan phạm vi-Range.

2.5.2 Các phép toán mảng Ruby cũng cung cấp một số phép toán khác nhau để thao tác với mảng, và nhiều trong số

đó hoạt động tương tự như thao tác đối với chuỗi đã được trình bày trước đó .

Phép toán Ý nghĩa Ví dụ

+ Tổ hợp hai mảng thành một mảng lớn hơn.

[6, 7] + ["aa", "bb", "cc"] [6, 7, "aa", "bb", "cc"]

- Tạo ra mảng mới từ mảng ban đầu bằng cách xóa bỏ đi các phần tử có trong mảng thứ hai

[1, 2, 3, 4] – [1, 2] [3, 4]

* Tạo ra mảng mới bằng cách lập lại các phần tử có trong mảng

["a", "b"] * 3 ["a", "b", "a", "b", "a", "b"]

<< Thêm một phần tử vào cuối mảng ["x", "y", 12] << 13 ["x", "y", 12, 13]

| Chỉ tổ hợp các phần tử không giống nhau của hai mảng thành một mảng

[1, 2, 3] | [2, 3, 4] [1, 2, 3, 4]

& Chỉ tổ hợp các phần tử giống nhau của hai mảng thành một mảng

[1, 2, 3] & [2, 3, 4] [2, 3]

Page 20: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

20

Phép toán thứ ba * đặc biệt rất hữu ích khi bạn muốn khởi tạo một phần tử mảng có nhiều phần tử giống nhau. Ví dụ lệnh sau đâu sẽ tạo ra mảng zero_array có mười hai phần tử là số 0.

zero_array = [0] * 12

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Phép toán << dùng biết thêm một phần tử vào cuối của một mảng. Nếu thêm vào một mảng khác thì mảng đó đó sẽ trở thành một phần tử độc lập của mảng đầu tiên như các phần tử khác. Ví dụ, với lệnh [1, 2, 3] << [4, 5, 6]

Trả về [1, 2, 3, [4, 5, 6]], thay vì [1, 2, 3, 4, 5, 6]. Nếu bạn muốn thêm các phần tử của mảng thứ hai thành các phần tử của mảng thứ nhất thì sử dụng hàm concat sẽ được trình bày ở dưới đây.

2.5.3 Các hàm về mảng

Hàm Ý nghĩa Ví dụ

new Tạo ra một mảng mới num_list = Array.new(30)

length Trả về số lượng các phần tử của một mảng [1, 2, 3, 4].length 4

index Trả về vị trí-Index trong mảng của phần tử được đưa ra [1, 2, 3].index(1) 0

concat Nối hai mảng [1, 2, 3].concat([4, 5])

[1, 2, 3, 4, 5]

delete_at Xóa đi một phần tử trong mảng có vị trí (index) trong mảng tương ứng với giá trị Index đưa ra

a = [1, 2, 3] a.delete_at(1)

a [1, 3]

delete Xóa đi tất cả các phần tử ở trong mảng mà chúng giống với phần tử được đưa ra

a = [1, 2, 3, 2] a.delete(2)

a [1, 3]

clear Xóa đi tất cả các phần tử có trong mảng và trả về một mảng rỗng ["a", "b", "c"].clear []

uniq Xóa đi các phần tử giống nhau ở trong mảng [1, 1, 2, 2, 3].uniq [1, 2, 3]

fill Thay thế tất cả các phần tử có trong mảng bằng một phần tử được đưa ra [1, 2, 3].fill(7) (7, 7, 7)

sort Xắp xếp thứ tự các phần tử ["ab", "yz", "wx", "ac"].sort

["ab", "ac", "wx", "yz"]

first Trả về phần tử đầu tiên của mảng [1, 2, 3].first 1

Page 21: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

21

last Trả về phần tử cuối cùng của mảng [1, 2, 3].last 3

Hàm new dùng để tạo ra mảng mới. Ngoài cách sử dụng như ví dụ trên thì nó còn được sử dụng bằng ba cách khác nhau nữa, giống như các ví dụ sau đây:

1. num_list = Array.new 20 – Tạo ra một mảng với một kích thước ( số lượng các phần tử) nhất định mà không phải tạo ra các phần tử cho nó.

2. num_list = Array.new 4, "xyz" – Tạo ra một mảng mới gồm bốn phần tử, trong đó các phần tử đều là "xyz".

3. num_list = Array.new old_list – Tạo ra một mảng mới có các phần tử tương tự như các phần tử có trong mảng old_list.

Hàm concat tương tự như phép toán + của mảng, cũng tạo ra một mảng là tổ hợp tất cả các phần tử của hai mảng ban đầu. Sự khác biệt giữa chúng chính là phép toán + sẽ tạo ra một mảng thứ ba để lưu trữ các kết quả tổ hợp hai mảng ban đầu, còn hàm concat thì chỉ thay đổi bản thân mảng có gán hàm concat khi được thêm mảng khác vào cuối nó. Các lệnh sau đây cho thấy cách thức mà nó thực hiện:

first_array = [5, 4, 3, 2, 1]

second_array = [8, 7, 6]

second_array.concat(first_array)

Dòng lệnh thứ ba sẽ thêm các phần tử của mảng first_array vào cuối của mảng second_array (hiện có) và kết quả sẽ là [8, 7, 6, 5, 4, 3, 2, 1].

Hàm delete_at và delete đều xóa đi các phần tử ở trong mảng nhưng cách thức hoạt động của chúng thì khác nhau. Hàm delete_at xóa đi một phần tử mảng ứng với một giá trị Index cụ thể được đưa ra để xóa, trong khi hàm delete thì lại xóa bỏ tất cả các phần tử giống với phần tử xóa được đưa ra. Các ví dụ sau đây thể hiện cách thức hoạt động của hai hàm:

test = [10, "x", 9, "x", 8, "y", "x"]

test.delete_at 4 test = [10, "x", 9, "x", "y", "x"]

test.delete "x" test = [10, 9, "y"]

Hàm delete_at xóa đi phần có vị trí index là 4 tức phần tử 8. Hàm delete xóa đi tất cả các phần tử giống phần tử "x".

Hàm fill ngoài cách sử dụng như ví dụ trên thì nó còn được sử dụng bằng các cách khác nhau nữa, giống như các ví dụ sau đây:

fill_test = [1, 2, 3, 4, 5, 6]

fill_test.fill 9 [9, 9, 9, 9, 9, 9]

fill_test.fill 10, 0..2 [10, 10, 10, 4, 5, 6]

Thay thế các phần tử có giá trị Index từ 0 đến 2 thành phần tử 10

fill_test.fill 21, 4, 2 [1, 2, 3, 4, 21, 21]

Thay thế hai phần tử bằng phần tử 21, bắt đầu thay thế từ phần tử có giá trị Index là 4

Page 22: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

22

Hàm sort dùng để xếp đặt các phần tử của mảng theo thứ tự số hoặc thứ tự chữ cái, nhưng chỉ áp dụng khi tất cả các phần tử trong mảng là số hoặc là chữ cái.

Hàm first trả về phần tử đầu tiên của mảng và hàm last trả về phần tử cuối cùng của mảng. Bạn có thể thay thế hai hàm này bằng cách truy suất các phần tử trong mảng (đã nói ở phần đầu của mảng) với trị số Index là 0 và -1.

2.6 Đối tượng-Object, lớp-Class và phương thức-Method. Trong thời kỳ đầu của ngành lập trình máy tính, cách duy nhất để lưu trữ dữ liệu là tạo ra

các biến, hằng, chuỗi và mảng. Nhưng theo dòng thời gian các ứng dụng ngày càng phát triển và phức tạp khiến các lập trình viên trở nên mệt mỏi với việc quản lý hàng ngàn những số liệu xắp xếp vô tổ chức .Vì vậy, họ đã quyết định nhóm các dữ liệu liên quan và các cách thức hoạt động vào một cấu trúc được gọi là đối tượng (Object). Tính chất của dữ liệu và các cách thức hoạt động trong một đối tượng được xác định bởi lớp (Class) của đối tượng, và các hành vi trong một lớp được xác định bởi phương thức (Method) của nó .

Cuốn sách này hoàn toàn được viết về chủ đề “lập trình định hướng đối tượng”, do đó sự thảo luận về các đối tượng trong Ruby của phần này sẽ được trình bày vắn tắt. Để biết thêm thông tin, tôi khuyên bạn nên đọc Object-Oriented Analysis and Design with Applications của Grady Booch , Robert A. Maksimchuk , Michael W. Engel và Bobbi J. Young. Ngoài ra, có rất nhiều tài liệu miễn phí trên web thảo luận về các nguyên tắc của lập trình định hướng đối tượng.

2.6.1 Đối tượng. Để xây dựng một mô hình có quy mô lớn trong SketchUp, bạn cần phải xác định các trị

số cho nhiều thuộc tính, bao gồm cả tọa độ, vật liệu (Material), hoa văn (Texture) và màu sắc (Color). Có thể truy cập dễ dàng các thiết lập trong các hộp thoại của SketchUp, như kích chuột phải vào một đoạn thẳng trong mô hình và chọn Intity Info từ menu ngữ cảnh xuất hiện và SketchUp sẽ cho bạn biết rất nhiều thuộc tính về đoạn thẳng đó. Nhưng trong kịch bản-Script cho SketchUp, quản lý nhiều dữ liệu thuộc tính cho nhiều đối tượng ( đối tượng ở đây là các đoạn thẳng, mặt và hình dạng trong dự án SketchUp) là một công việc khó khăn . Để thay đổi điều đó, chúng ta sẽ tổ chức các thuộc tính có liên quan vào các cấu trúc dữ liệu có phân cấp. Ví dụ, nếu chúng ta viết một Script tạo dựng mô hình một ngôi nhà, chúng ta sẽ tạo ra một cấu trúc dữ liệu toàn cục cho ngôi nhà và nó chứa đựng các cấu trúc dữ liệu con cấp thấp hơn cho bức tường, cửa ra vào, và mái nhà. Và một cấu trúc dữ liệu con là cửa cũng có thể chứa đựng các cấu trúc con của chính nó như các phụ kiện: cửa , khóa, và các bản lề...

Trong các ngôn ngữ lập trình, các cấu trúc dữ liệu này được gọi là các đối tượng-Object. Và đối tượng có thể được sử dụng giống như các biến-Variable mà chúng ta đã biết trước đó. Nhưng không giống như biến, một đối tượng có thể chứa nhiều giá trị liên quan. Ví dụ, trong khi biến door_height (ví dụ ở phần biến) chỉ xác định một thuộc tính là chiều cao của cửa thì một đối tượng Door có thể chứa nhiều nhiều thuộc tính của cửa như: chiều cao, chiều rộng, chiều dầy, vật liệu và màu sắc.

Lưu ý: Từ đối tượng-Object được dùng rất nhiều trong cuốn sách này. Một mặt nó dùng để đề cập một thứ gì đó mà bạn đã dựng trong một dự án SketchUp, chẳng hạn như một đoạn thẳng, một đường tròn hoặc một khối lập phương. Mặt khác, đối tượng được dùng để đề cập tới một cấu trúc dữ liệu cụ thể nào đó.

Đây là một điều rất hữu ích để phân biệt đối tượng với mảng. Trong Ruby, một mảng có thể chứa đựng rất nhiều kiểu phần tử ( như biến, số, chuỗi…), nhưng một đối tượng chỉ chứa đựng dữ liệu cần thiết để mô hình hóa một đối tượng vật thể hoặc một nguyên tắc trừu tượng nào đó. Ví dụ, nếu viết Script mô hình hóa một ngôi nhà cần phải theo dõi chiều cao, chiều rộng và các vật liệu của từng cửa một, sau đó lưu trữ giá trị của các thuộc tính này ở trong kiểu đối

Page 23: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

23

tượng Door. Và Script cũng có thể chứa các kiểu đối tượng về cửa sổ-Window, hiên nhà- Porch và nhà để xe- Garage .

Hai đối tượng cùng kiểu phải có các thuộc tính giống nhau, nhưng không nhất thiết phải giống nhau về giá trị. Nếu Door là kiểu đối tượng xác định một chiều cao và chiều rộng của cửa, và các đối tượng door1 và door2 có cùng kiểu với đối tượng Door , thì door1 và door2 phải lưu trữ các giá trị về chiều cao và chiều rộng, nhưng không nhất thiết chúng phải giống nhau.

Biểu hiện cụ thể cho một kiểu đối tượng gọi là các lớp (class) của nó. Điều quan trọng là phải hiểu được mối quan hệ giữa các đối tượng và các lớp, và đó chính là trọng tâm của trình bày sau đây.

2.6.2 Lớp. Một lớp sẽ xác định cấu trúc của một đối tượng giống như một tập hợp các bản thiết kế

xác định cấu trúc của một tòa nhà hoặc một chuỗi ADN xác định cấu trúc của một sinh vật .Cụ thể hơn, một lớp xác định các dữ liệu chứa đựng trong một đối tượng và các cách thức có sẵn để sử dụng các dữ liệu đó.

Chủ đề về mã hóa các lớp mới sẽ được trình bày ở trong Chương 8. Bây giờ, bạn chỉ cần biết thế nào là lớp và làm sao để tạo ra các đối tượng từ các lớp hiện có. Trong các thư viện của Ruby và API cho SketchUp có hàng trăm lớp có sẵn.

Trong Ruby, tất cả mọi thứ mà chúng ta làm việc với nó đều là một đối tượng.Vì vậy, tất cả mọi thứ chúng ta làm việc với nó đều có một lớp. Hàm class hiển thị tên lớp của một đối tượng, như thể hiện trong đoạn mã sau:

5.class

Fixnum 3.14159.class

Float "Hello, world".class

String [5, 6, 7].class

Array

Trong đó: 5 là một đối tượng của lớp Fixnum ( số nguyên nhỏ ) , 3.14159 là một đối tượng của lớp Float ( số thập phân ) , "Hello, world" là một đối tượng của lớp String (chuỗi) và [ 5 , 6, 7] là một đối tượng của lớp Array (mảng). Nếu bạn phân tích mã của người khác, hàm class làm cho việc xác định chính xác loại dữ liệu bạn đang làm việc trở nên dễ dàng.

Các lớp Fixnum, Float, String và Array đều được cung cấp bởi thư viện tiêu chuẩn của Ruby (Ruby Standard Library). Nhưng các lớp mà chúng ta sẽ quan tâm trong cuốn sách này được tạo sẵn bởi SketchUp API. Hai lớp đặc biệt quan trọng sau đây sẽ được thảo luận ở trong chương tiếp theo:

* Edge – cạnh: Một đối tượng được tạo từ lớp Edge đại diện cho một đoạn thẳng trong SketchUp.

* Face – mặt: Một đối tượng được tạo từ lớp Face đại diện cho một bề mặt hai chiều trong SketchUp.

Page 24: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

24

Lưu ý: Thay vì sử dụng các cụm từ như " một đối tượng được tạo từ lớp Face" hoặc " một đối tượng thuộc kiểu Face" cuốn sách này sẽ đề cập đến các đối tượng là đối tượng Face hoặc Faces. Nhưng hãy nhớ rằng Face là tên của lớp , không phải là đối tượng.

Có hơn tám mươi lớp khác nhau trong API SketchUp, và phụ lục A liệt kê tất cả chúng. Bạn cũng có thể truy cập vào trang web http://code.google.com/apis/sketchup/docs/index.html . Ở đó, bạn có thể kích vào các đường link để xem cách mà các lớp thực hiện.

2.6.3 Phương thức thể hiện. Trong các phần trình bày trước đó về chuỗi đã giải thích cách thức hoạt động của các

phép toán cơ bản như + và * , và cũng trình bày một bảng thống kê các hàm dành cho chuỗi, những phép toán và các hàm này được gọi là phương thức-Method. Các phương thức này thực hiện cho các đối tượng chuỗi-String.

Nếu str là một chuỗi thì str.length sẽ trả về số lượng các ký tự trong chuỗi, tương tự như vậy str.downcase sẽ chuyển đổi các ký tự trong chuỗi str sang chữ in thường. Để có một danh sách đầy đủ các phương thức cho chuỗi, hãy nhập vào lệnh sau đây trong hộp thoại Ruby Console:

"Hello".methods

Danh sách này liệt kê tất cả các phương thức có sẵn cho một đối tượng chuỗi. Nếu str là một biến dạng chuỗi, bạn có thể có được kết quả tương tự bằng cách gọi chúng với lệnh str.methods. Những phương thức này được định nghĩa cho lớp String, và tất cả các đối tượng dạng chuỗi (chẳng hạn như str) đều có thể gọi chúng.

Lớp Array cũng cung cấp một nhóm các phương thức cho các đối tượng dạng mảng, như ở đây:

arr = [0, 1, 2]

arr.length

3

arr.first

0

arr.last

2

Một phương thức là một thủ tục được định nghĩa trong một lớp và nó hoạt động trên dữ liệu về đối tượng. Một cách đơn giản, một đối tượng đại diện cho một vật và một phương thức sẽ cung cấp một phương tiện để tương tác với các thuộc tính của vật đó. Phương thức được gọi hoặc dẫn ra bằng cách sử dụng dấu chấm “.” . Cú pháp như sau: đối tượng + . + tên phương thức cần gọi.

Ví dụ, nếu lớp Auto định nghĩa một phương thức trong nó gọi là reverse, còn auto1 và auto2 là các đối tượng thuộc lớp Auto thì bạn có thể gọi auto1.reverse và auto2.reverse.

Nhiều phương thức yêu cầu bổ sung thêm dữ liệu để nó thực thi. Phương thức fill trong lớp Array cần một phần tử đầu vào để thay thế các phần tử có trong trong mảng đầu vào. Dữ dữ liệu thêm này được gọi là một đối - argument hoặc một tham số- parameter, và nó có thể được đặt hoặc không đặt trong dấu ngoặc đơn như thể hiện trong các lệnh sau:

Page 25: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

25

arr = [0, 1, 2, 3]

arr.fill(7)

[7, 7, 7, 7]

arr.fill 7

[7, 7, 7, 7]

Nếu một phương thức đòi hỏi nhiều đối số, các đối số phải được phân cách bằng dấu phẩy cho dù các đối số có được đặt trong dấu ngoặc đơn hay không.

Phụ lục A liệt kê các phương thức được định nghĩa trong mỗi lớp của API SketchUp. Nếu bạn nhìn kỹ, bạn sẽ nhận thấy rằng có rất nhiều tên của các phương thức được kết thúc với một chữ dấu “?” trong khi những phương thức khác kết thúc với một dấu “=”. Điều này cung cấp cho bạn một ý tưởng về cách mà phương thức thực thi. Nếu tên của một phương thức kết thúc bằng một dấu “?” thì kết quả nó sẽ trả về đúng-true hoặc sai-false.

Ví dụ, phương thức include? định nghĩa trong lớp String trả về true nếu đối số là một phần của chuỗi và là false nếu không phải. Điều này được thể hiện bằng các ví dụ sau:

str = "Hello, world"

str.include? "ell"

true

str.include?("word")

false

Nếu tên của một phương thức kết thúc với dấu “=”, nó sẽ cập nhật đối tượng với các dữ liệu được cung cấp bởi các tham số. Điều này có thể được chứng minh bằng cách sử dụng phương thức [] = của lớp Array để làm thay thế một phần tử trong mảng thành một phần tử khác bởi tham số đưa ra. Lệnh sau thay thế phần tử thứ ba của mảng arr thành 5:

arr[2] = 5

Các phương thức trong Ruby có thể được xâu chuỗi lại với nhau. Có nghĩa là, nếu phương thức method_B có thể được thực thi trên kết quả trả về bởi phương thức method_A thì bạn có thể gọi cùng lúc cả hai phương thức với cú pháp method_A.method_B. Ví dụ, bạn muốn đảo ngược các ký tự sau khi chuyển đổi thành chữ in hoa của chuỗi "Hello". Bạn có thể làm điều này bằng cách sử dụng nhiều lệnh như sau đây :

str = "Hello" str1 = str.upcase

HELLO

str2 = str1.reverse

OLLEH

Hoặc bạn có thể thực hiện lệnh sau đây để ra kết quả tương tự trên: str = "Hello".upcase.reverse

OLLEH

Page 26: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

26

Trong ví dụ này, phương thức reverse thực thi trên kết quả của "Hello". Upcase. Xâu chuỗi các phương thức sẽ làm giảm số lượng mã bạn cần phải nhập, nhưng đồng thời cũng làm cho mã của bạn trở nên khó đọc hơn.

2.6.4 Phương thức lớp. Các phần trình bày trước đó ngụ ý rằng tất cả các phương thức định nghĩa trong một lớp

chỉ có thể được truy xuất thông qua các đối tượng. Thường nhiều trường hợp là vậy nhưng nó không hoàn toàn chính xác. Một số phương thức trong một lớp thực thi trên chính lớp đó. Phương thức thực thi trên lớp được gọi là phương thức lớp-Class method. Và phương thức thực thi trên các đối tượng này được gọi là phương thức thể hiện-Instance method bởi vì một đối tượng là một sự thể hiện của một lớp.

Có một phương thức lớp quan trọng chứa trong tất cả các lớp của Ruby. Đây là phương thức new, và nó tạo ra một đối tượng mới từ một lớp với cách thức giống như một đội xây dựng tạo ra một tòa nhà mới từ bản thiết kế. Ví dụ, lệnh sau đây gọi phương thức new của lớp String để tạo ra một đối tượng kiểu chuỗi mới :

new_str = String.new

new_str.class

String

Trong cuốn sách này, phần lớn các phương thức mà chúng ta sẽ được sử dụng là phương thức thể hiện. Bất kỳ phương thức được trình trong cuốn sách này có thể được coi là phương thức thể hiện, trừ khi chỉ rõ cụ thể nó là phương thức lớp.

2.7 Lớp kế thừa-Class Inheritance . Trong nhiều trường hợp, bạn có thể truy xuất vào các lớp có cùng chung thuộc tính. Ví

dụ, nếu bạn là một kiến trúc sư, bạn đang cần mô hình hóa khách sạn và bệnh viện, hai kết cấu này khác nhau nên yêu cầu có các lớp riêng biệt: Hotel-khách sạn và Hospital-bệnh viện . Nhưng hai lớp này cũng có những thuộc tính tương tự nhau, chẳng hạn như vị trí, vật liệu và số tầng. Vì lý do này, các phương thức sau đây có thể áp dụng tốt cho cả hai lớp Hotel và Hospital:

• num_stories – Số lượng tầng trong một kết cấu

• location – Vị trí địa lý của kết cấu

• material – loại vật liệu dùng để xây dựng kết cấu

Thay vì mất hai lần mã hóa cho những phương thức giống nhau, và nó sẽ là hiệu quả hơn nếu để đặt chúng trong một lớp thứ ba để chúng sẽ sẵn sàng sử dụng cho đối tượng Hotel và Hospital. Lớp thứ ba này nên thể hiện sự tương đồng với hai lớp kia, và trong ví dụ này chúng ta sẽ lớp chung là Building. Chúng ta cũng sẽ thiết lập một mối quan hệ giữa Building, Hotel và Hospital để cả Hotel và Hospital đều tiếp nhận được các phương thức được định nghĩa trong Building.

Mối quan hệ giữa các lớp được gọi là kế thừa- Inheritance, và cả hai Hotel và Hospital được cho là kế thừa từ Building. Trong ví dụ này , Building được gọi là lớp cha - superclass của Hotel và Hospital, còn Hotel và Hospital được gọi là lớp con- subclass của Building. Hình sau đây cho thấy thế nào là một hệ thống phân cấp các lớp kế thừa.

Page 27: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

27

More general: Tổng thể hơn nữa; More Specific; Riêng biệt hơn nữa.

Bây giờ bạn có thể định nghĩa các phương thức num_stories, location, và material trong lớp Building duy nhất, và nếu bạn cần phải viết lại bất kỳ về chúng, bạn chỉ cần thay đổi trong một lớp duy nhất. Ngoài ra, bằng cách tạo ra lớp Building bạn có thể dễ dàng sử dụng cho nhiều lớp con thêm khác đại diện cho các kết cấu như thư viện- Librariy , nhà thờ-Church và cửa hàng- Store.

Hãy xem xét một ví dụ thực tế của lớp kế thừa. Quá trình biên dịch các con số trong Ruby rất khác nhau tùy thuộc vào số lượng bộ nhớ mà chúng chiếm lĩnh. Nếu một số nguyên chiếm 31 bit hoặc ít hơn, đó là một đối tượng lớp Fixnum. Nếu một số nguyên chiếm hơn 31 bit , đó là một đối tượng lớp Bignum. Đây là lý do tại sao 24.class trả Fixnum và 1234567890.class trả Bignum.

Hai lớp này đòi hỏi các phương thức khác nhau cho các thực thi nhất định, nhưng giữa chúng cũng có một số phương thức tương tự nhau. Ví dụ, các phương thức next trả về một số nguyên tiếp theo nó. 24.next trả về 25 và 1234567890.next trả về 1234567891 .

Vì lý do này, Ruby có một lớp đặc biệt dành cho số nguyên được gọi là Integer. Các phương thức chung như next được định nghĩa trong lớp Integer, và do Fixnum và Bignum đều kế thừa từ lớp Integer nên phương thức next là có sẵn cho các đối tượng của cả hai lớp này sử dụng. Hình sau cho thấy vị trí các lớp Integer, Fixnum và bignum trong hệ thống phân cấp lớp số trong Ruby.

Chương 8 sẽ giải thích làm thế nào để tạo ra lớp và lớp con trong mã hóa. Bây giờ, tất cả

thứ mà bạn cần phải hiểu về lớp kế thừa là: Nếu lớp B kế thừa từ lớp A ( tức lớp A là lớp cha của lớp B) thì tất cả các phương thức trong lớp A là sẵn sàng cho lớp B sử dụng. Điều này có nghĩa rằng bất kỳ đối tượng thuộc lớp B có thể truy suất tất cả các phương thức tương tự như một đối tượng thuộc lớp A.

Page 28: Chuong 1,2 va 3

Chương II SketchUp Scripting by [email protected]

28

2.8 Tổng kết . Mục tiêu của chương này là cung cấp cho bạn một nền tảng Ruby đủ để bạn có thể hiểu

được đối tượng SketchUp cũng như hiểu cái cách chúng được sử dụng trong mã hóa. Bài học này bắt đầu với một trình bày về con số, chuỗi , mảng , các biến và các hằng số và tiếp theo sau là giải thích các đối tượng và các lớp. Chúng ta sẽ làm việc với các cấu trúc dữ liệu này trong cuốn sách.

Biến và hằng hoạt động tương đối giống nhau, chúng chỉ khác nhau khi biến có thể thay đổi giá trị tùy ý, còn hàng thường không thay đổi giá trị trong suốt quá trình thực thi kịch bản của Ruby.

Như đã đề cập trước đó, bạn có thể tưởng tượng một đối tượng là một vật. Phương thức của một đối tượng là một phương tiện tương tác với vật đó. Trong Ruby, mỗi cấu trúc dữ liệu là một đối tượng, bao gồm cả số và các biến. Số 5 có các phương thức mà có thể được gọi bằng cách sử dụng một dấu “.” giống như khi gọi các phương thức của một chuỗi hoặc mảng.

Tất cả các đối tượng trong Ruby đều phải thuộc một lớp nào đó, hay nói cách khác là lớp tạo ra đối tượng. Ví dụ như 1,2,3 thuộc lớp Interger và “a”, “b” thuộc lớp String, trong đó lớp Interger và String là các lớp có sẵn trong Ruby và bạn cũng có thể tạo ra các lớp mới. Và mọi lớp đều các các phương thức riêng của nó và đó là phương tiện dùng để truy suất vào dữ liệu của các đối tượng thuộc lớp. Ví dụ lớp String có phương thức ( hoặc có thể gọi là hàm) Length dùng để truy xuất ra số lượng các ký tự của một đối tượng chuỗi thuộc lớp String.

Một lớp xác định cấu trúc của một đối tượng, bao gồm cả dữ liệu của đối tượng và các phương thức có sẵn để thực thi trên đối tượng. Một số phương thức chấp nhận đối số hoặc tham số, và trong Ruby chúng có thể chọn được đặt trong dấu ngoặc đơn hoặc không. Nhiều đối số hoặc tham số phải được phân cách bằng dấu phẩy. Một số phương thức được gọi là phương thức lớp hoạt động trên lớp thay vì trên một đối tượng. Phương thức quan trọng nhất trong số này là new dùng để tạo ra một đối.

Lập trình hướng đối tượng là một chủ đề phức tạp, và nếu nó không được rõ ràng cho lắm thì bạn không nên lo lắng. Khi bạn thực hành thông qua các ví dụ trong cuốn sách này, bạn sẽ có thể nhìn thấy các nguyên tắc của mã hóa OO (Object-oriented-định hướng) được thể hiện rõ ràng trong các đoạn mã thực tế. Trong chương tiếp theo, chúng tôi sẽ dành mối quan tâm về mặt lý thuyết và xem cách thức mà các đối tượng của SketchUp làm việc cùng nhau để tạo ra mô hình 3 chiều.

Page 29: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

29

Nền tảng cơ bản của ngôn ngữ kịch

bản cho SketchUp

Page 30: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

30

Trong chương này, chúng ta sẽ đặt lý thuyết lập trình sang một bên và nhận được những thứ thú vị là tạo ra các hình dạng trong SketchUp bằng mã-code. Phần trình bày này bắt đầu với các đoạn thẳng một chiều và sau đó sẽ là các bề mặt hai chiều. Đến cuối chương, bạn sẽ có thể sắp sửa tạo ra được các mô hình 3 chiều của riêng bạn bằng cách sử dụng các cơ chế có sẵn tương tự như công cụ Push/Pull và Follow Me của SketchUp.

Thông qua các phần trình bày, chương này sẽ giải thích làm thế nào để tạo ra các tập tin kịch bản-Script Ruby và thực thi chúng trong SketchUp. Cho đến bây giờ thì bạn mới chỉ nhập được lệnh trong hộp thoại Ruby console của SketchUp và quan sát kết quả. Nhưng với Script bạn có thể lưu trữ các lệnh của bạn trong các tập tin thay vì mỗi lệnh chỉ được nhập một lần trong hộp thoại Ruby console. Hơn nữa, Script sẽ được làm rõ hơn trong các chương tiếp theo để bạn có thể thực hiện nhiều điều với Script hơn so với việc bạn có thể với các lệnh riêng lẻ.

Chương này chủ yếu liên quan tới đối tượng Edge (cạnh) và Face (bề mặt) của SketchUp, và một khi bạn hiểu cách thức hoạt động của chúng thì bạn có thể xây dựng bất cứ thứ gì bạn muốn. Nhưng trước khi bạn có tạo ra các đối tượng này trong một dự án SketchUp thì bạn cần phải trở nên hiểu rõ ba cấu trúc dữ liệu khác nhau là: mô đun Sketchup , lớp Model và lớp Entities.

3.1 Ba cấu trúc dữ liệu cơ bản trong SketchUp. Gần như tất cả Script cho SketchUp đều bắt đầu bằng cách truy xuất vào ba cấu trúc dữ

liệu cơ bản là: Sketchup, Model, và Entities. Một khi bạn hiểu cách thức chúng hoạt động và cách làm việc với chúng thì bạn đã sẵn sàng để xây dựng các mô hình SketchUp bằng mã hóa-code.

3.1.1 Mô đun SketchUp. Không giống như các lớp và các đối tượng đã được mô tả trong chương trước,

Sketchup là một mô-đun, cấu trúc dữ liệu đầu tiên chúng ta sẽ bắt gặp. Chương 8 trình bày rất chi tiết về các mô-đun, nhưng bây giờ, tất cả mọi thứ bạn cần phải biết là: một mô-đun là một tập hợp các phương thức-method. Hầu hết các Script Ruby trong cuốn sách này bắt đầu bằng cách gọi một trong số các phương thức thuộc mô-đun này.

Các phương thức trong mô đun Sketchup truy xuất các thuộc tính có liên quan đến toàn bộ phần mềm SketchUp. Để hiểu cách thức hoạt động này, mở hộp thoại Ruby Console (Window > Ruby Console trên menu chính) và thực hiện lệnh sau :

Sketchup.version

Lệnh này sẽ hiển thị số phiên bản của phần mềm SketchUp hiện hành. Bạn cũng có thể nhập Sketchup.os_language để biết được ngôn ngữ ( về mặt giao diện ) hiện tại đang dùng hoặc Sketchup.get_locale để biết được ngôn ngữ ( ví dụ tiếng Anh hoặc tiếng Pháp) hiện tại đang dùng để mã hóa trong SketchUp. Để biết tất cả các phương thức được cung cấp bởi mô đun Sketchup, hãy tìm chúng trong bảng liệt kê của phụ lục A ở cuối cuốn sách này hoặc nhập lệnh Sketchup.methods trong hộp thoại Ruby Console.

Phương thức quan trọng nhất trong số các phương thức thuộc mô-đun Sketchup là active_model. Phương thức này trả về đối tượng Model tương đương với đối tượng Model trong dự án SketchUp hiện đang hiện hành. Lệnh sau đây cho thấy cách thức nó hoạt động:

mod = Sketchup.active_model

Lệnh này gọi ra đối tượng model hiện hành và sau đó đặt mod tương đương với đối tượng Model hiện hành. Đối tượng model là cốt yếu trong tất cả các dự án mô hình tạo bởi phần mềm SketchUp, và các phần trình bày sau đây giải thích lý do tại sao .

Page 31: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

31

3.1.2 Đối tượng ( hoặc lớp) Model. Cũng giống như mô-đun Sketchup miêu tả toàn bộ thông tin về phần mềm SketchUp,

đối tượng Model miêu tả một tập tin SketchUp độc lập (*.skp ), hay chính xác hơn là các thông tin về mô hình dự án chứa trong tập tin. Khi bạn mở một file cũ hoặc tạo mới một file trong SketchUp thì các thuộc tính của mô-đun Sketchup vẫn giữ nguyên như cũ nhưng những dữ liệu có trong đối tượng Model hiện hành sẽ biến đổi hoàn toàn khác.

Và các phương thức định nghĩa bên trong lớp Model ( đối tượng Model thuộc lớp Model) cung cấp các thông tin về dự án SketchUp hiện hành. Ví dụ, phương thức modified? xác định xem dự án SketchUp đang hiện hữu đã bị chỉnh sửa (hoặc thay đổi) lần nào chưa kể từ lần cuối cùng nó đã được lưu. Các lệnh sau đây thể hiện cách thức mà nó được sử dụng:

mod = Sketchup.active_model

mod.modified?

Kết quả trả về True tức là có thay đổi và trả về False có nghĩa là không thay đổi.

Phương thức title trả về tên tập tin lưu trữ của dự án SketchUp hiện hành trên máy tính của bạn và các phương thức description trả về một đoạn văn bản miêu tả về file dự án SketchUp hiện hành ( lấy thông tin trong hộp thoại Model Info/File/Description). Phương thức path đường trả về đường dẫn đến tập tin lưu dự án SkethcUp hiện hành. Phụ lục A liệt kê tất cả các phương thức được cung cấp cho lớp Model.

Trong cuốn sách này, các phương thức của lớp Model sẽ được chúng ta sử dụng nhiều nhất để truy xuất những thứ được chứa đựng bên trong đối tượng Model của dự án SketchUp hiện hành. Bạn có thể tưởng tượng một đối tượng Model sẽ trông giống như một cái tủ có nhiều ngăn kéo. Model là một đối tượng độc lập có chứa nhiều ngăn, và mỗi ngăn có thể chứa nhiều đối tượng. Sơ đồ sau cho thấy sáu ngăn quan trọng nhất trong số các ngăn kéo chứa đối tượng được chứa đựng bên trong một đối tượng Model.

Bằng cách thay đổi các đối tượng trong sáu ngăn chứa trên thì bạn có thể thiết lập cấu

hình gần như mọi khía cạnh của một mô hình được dựng trong SketchUp. Để truy xuất chúng, bạn cần phải gọi ra các phương thức Model thích hợp. Đó là:

1. entities – trả về một đối tượng Entities chứa đựng các hình dạng trong dự án SketchUp hiện tại ( được giới thiệu trong chương này và đề cập trong suốt cuốn sách).

2. layers – trả về một đối tượng Layers chứa đựng các layer-lớp trong dự án SketchUp hiện tại (Trình bày tại chương 7).

3. definitions - trả về một đối tượng ComponentDefinitions nắm giữ toàn bộ các component trong dự án SketchUp hiện tại (Trình bày tại chương 7).

Page 32: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

32

4. materials - trả về một đối tượng Materials quản lý toàn bộ các vật liệu sử dụng trong dự án SketchUp hiện tại (Trình bày tại chương 6).

5. options - trả về một đối tượng OptionManager cung cấp truy xuất nhiều OptionsProviders (Trình bày tại chương 9)

6. pages - trả về một đối tượng Pages chứa đựng các page-trang trong dự án SketchUp hiện tại (Trình bày tại chương 10).

Hầu hết các phương thức này đều có tên ở dạng số nhiều ( +ies hoặc +s ) như entities, layers, definitions và materials. Chúng trả về các đối tượng thuộc các lớp có tên tương ứng: Entities, Layers, Definitions và Materials. Một đối tượng trả về có nhiều đối tượng con bên trong và về cơ bản nó giống một mảng, một phần tử của mảng Entities sẽ là một thực thể-Entity. Tương tự như vậy, mảng Layers chứa đựng các đối tượng lớp-Layer và mảng Material chứa đựng các đối tượng vật liệu-Material, và các lớp khác tương tự như vậy.

Lưu ý : Điều này có thể gây nhầm lẫn, vì vậy phải chú ý. Một đối tượng Materials có chứa nhiều đối tượng Material (vật liệu). Và một đối tượng Materials có chứa nhiều đối tượng Materials ( thêm s đằng sau). Ở trường hợp thứ hai nếu "s" là chữ trong mã thì đối tượng chứa đựng đang được tham chiếu và nếu "s" là trong chữ thông thường thì các đối tượng cá thể đang được tham chiếu.

Tại thời điểm này , tất cả chúng ta muốn làm là dựng các hình dạng cơ bản trong SketchUp. Để bắt đầu, bước đầu tiên là gọi ra phương thức entities của lớp Model để truy xuất vào đối tượng Entities của dự án SketchUp hiện hành. Các dòng mã sau đây cho thấy cách thức này được thực hiện trong mã hóa:

mod = Sketchup.active_model

ents = mod.entities

Bạn cũng có thể có kết quả tương tự nếu xâu chuỗi hai phương thức này với nhau: ents = Sketchup.active_model.entities

Phần lớn nội dung của cuốn sách này là liên quan với việc thêm và chỉnh sửa các đối tượng thực thể riêng rẽ được chứa đựng bên trong đối tượng Entities trong dự án SketchUp hiện hành. Vấn đề này được trình bày ở phần tiếp theo ngay sau đây.

3.1.3 Đối tượng (hoặc lớp) Entities. Mỗi một đối tượng hình học trong một dự án SketchUp đều được miêu tả bởi một thực

thể Entity hoặc một lớp con của chúng, bao gồm cả đoạn thẳng, bề mặt, hình ảnh, văn bản, nhóm-group và các component. Để quản lý hoặc sửa đổi đối tượng Entity trong một dự án SketchUp hiện hành thì bạn cần truy xuất đối tượng chứa đựng chính Entities. Đối tượng chứa đựng này phục vụ ba mục đích chính:

1. Thêm các đối tượng Entity mới vào trong dự án SketchUp hiện hành.

2. Move-di chuyển, scale-qui mô, rotate-xoay và erase-xóa các đối tượng Entity trong dự án SketchUp hiện hành.

3. Lữu trữ các đối tượng Entity vào một mảng để có thể truy xuất bởi chỉ số xác định vị trí (index) của các phần tử trong mảng.

Page 33: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

33

Vai trò đầu tiên là quan trọng nhất. Lớp Entities chứa đựng rất nhiều phương thức để thêm các đối tượng Entity mới vào trong dự án SketchUp hiện hành. Phương thức thêm đơn giản nhất ( add_X ) được liệt kê như sau:

• add_line – tạo ra một đối tượng Edge từ hai điểm

• add_edges – tạo thành một mảng đối tượng Edge từ một loạt các điểm

• add_circle - tạo thành một mảng đối tượng Edge để tổ hợp chúng thành một đường tròn

• add_ngon - tạo thành một mảng đối tượng Edge để tổ hợp chúng thành một đa giác

• add_face – Tạo ra một đối tượng bề mặt Face từ cạnh hoặc các điểm

• add_text – Thêm một nhãn vào trong dự án tại tại một điểm nhất định

Khi nói đến hình dạng, thì Edge và Face là các đối tượng Entity quan trọng. Mỗi khi bạn thêm một hình dạng vào trong đối tượng chứa đựng Entities thì một hình dạng tương ứng xuất hiện trong không gian làm việc (workspace) của SketchUp. Sau đó, khi bạn lưu dự án SketchUp của bạn thì các Edge và Face sẽ nằm trong đối tượng Model được lưu trữ. Để hiểu đầy đủ các lớp Edge và Face, bạn cần phải làm quen với lớp cha-superclass của chúng là Entity và Drawingelement.

3.2 Lớp Entity và lớp Drawingelement. Lớp Entity là lớp cha cho tất cả các hình dạng có thể dựng trong SketchUp. Sơ đồ sau

cho thấy hệ thống phân cấp các lớp con của lớp Entity và chúng sẽ được trình bày trong cuốn sách này.

Lớp con chính của Entity là Drawingelement, và Drawingelement là lớp cha

của nhiều lớp khác, chúng ta sẽ nghiên cứu trong trong chương này và các chương khác. Trước khi tiếp tục hiểu xa hơn nữa, chúng ta sẽ có một sự xem xét ngắn gọn về hai lớp cha quan trọng này.

3.2.1 Lớp Entity. Trong sơ đồ trên lớp Entity nằm ở trên cùng của hệ thống phân cấp. Các phương thức

chứa đựng trong lớp này là có sẵn cho tất cả các lớp bên dưới nó. Nhiều trong số các phương thức này cung cấp thông tin cơ bản về các Entity, và chúng bao gồm những thứ sau đây :

• entityID – trả về một định danh duy nhất của đối tượng Entity

• typename – xác định kiểu hình học của đối tượng Entity (Edge, Face, ...)

• valid? – xác định xem Entity đang có trong dự án hay không (true/false)

• deleted? – xác định xem Entity đã bị xóa khỏi dự án hay không(true/false)

Page 34: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

34

• model – trả về đối tượng Model của dự án

Khi một Entity mới được tạo ra sẽ được SketchUp tự động gắn cho một cái tên-định danh nào đó và nó là duy nhât và phương thức entityID dùng để truy xuất tên này.

Các lệnh sau đây cho thấy cách thức sử dụng các phương thức này: test_line = Sketchup.active_model.entities.add_line

[0,0,0], [1,1,1]

#<Sketchup::Edge:0x767be50> (kq có thể khác với dòng này)

test_line.typename

Edge

test_line.entityID

1895 (kq có thể là một số khác với số này)

Ngoài những phương thức này, mỗi Entity có thể truy xuất thông tin do người dùng chỉ định bằng cách gọi ra phương thức attribute_dictionaries. Sau đó Entity có thể lấy lại, sửa đổi hoặc xóa các thuộc tính này. Chương 9 sẽ trình bày chi tiết về việc sử dụng và hoạt động của lớp AttributeDictionaries.

Cuối cùng, một Entity có thể có một hoặc nhiều đối tượng quan sát (Observer) kèm theo nó. Đối tượng quan sát theo dõi tình trạng của các Entity và đáp ứng với những thay đổi của đối tượng nó quan sát. Chương 9 sẽ giải thích cách thức hoạt động và cách thức để tạo ra chúng trong mã.

3.2.2 Lớp Drawingelement. Lớp Drawingelement là lớp cha của các lớp Edge, Face, Group, Image, Text,

ComponentDefinition và ComponentInstance. Nhiều trong số các phương thức ở trong các lớp này điều khiển cách thức xuất hiện của các đối tượng trong SketchUp; thiết lập các thuộc tính như đổ bóng-shadow, thành phần vật liệu và thiết lập đối tượng là ẩn-hide hay nhìn thấy được-visible. Và chúng tương tự với những tính năng ở trong hộp thoại Entity Info.

Lớp Drawingelement cung cấp một phương thức hữu ích được gọi là bounds,nó trả về một đối tượng BoundingBox. Nó sẽ thể hiện một hình hộp chữ chữ nhật nhỏ nhất mà vẫn có thể chứa đựng được Drawingelement đó, và các cạnh của hình hộp chữ nhật song song với các trục tọa độ x,y, z tương ứng. Bạn hãy liên tưởng hình hộp chữ nhật này với hình hộp chữ nhật màu xanh da trời bao quanh 1 component khi bạn kích chọn nó.

Các lệnh sau đây tạo ra một BoundingBox cho một đoạn thẳng nằm giữa hai điểm có tọa độ [ 0, 0, 0] và [ 2 , 2, 5 ].

Page 35: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

35

new_line = Sketchup.active_model.entities.add_line

[0,0,0], [2,2,5]

#<Sketchup::Edge:0x767ab18>

box = new_line.bounds

#<Geom::BoundingBox:0x76784d8>

Một khi BoundingBox được tạo, các phương thức của nó sẽ cung cấp thông tin về kích thước, đường chéo, góc, và điểm xa/gần nhất. Lệnh sau đây hiển thị vị trí trọng tâm của một BoundingBox và chiều dài đường chéo của nó (theo đơn vị inch) .

box.center

Point3d(1, 1, 2.5)

box.diagonal

5.74456264653803

3.3 Đối tượng (hay lớp) Edge-cạnh. Trong số các lớp con của lớp Drawingelement thì Edge là lớp dễ hiểu nhất, nó miêu

tả một đoạn thẳng nối giữa hai điểm. Đối tượng Edge được tạo ra bằng phương thức add_line của lớp Entities theo vị trí của điểm đầu và điểm cuối của đoạn thẳng. Khi bạn gọi ra phương thức này, SketchUp sẽ dựng một đoạn thẳng nối giữa hai điểm và thêm một Edge vào mảng Entities hiện hành. Ví dụ , lệnh sau đây tạo ra một Edge nằm giữa hai điểm có tọa độ [ 5 , 0, 0 ] đến [ 10 , 0, 0 ] :

Sketchup.active_model.entities.add_line [5, 0, 0], [10, 0, 0]

Hầu hết các phương thức trong lớp Edge lớp rơi vào một trong hai loại sau:

1. Phương thức cấu hình sự hiển thị của Edge

2. Phương thức truy xuất các đối tượng kết nối với Edge

Các phương thức thuộc loại thứ nhất cấu hình sự hiển thị của Edge trong không gian làm việc của SketchUp (workspace). Ngoài phương thức hidden được cung cấp bởi lớp Drawingelement, Edge còn cung cấp phương thức Soft -mềm mại và Smooth-trơn. Điều quan trọng là phải nhớ được sự khác nhau giữa một đoạn thẳng ẩn-hidden và một đoạn thẳng trơn-smooth: một đoạn thẳng trơn kết hợp bề mặt liền kề thành một (thường là cong) bề mặt duy nhất, trong khi một đoạn thẳng ẩn không làm thay đổi bề mặt liền kề. Tham khảo công cụ Soften Edges trong SketchUp để hiểu rõ thêm.

Trong thể loại thứ hai, phương thức all_connected trả về một mảng bao gồm tất cả các đối tượng Entity kết nối với Edge đó. Tương tự như vậy, phương thức face trả về một mảng chứa các đối tượng Face kết nối với Edge.

Trong SketchUp, điểm đầu và cuối của một đoạn thẳng-Edge được miêu tả bởi các đối tượng Vertex. Lớp Edge có chứa một số phương thức tương tác với chúng:

• vertices trả về một mảng gồm hai đối tượng Vertex thuộc Edge.

Page 36: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

36

• Start trả về đối tượng Vertex bắt đầu của Edge.

• end trả về đối tượng Vertex kết thúc của Edge.

• other_vertex – đưa ra một trong hai đối tượng Vertex của Edge, phương thức này sẽ trả về đối tượng Vertex còn lại. Ví dụ đoạn thẳng AB, bạn đưa ra điểm Vertex của A thì phương thức sẽ trả về Vertex của B và ngược lại. Tìm kiếm điểm đối diện của điểm được đưa ra của một đoạn thẳng.

• used_by? – xác định xem một đối tượng Vertex có kết nối với Edge không. Kết quả trả về True nếu kết nối (hay thuộc ) và False nếu không.

Có hai phương thức trong lớp Edge mà không rơi vào một trong hai loại trên: length-chiều dài và split -phân chia . Phương thức length trả về độ dài của đoạn thẳng tương ứng với Edge. Phương thức split chấp nhận một điểm ( ví dụ điểm C) trên đoạn thẳng và tạo ra một đối tượng Edge thứ hai. Sau khi phương thức split được gọi ra, đối tượng Edge thứ nhất sẽ bắt đầu từ điểm đầu của đoạn thẳng ban đầu cho tới điểm đưa ra bởi split-điểm C và đối tượng Edge thứ hai tiếp tục từ điểm C đến điểm cuối của đoạn thẳng ban đầu. Các lệnh sau đây cho thấy cách thức mà các phương thức được gọi ra trong thực tế : line = Sketchup.active_model.entities.add_line [0,0,0], [6,3,0]

line.length

6.70820393249937

new_line = line.split [4, 2, 0]

line.length

4.47213595499958

line.start.position

Point3d(0, 0, 0)

line.end.position

Point3d(4, 2, 0)

new_line.length

2.23606797749979

new_line.start.position

Point3d(4, 2, 0)

new_line.end.position

Point3d(6, 3, 0)

Hình đồ họa sau mô tả kết quả. Đối tượng Edge ban đầu (Original Line) là đoạn thẳng nối từ [ 0, 0, 0] đến [ 6 , 3, 0]. Sau khi phương thức split được gọi ra, đối tượng Edge ban đầu trở thành đoạn thẳng nối từ [ 0, 0, 0] đến [ 4 , 2, 0] và đối tượng Edge mới (New Line) là đoạn thẳng nối từ [ 4 , 2, 0] đến [ 6 , 3, 0].

Page 37: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

37

3.4 Giới thiệu về ngôn ngữ kịch bản cho SketchUp. Tại thời điểm này, bạn có lẽ đã trở thành một chuyên gia sử dụng Ruby Console của

SketchUp. Giao diện của hộp thoại rất tốt cho việc thực hiện lệnh Ruby đơn giản, nhưng nó sẽ khiến bạn trở nên mệt mỏi khi cần phải thực hiện các lệnh phức tạp. Thay vì nhập lệnh bằng tay, và sẽ là hiệu quả hơn khi nhóm chúng lại và đặt trong các tập tin rồi yêu cầu SketchUp thực hiện tất cả chúng theo trình tự. Những tập tin này được gọi là các kịch bản-Script.

Bên cạnh việc hiệu quả, còn có nhiều lý do khác để sử dụng các kịch bản, và phần còn lại của cuốn sách này sẽ cung cấp một số ví dụ về các đoạn mã trong các tập tin kịch bản. Một trong những ưu điểm của kịch bản là bạn có thể thêm các ghi chú cho người đọc để giải thích hoặc mô tả các khía cạnh của đoạn mã.

3.4.1 Kịch bản Ruby Trong các chương trình nói chung, một kịch bản-Script là một tập tin có chứa các lệnh

để điều khiển một chương trình đang chạy. Kịch bản UNIX hướng các lệnh tới chương trình Shell trong Linux, chẳng hạn như Bash. Trong Windows, kịch bản được viết trong VBScript để tương tác với hệ điều hành và chạy các chương trình này giống như hệ điều hành DOS.

Tất cả các kịch bản được trình bày trong cuốn sách này đều hướng về SketchUp. Bạn có thể viết một kịch bản SketchUp trong bất kỳ trình soạn thảo văn bản nào mà bạn chọn, nhưng hãy luôn nhớ rõ ba điều sau trong đầu:

1. Các lệnh trong một kịch bản cho SketchUp phải được viết bằng ngôn ngữ lập trình Ruby.

2. Những tập tin kịch bản không được mã hóa thì đuôi file của nó phải là *.rb ( ví dụ file Hello.rb). Đuôi file của những tập tin kịch bản được mã hóa phải là *.rbs ( ví dụ file Hello.rbs) .

3. Để thực thi một kịch bản, nó phải được nạp vào trong SketchUp . Điều cuối cùng này rất quan trọng. Một trong những lệnh Ruby hữu ích nhất cần phải

biết là lệnh load (nạp). Khi một tập tin kịch bản-Script file nằm trong thư mục qui định (Plugins) của SketchUp, thì load ra lệnh cho SketchUp đọc kịch bản đó và thực thi các lệnh trong đó theo trình tự.

Ví dụ sau cung cấp cho chúng ta một ví dụ đầu tiên về đoạn mã trong kịch bản.

star.rb

# Access the current Entities object

Page 38: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

38

ents = Sketchup.active_model.entities

=begin

Create five points in three dimensions

Each point is the vertex of a star shape

=end

pt1 = [0, 1, 0]

pt2 = [0.588, -0.809, 0]

pt3 = [-0.951, 0.309, 0]

pt4 = [0.951, 0.309, 0]

pt5 = [-0.588, -0.809, 0]

# Draw five lines in a star pattern

ents.add_line pt1, pt2 ents.add_line pt2, pt3 ents.add_line pt3, pt4 ents.add_line pt4, pt5 ents.add_line pt5, pt1

Các đoạn mã ví dụ trong các tập tin kịch bản-Script cho cuốn sách này có thể tải về từ địa chỉ http://www.autosketchup.com, và nó bao gồm các thư mục có tên như CH3, CH4, và CH5 (CH viết tắt của Chapter). Nếu trang web này không còn tồn tại nữa thì đừng lo lắng, tôi sẽ gửi chúng cho bạn kèm theo cuốn sách này.

Bạn hãy chép tập tin start.rb vào thư mục Plugins nằm trong thư mục mà SketchUp được cài đặt trên máy tính của bạn .Vị trí của thư mục này phụ thuộc vào hệ điều hành của bạn:

Win7 C:\Program Files (x86)\SketchUp\SketchUp 2013\Plugins

WinXP C:\Program Files\SketchUp\SketchUp 2013\Plugins Nếu bạn đặt các tập tin kịch bản nằm bên trong các thư mục con của thư mục Plugins ( ví

dụ: …/Plugins/Ch3 hoặc …/Plugins/Ch4 …), thì bạn cũng có thể dễ dàng thực thi tập tin kịch bản star.rb.Trong SketchUp, mở hộp thoại Ruby console và nhập vào dòng lệnh sau:

load "Ch3/star.rb"

Dòng lệnh này ra lệnh cho SketchUp truy xuất vào tập tin kịch bản star.rb và thực thi các lệnh có trong đó theo trình tự. Việc này sẽ tạo ra một hình ngôi sao trong mặt phẳng xy và tâm của hình đó là gốc tọa độ. Hình sau cho thấy kết quả của hình dạng tạo ra trông như thế nào.

Page 39: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

39

Nếu bạn không thể nhìn thấy mô hình ngôi sao một cách rõ ràng, chọn trình đơn Camera trên meu chính của SketchUp và chọn Standard View rồi Top. Sau đó, vẫn trên trình đơn Camera chọn Parallel Projection. Cuối cùng, vào công cụ Zoom Extents để khung nhìn tập trung vào mô hình mới dựng. Và quan trong bạn phải nhớ là đơn vị Inch được dùng để dựng mô hình này nên bạn phải chọn đơn vị hệ thống (Model Info/Units>Length Units) trong SketchUp cho phù hợp.

Nếu bạn không thích đặt các tập tin kịch bản của bạn trong thư mục Plugins của SketchUp thì bạn có thể đặt ở bất kỳ nơi nào mà bạn muốn. Và để truy cập vào một tập tin kịch bản bên ngoài thư mục Plugins, hãy gọi ra load với đầy đủ đường dẫn chứa tập tin kịch bản của bạn.Ví dụ, nếu bạn đã lưu tập tin vào thư mục như C :/ ruby_scripts , bạn có thể tải star.rb với lệnh sau đây :

load "C:/ruby_scripts/star.rb"

Trong các phần còn lại của cuốn sách này, các ví dụ sẽ rơi vào một trong hai loại là ví dụ lệnh và đoạn mã.

Ví dụ lệnh là tập hợp các lệnh dùng để chứng minh các khái niệm đơn giản. Chúng có thể được nhập trực tiếp trong hộp thoại Ruby console ( như trong các ví dụ ở phần đầu chương).

Đoạn mã-code listing như ví dụ trên, được được chứa trong các tập tin kịch bản đính kèm theo các chương (ví dụ như file star.rb ). Mỗi tập tin kịch bản này có thể được thực thi bằng cách gọi ra lệnh load trong hộp thoại Ruby console.

3.4.2 Chú thích trong Ruby Trong ví dụ đầu tiên về đoạn mã có chứa một khía cạnh khác của Ruby mà chúng ta đã

chưa gặp phải trước đó: “chú thích”-comment. Một chú thích là một lưu ý được đặt bên trong kịch bản mô tả những gì mà dòng mã sẽ thực thi.

Chú thích trong Ruby có hai loại :

1.Một dòng chú thích : Bắt đầu với ký tự # và viết chú thích cho đến hết dòng đó.

2 .Nhiều dòng chú thích:

Bắt đầu với = begin

Viết các dòng chú thích,

Kết thúc với = end.

Bất kỳ dòng mã nào được đặt trong một chú thích sẽ không được xử lý khi Ruby biên dịch. Vì vậy, bạn có thể viết bất cứ điều gì bạn thích trong một chú thích, miễn là nó đúng cú pháp.

Có ba chú thích trong tập tin kịch bản star.rb. Chú thích đầu tiên là:

# Access the Entities object

Nó dải thích dòng mã đầu tiên ( truy xuất đối tượng Entities). Chú thích thứ hai là:

=begin

Create five points in three dimensions

Each point is the vertex of a star shape

=end

Page 40: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

40

Nó miêu tả mục đích của việc khai báo năm biến ( Tạo ra năm điểm trong không gian 3D và mỗi điểm sẽ là một đỉnh-đối tượng Vertex của hình ngôi sao). Chú thích thứ ba là:

# Draw five lines in a star pattern

Giải thích năm dòng cuối cùng thực hiện việc gì ( Dựng năm cạnh của một hình ngôi sao). Tạo chú thích thường xuyên là một khía cạnh quan trọng của lập trình viên chuyên nghiệp không chỉ để những người khác có thể đọc được kịch bản của bạn mà còn để bản thân gợi nhớ đến mục đính hoạt động của dòng mã.

3.5 Vector. Trước khi trình bày về cách thức dựng một đường cong, bạn cần phải có một hiểu biết cơ

bản về vectơ. Từ Vector có nhiều ý nghĩa khác nhau tùy thuộc vào việc bạn đang trình bày về toán học, vật lý hay kỹ thuật. Trong SketchUp, chúng ta chủ yếu sử dụng vector để xác định hướng. Vì lý do này, chúng tôi sẽ thể hiện các vector dưới dạng đồ họa hình mũi tên. Hình sau mô tả một số vectơ trong một không gian ba chiều của SketchUp.

Do chỉ để xác định hướng nên vector trong SketchUp cũng là một đoạn thẳng xác định

bởi hai điểm: Điểm thứ nhất trùng với gốc tọa độ và điểm thứ hai dùng để xác định hướng và chiều của nó như ở trong hình trên, chiều dương của vector chính là chiều của mũi tên.

Chính vì thế mà trong mã hóa, một vector được xác định bởi ba trị số. Trị số đầu tiên xác định vị trí điểm thứ hai của nó theo hướng trục x ( hoặc gọi hoành độ của nó), trị số thứ hai xác định vị trí điểm thứ hai của nó theo hướng trục y ( hoặc gọi tung độ của nó) và trị số thứ ba xác định vị trí điểm thứ hai của nó theo hướng trục z ( hoặc gọi tung độ của nó). Và những trị số này được gọi là các thành phần của một vector. Một vector sẽ được miêu tả là một mảng [ a, b, c ] trong đó phần tử a là hoành độ, phần tử b là tung độ và phần tử c là tung độ.

Trong SketchUp, một vector pháp tuyến-nomal vector là một loại cụ thể của vector sẽ được dùng để xác định hướng của một hình dạng là bề mặt. Véc tơ pháp tuyến của một bề mặt ( hoặc mặt phẳng) là một vector vuông góc với bề mặt đó. Một lưu ý quan trọng là trong SketchUp một bề mặt sẽ có hai mặt là mặt trước (front face) và mặt sau (back facce) của nó, và mặt trước là mặt cùng chiều với chiều của vecto, còn mặt sau thì ngược lại.

Ví dụ, nếu bạn dựng một bề mặt hình tròn trong mặt phẳng xy và bạn muốn nó hướng mặt trước lên trên ( cùng chiều trục z), một vector pháp tuyến được chấp nhận là [ 0, 0, 1 ], vector pháp tuyến này trùng và cùng chiều với trục z dương. Nếu vector pháp tuyến được thiết lập là [ 0, 0, -1] thì bề mặt sẽ có mặt trước quay xuống dưới (ngược chiều trục z), vector pháp tuyến này trùng và ngược chiều với trục z dương.

Một câu hỏi đặt ra là. Tại sao chúng ta không cần đến vector pháp tuyến khi dựng hình dạng ngôi sao trong đoạn mã ví dụ trên, nhưng chúng ta lại cần vector pháp tuyến để dựng đường cong tròn (vòng cung hay vòng tròn)? Câu trả lời là các đoạn thẳng hình thành lên ngôi

Page 41: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

41

sao là loại một chiều. Chúng có chiều dài, nhưng không có diện tích. Khi bạn chọn một điểm bắt đầu và điểm kết thúc thì chỉ có một đoạn thẳng duy nhất được xác định

Nhưng nếu tất cả cái bạn có là một điểm tâm và một bán kính của một vòng tròn hoặc vòng cung thì bạn không thể xác định được chính xác đường cong tròn cần dựng. Vì sẽ có vô hạn các vòng tròn hoặc vòng cung có thể được dựng lên từ một điểm tâm xác định và một bán kính khác không. Nghĩa là các vòng tròn hoặc vòng cung đó sẽ nằm trên một hình cầu và bán kính trùng với tâm và bán kính của vòng tròn hoặc vòng cung cần dựng. Điều này được thể hiện trong hình sau.

Để xác định được vòng tròn hoặc vòng cung cần dựng, bạn phải xác định thêm các điểm

thuộc chúng. Nhưng sẽ dễ dàng hơn khi bạn chỉ rõ véc tơ pháp tuyến cho mặt phẳng chứa đựng vòng tròn hoặc vòng cung đó. Nếu bạn phủ kín một vòng tròn thì đó sẽ trở thành một bề mặt và mặt trước của nó sẽ cùng chiều với vector pháp tuyến, và nếu bạn sử dụng công cụ Push / Pull của SketchUp để tạo ra một hình trụ từ bề mặt đó thì phương của vector pháp tuyến chính là hướng kéo theo.

3.6 Đường cong, vòng tròn, vòng cung và đa giác. Bạn có thể sử dụng công cụ Arc và Circle của SketchUp để dựng hình, nhưng bạn

không thực sự tạo ra cung và vòng tròn như trong các phần mềm như Autocad. Thay vào đó, các cung và vòng tròn trông giống như là một chuỗi gồm nhiều đoạn thẳng nhỏ liên tục nối tiếp nhau. Trong mã hóa, lớp Entities chứa đựng ba phương thức để tạo ra các hình dạng giống đường cong, và mỗi phương thức trong số chúng sẽ trả về một mảng các các đối tượng Edge. Ba phương thức là add_curve, add_circle và add_arc. Và một phương thức dùng để dựng đa giác là add_ngon.

3.6.1 Đường cong Phương thức để tạo ra đường cong đơn giản nhất add_curve. Nó chấp nhận một loạt

các điểm liên tiếp nhau và trả về mảng các đối tượng Edge kết nối giữa các điểm. Ví dụ, các lệnh sau đây tạo ra hình dạng ngôi sao giống như ở mục 3.4.1 trước đó của chương.

pt1 = [0, 1, 0]

pt2 = [0.588, -0.809, 0]

pt3 = [-0.951, 0.309, 0]

pt4 = [0.951, 0.309, 0]

pt5 = [-0.588, -0.809, 0]

curve = Sketchup.active_model.entities.add_curve pt1, pt2,

pt3, pt4, pt5, pt1

curve.class

Page 42: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

42

Array

curve.length

5

Ở đây, phương thức add_curve tạo ra một mảng gồm năm đối tượng Edge, và kết quả thực sự là một đường polyline (đường nhiều nét) thay vì là một đường cong tròn. Bổ sung thêm các điểm, để chúng sít vào nhau thì đường polyline sẽ trở nên giống như một đường cong tròn. Thông thường, sử dụng phương thức add_circle và add_arc sẽ dễ dàng hơn khi tạo đường cong tròn.

3.6.2 Vòng tròn Phương thức add_circle tạo ra một vòng tròn với một điểm tâm, vector pháp tuyến,

và bán kính. Vector pháp tuyến dùng để xác định phương vuông góc với mặt phẳng chứa vòng tròn. Ví dụ, lệnh sau đây tạo ra một vòng tròn với tâm tại điểm [ 1 , 2, 3 ], vector pháp tuyến [ 4, 5, 6] và bán kính là 7 :

circle = Sketchup.active_model.entities.add_circle [1, 2,

3], [4, 5, 6], 7

circle.class

Array

circle.length

24

circle[0].class

Edge

Phương thức add_circle tạo ra một mảng gồm 24 đối tượng Edge, trong đó góc ở tâm chắn một cạnh của đường tròn là 15 °. 24 là số phân đoạn mặc định trong một vòng tròn, bất kể bán kính hoặc sự định hướng. Tuy nhiên, bạn có thể thêm một tham số thứ tư cho phương thức add_circle để tùy chỉnh số lượng phân đoạn trong vòng tròn.

Ví dụ, lệnh sau đây tạo ra một vòng tròn với 72 phân đoạn: circle = Sketchup.active_model.entities.add_circle [1, 2,

3], [4, 5, 6], 7, 72

Hình sau cho thấy sự xuất hiện của một vòng tròn bị ảnh hưởng bởi số lượng phân đoạn của nó. Vòng tròn có 72 phân đoạn gần đúng với hơn một vòng tròn trong thực tế hơn so với vòng tròn 24 phân đoạn hoặc vòng tròn 12 phân đoạn, nhưng hoạt động trên vòng tròn nhiều phân đoạn tức nhiều đối tượng Edge sẽ đòi hỏi nhiều thời gian hơn.

Page 43: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

43

Vòng tròn càng có ít các phân đoạn thì nó sẽ càng trông giống như một đa giác. Nếu bạn chỉ định một số phân đoạn là năm, add_circle sẽ tạo ra một hình ngũ giác. Tuy nhiên, phương thức add_ngon được gọi ra để tạo đa giác là phổ biến hơn. Và điều này sẽ được trình bày ở phần tiếp theo.

3.6.3 Đa giác Phương pháp thức add_ngon giống gần như hệt add_circle , và hai phương thức

đều tạo các hình về cơ bản là giống nhau. Sự khác biệt duy nhất là số lượng phân đoạn, với add_circle thì số lượng phân đoạn mặc định là 24 nhưng bạn có thể tùy chọn thiết lập một số khác. Phương thức add_ngon không có số lượng phân đoạn mặc định nên bạn luôn luôn phải chỉ định số lượng các phân đoạn của đa giác trong mã hóa.

Để làm rõ điều này, đoạn mã trong kịch bản sau tạo ra bốn hình dạng là: một đa giác có 8 cạnh, một vòng tròn với 8 phân đoạn, một đa giác có 24 cạnh và một vòng tròn có 24 phân đoạn.

poly_circle.rb

ents = Sketchup.active_model.entities

normal = [0, 0, 1] radius = 1

# Polygon with 8 sides

ents.add_ngon [0, 0, 0], normal, radius, 8

# Circle with 8 sides

ents.add_circle [3, 0, 0], normal, radius, 8

# Polygon with 24 sides

ents.add_ngon [6, 0, 0], normal, radius, 24

# Circle with 24 sides

ents.add_circle [9, 0, 0], normal, radius

Để quan được các hình dạng tạo ra, chọn trình đơn Camera trên meu chính của

SketchUp và chọn Standard View rồi Top . Sau đó, vẫn trên trình đơn Camera chọn Parallel Projection. Cuối cùng, vào công cụ Zoom Extents để khung nhìn tập trung vào hình dạng mới dựng.

3.6.4 Vòng cung Tạo ra một vòng cung tương tự như việc tạo ra một vòng tròn, nhưng các tham số bổ

sung là cần thiết. Trước tiên, bạn phải xác định góc bắt đầu và góc kết thúc. Các góc phải được đo (đơn vị đo góc là radian) từ một trục, vì vậy bạn cần phải xác định 1 vector để nó được coi là cạnh radian 0 để giúp việc đo. Danh sách sau chứa đầy đủ của các tham số cho cho add_arc:

Page 44: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

44

• center – Một điểm xác định tâm của vòng cung

• zero_vec – Một vector xác định hướng của góc 0 (cả radian lẫn độ đều bằng 0).

• normal – Một vector pháp tuyến, vuông góc với mặt phẳng chứa vòng cung

• radius – Bán kính của vòng cung

• start_angle – Góc bắt đầu, tính từ vector zero_vec

• end_angle - Góc kết thúc, tính từ vector zero_vec

• num_segments ( không bắt buộc chọn) – Số lượng các phân đoạn cho vòng cung

Lệnh sau đây tạo ra một vòng cung có tâm-center tại [ 0, 0, 0] góc bắt đầu- start_angle là 0 ° , góc kết thúc-end_angle là 90 ° . Các góc bắt đầu được đo từ trục y dương, vì vậy vector-zero_vec là [ 0, 1, 0]. Vòng cung có bán kính-radius là 5 và nằm trong mặt phẳng xy , vì vậy vector pháp tuyến-normal của nó là [ 0, 0, 1 ]. Số lượng các phân đoạn- num_segments để giá trị mặc định của nó (tức không nhập).

arc = Sketchup.active_model.entities.add_arc [0,0,0],

[0,1,0], [0,0,1], 5, 0, 90.degrees

arc.length

6

Cung có góc chắn ở tâm là 900 và cung có chứa 6 đối tượng Edge, nên mỗi cạnh của nó sẽ bị chắn bởi với góc ở tâm là 150 và nó giống với vòng tròn có 24 phân đoạn. Bạn có thể thêm các phân đoạn cho vòng cung bằng cách thêm một tham số cho phương thức add_arc.

Phụ lục B trình bày một phương thức tạo một vòng cung từ ba điểm cho trước. Nó thuận tiện hơn so với phương thức add_arc, phương thức đòi hỏi bạn phải biết cả tâm lẫn bán kính của vòng cung.

3.7 Tạo ra hình dạng trong 3 D Bây giờ bạn đã tạo ra được đoạn thẳng và đường cong, và bạn cũng đã sẵn sàng để bắt

đầu xây dựng bề mặt. Đây là những bề mặt kín hai chiều mà SketchUp lấp đầy bằng màu sắc. Một khi bạn đã tạo ra một đối tượng bề mặt, thật dễ dàng để đùn ép nó thành một khối ba chiều bằng cách sử dụng các cơ chế tương tự như các công cụ Push / Pull và Follow Me của SketchUp.

3.7.1 Tạo ra một bề mặt Đối tượng Face được tạo ra bằng phương thức add_face của lớp Entities. Điều

này cũng tương tự như phương thức add_curve mô tả ở trên: nó chấp nhận một loạt các điểm hoặc một loạt các cạnh, và chúng có thể được cung cấp trong một danh sách có dấu phẩy ngăn cách hoặc trong một mảng. Ví dụ, tập tin kịch bản pentagon.rb sau đây đựng lên một bề mặt ngũ giác từ năm điểm:

pentagon.rb

# Create the five points of the pentagon

Page 45: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

45

pt1 = [0, 1, 0]

pt2 = [-0.951, 0.309, 0]

pt3 = [-0.588, -0.809, 0]

pt4 = [ 0.588, -0.809, 0]

pt5 = [ 0.951, 0.309, 0]

# Draw the face

pent = Sketchup.active_model.entities.add_face pt1, pt2, pt3, pt4, pt5

# Display the locations of the stored vertices

puts "Point 0: " + pent.vertices[0].position.to_s

puts "Point 1: " + pent.vertices[1].position.to_s

puts "Point 2: " + pent.vertices[2].position.to_s

puts "Point 3: " + pent.vertices[3].position.to_s

puts "Point 4: " + pent.vertices[4].position.to_s

Hình sau cho thấy kết quả tạo ra trông như thế nào trong không gian làm việc của

SketchUp, toàn bộ bề mặt của một đối tượng Face được lấp kín.

Lệnh Puts trong đoạn mã trên sẽ hiển thị thứ tự và tọa độ các đỉnh của ngữ giác trong hộp thoại Ruby console như sau:

Khi bạn xác định các điểm để tạo ra một bề mặt-Face, thứ tự của chúng trong mã hóa là

rất quan trọng. Nếu bạn hoán đổi vị trí giữa điểm pt2 và pt3 trong danh sách các tham số, thì hình dạng tạo ra sẽ không có bất cứ điểm gì để nó trông giống như một hình ngũ giác. Tuy

Page 46: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

46

nhiên, sự định hướng của điểm ( theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ ) là không quan trọng. Cho dù các điểm được liệt kê từ pt1 đến pt5 hoặc từ pt5 đến pt1 thì đối tượng bề mặt kết quả vẫn giống nhau.

Tuy nhiên, nhìn vào kết quả hiển thị thứ tự và tọa độ đỉnh trong hợp thoại Ruby console. Bạn có thể thấy rằng thứ tự các đỉnh của đối tượng Face xắp xếp theo một trật tự hoàn toàn khác so với thứ tự các điểm đã được liệt kê trong đoạn mã. Khi thực thi đoạn mã này thì phương thức add_face đã thiết lập pt2 là đỉnh bắt đầu-Point 0 của ngũ giác và sắp xếp các đỉnh theo chiều ngược chiều kim đồng hồ, và vector pháp tuyến luôn luôn chỉ xuống nên mặt trước (front face) của bề mặt này quay xuống dưới.

Để trả về thứ tự xắp xếp các đỉnh đúng như trong danh sách liệt kê, nghĩa là pt1 là đỉnh bắt đầu-Point 0, xắp xếp thứ tự các đỉnh theo chiều cùng chiều kim đồng hồ và vector pháp tuyến hướng lên trên tức là mặt trước của ngũ giác quay lên trên ( cùng chiều với trục z) thì bạn có thể thêm dòng mã sau vào dưới dòng mã dựng bề mặt đa giác trong đoạn mã trên:

pent.reverse!

Pentagon_rev_no.rb

# Create the five points of the pentagon

pt1 = [0, 1, 0]

pt2 = [-0.951, 0.309, 0]

pt3 = [-0.588, -0.809, 0]

pt4 = [ 0.588, -0.809, 0]

pt5 = [ 0.951, 0.309, 0]

# Draw the face

pent = Sketchup.active_model.entities.add_face pt1, pt2, pt3, pt4, pt5

# Reverse order list and normal vector

pent.reverse!

# Display the locations of the stored vertices

puts "Point 0: " + pent.vertices[0].position.to_s

puts "Point 1: " + pent.vertices[1].position.to_s

puts "Point 2: " + pent.vertices[2].position.to_s

puts "Point 3: " + pent.vertices[3].position.to_s

puts "Point 4: " + pent.vertices[4].position.to_s

Vector pháp tuyến của một bề mặt xác định chiều đùn ép khi tạo thành khối 3D của nó .

Ví dụ, nếu các điểm vector pháp tuyến của bề mặt trên quay xuống dưới ( cùng chiều trục z âm) thì phương thức pushpull sẽ kéo nó xuống. Nhưng có nhiều khối 3D, để tạo ra nó đòi hỏi phải kéo bề mặt hướng lên vì vậy bạn có thể cần đảo ngược chiều của vector pháp tuyến bằng cách gọi ra phương thức reverse!có trong lớp Face.

Page 47: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

47

3.7.2 Các phương thức về đặc trưng hình học của lớp Face Một khi bạn đã tạo ra một bề mặt-Face, bạn có thể gọi các phương thức có trong lớp

Face để kiểm tra các thuộc tính của nó hoặc đùn ép nó thành một khối 3D. Một số phương thức Face thực hiện với vật liệu-material và khoa văn-texture, và chúng sẽ được khám phá trong các chương sau. Ngay bây giờ, chúng tôi sẽ xem xét các phương thức phân tích các đặc trưng hình học của Face.

Hầu hết các phương thức của lớp Face cung cấp thông tin về các đặc trưng hình học của nó: phương thức edges về một mảng gồm các đối tượng cạnh-Edge tạo nên bề mặt và phương thức vertices trả về một mảng gồm các đối tượng đỉnh-Vertex của bề mặt. Phương thức area trả về diện tích của bề mặt và phương thức normal trả về vector pháp tuyến của nó .

Phương pháp classify_point chấp nhận một điểm và xác định vị trí tương đối của điểm đó với với bề mặt. Điều này rất hữu ích khi bạn cần phát hiện các giao cắt hoặc xác định xem bề mặt nào mà người dùng đã kích chuột vào. Phương thức trả về một trong sáu giá trị sau :

• 0 – Điểm không xác định.

• 1 – Điểm nằm trong bề mặt.

• 2 – Điểm nằm trên một cạnh của bề mặt.

• 4 – Điểm là một trong các đỉnh của bề mặt.

• 8 – Điểm nằm trong mặt phẳng có chứa bề mặt nhưng nó không thuộc bề mặt.

• 16 – Điểm không nằm trong mặt phẳng có chứa bề mặt.

Các lệnh sau đây tạo ra một bề mặt hình vuông có trọng tâm trùng với gốc tọa và thể hiện cách thức mà phương thức classify_point xác định vị trí tương đối của một điểm với nó:

face = Sketchup.active_model.entities.add_face [-1, -1, 0], [-1, 1, 0], [1, 1, 0], [1, -1, 0]

face.classify_point [0, 0, 0]

1 face.classify_point [1, 1, 0]

4 face.classify_point [1, 2, 0]

8 face.classify_point [1, 1, 1]

16

Phương thức outer_loop của lớp Face trả về một đối tượng Loop có chứa các cạnh của bề mặt. Phương thức loops trả về một mảng gồm các đối tượng Loop tiếp giáp với bề mặt. Đối tượng Loop rất hữu ích trong cấu trúc liên kết nhưng sẽ không được tìm hiểu trong cuốn sách này.

3.7.3 Phương thức pushpull Lớp Face cung cấp hai phương thức để đùn ép thành khối 3D từ các bề mặt hai chiều là:

pushpull và followme. Chúng thực hiện các hoạt động tương tự như công cụ Push / Pull và Follow Me của SketchUp.

Page 48: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

48

Phương thức pushpull rất đơn giản để sử dụng và hiểu được nó. Nó chấp nhận một số nguyên, và nếu các số nguyên đó là dương thì phương thức sẽ kéo bề mặt dọc theo vector pháp tuyến của bề mặt đó và tạo một khối 3 chiều. Nếu số nguyên có giá trị âm thì phương thức này sẽ đẩy bề mặt theo chiều ngược lại chiều của vector pháp tuyến. Nếu một bề mặt của một khối 3 chiều được đẩy bằng một cách nào đó lùi sâu vào trong lòng thì thể tích của nó sẽ bị giảm đi.

Để loại bỏ một phần của một khối ba chiều, tạo ra một hoặc nhiều đối tượng cạnh- Edge bao quanh phần sẽ bị loại bỏ. Phần bị chặn này sẽ trở thành một bề mặt mới. Gọi ra phương thức pushpull trên khuôn mặt này với một giá trị âm để cắt nó ra khỏi khối ban đầu.

Đoạn mã trong tập tin kịch bản cutbox.rb sau cho thấy sự làm việc này trong thực tế. Nó bắt đầu với một bề mặt hình chữ nhật và đùn ép nó để tạo thành một khối hình hộp chữ nhật. Sau đó nó vẽ một đoạn thẳng chắn góc của bề mặt trên cùng phía bên phải, gọi ra pushpull để loại bỏ khối góc này khỏi khối hình hộp.

cutbox.rb

# Create the box

ent = Sketchup.active_model.entities

main_face = ent.add_face [0,0,0], [6,0,0], [6,8,0], [0,8,0] main_face.reverse!

main_face.pushpull 5 # Draw a line across the upper-right corner

cut = ent.add_line [6,6,5], [4,8,5] # Remove the new face

cut.faces[1].pushpull -5

Trình tự thực hiện có đoạn mã trên sẽ diễn ra như hình dưới đây:

Page 49: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

49

Lệnh cuối cùng là sự phân tích kỹ lưỡng rất đáng giá. Đối tượng bề mặt- Face thứ hai trong góc không được tạo ra một cách rõ ràng trong đoạn mã. Thay vào đó, nó sẽ tự động xây dựng khi Edge mới được dựng chắn qua góc của bề mặt trên cùng. Sau khi dựng, Edge này được kết nối với hai bề mặt: một là đại diện bề mặt chính và một đại diện cho bề mặt góc .Mỗi Edge có thể truy xuất vào một mảng bao gồm các đối tượng mặt liền kề của nó, và bề mặt mới có chỉ số-Index là 1. Do đó, dòng mã lệnh:

cut.faces[1].pushpull -5

đùn bề mặt thứ hai đi xuống, loại bỏ khối góc khỏi khối hình hộp.

3.7.4 Phương thức followme

Khi bạn gọi pushpull, bạn có thể đùn ép theo một trong hai hướng: cùng chiều với vector pháp tuyến của bề mặt và ngược chiều với vector pháp. Với phương thức followme, sự đùn ra vẫn thực hiện dọc theo một véc tơ, nhưng bây giờ bạn điều khiển hướng của vector. Có nghĩa là bạn chỉ định đường dẫn cho việc đùn ra.

Đường dẫn đùn ra có thể được xác định với một hoặc nhiều cạnh. Nếu đường dẫn có nhiều hơn một cạnh thì hai yêu cầu phải được đáp ứng:

1. Các cạnh tạo thành đường dẫn đùn ra phải được kết nối với nhau.

2. Tất cả các cạnh tạo thành đường dẫn đùn ra không được nằm cùng trong mặt phẳng chứa bề mặt được đùn ra.

Một khi bạn đã xác định được đường dẫn, bạn có thể gọi ra phương thức followme với một mảng bao gồm các cạnh của đường dẫn. Nó sẽ đùn bề mặt dọc theo mỗi cạnh của đường dẫn đùn ra.

Đoạn mã trong tập tin kịch bản followme.rb sau cho thấy cách thức làm việc này. Nó tạo ra một bề mặt tròn và đùn nó dọc theo các cạnh của một hình chữ nhật.

Listing 3.5: followme.rb

# Access the Entities container

model = Sketchup.active_model

ent = model.entities

# Create the primary face

circle = ent.add_circle [0,0,0], [0,0,1], 2

circle_face = ent.add_face circle

# Create the path

path = ent.add_curve [10,0,0], [10,0,5], [10,5,5], [10,5,0], [10,0,0]

# Extrude the circle along the path

circle_face.followme path

Phía bên trái của hình sau đây cho thấy bề mặt ban đầu và đường dẫn đùn ra hình chữ

nhật. Phía bên phải cho thấy khối 3 chiều được tạo ra bởi phương thức followme.

Page 50: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

50

( Chọn View>hidden Geometry trên menu chính của SketchUp để có kết quả giống trên.)

Hãy xem xét một cách sử dụng khác của followme. Đoạn mã trong kịch bản sau tạo ra một cái bình bằng cách quay một bề mặt xung quanh một trục. Ở đây, bề mặt được xây dựng từ một mảng bao gồm nhiều điểm và được trả về bởi phương thức add_curve.

lathe.rb

# Access the Entities object model = Sketchup.active_model ents = model.entities

# Create the 2-D shape

curve = ents.add_curve [0, 0, 1.244209], [0.116554, 0, 1.238382], [0.160261, 0, 1.217985], [0.186486, 0, 1.188846],

[0.1894, 0, 1.165536], [0.17483, 0, 1.145139],

[0.142778, 0, 1.127656], [0.096157, 0, 1.118914],

[0.093243, 0, 1.063551], [0.175152, 0, 0.996269],

[0.175152, 0, 0.915269], [0.28237, 0, 0.871026],

[0.375392, 0, 0.801741], [0.448486, 0, 0.711683],

[0.497151, 0, 0.606398], [0.51839, 0, 0.492371],

[0.510894, 0, 0.376625], [0.475126, 0, 0.26629],

[0.413287, 0, 0.168161], [0.329188, 0, 0.088283],

[0.228007, 0, 0.031575], [0.115978, 0, 0.001531], [0, 0, 0], [0, 0, 1.244209] curve_face = ents.add_face curve

# Create the circular path

path = ents.add_circle [0, 0, 0], [0, 0, 1], 2

# Create the figure curve_face.followme path

Page 51: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

51

Phía bên trái của hình sau cho bề mặt hai chiều của cái bình và đường dẫn của nó là vòng tròn. Phía bên phải cho thấy chiếc bình được tạo ra bởi sản xuất bởi followme.

Như pushpull, phương thức followme có thể loại bỏ các phần của một khối ba chiều. Để làm điều này, tạo thành một bề mặt trên khối bằng cách tạo ra một hoặc nhiều đối tượng cạnh-Edge. Sau đó tạo ra đường dẫn bằng cách chọn các cạnh thuộc phần khối sẽ bị cắt bỏ. Gọi ra phương thức followme với đường dẫn để loại bỏ phần bị chặn .

Đoạn mã trong tập tin kịch bản sau cho thấy cách làm việc này. Nó tạo ra một khối hộp ba chiều và gọi followme để cắt bỏ các cạnh phí trên của hộp.

chamfer.rb

# Create the box

ents = Sketchup.active_model.entities

main_face = ents.add_face [0,0,0], [5,0,0], [5,8,0], [0,8,0]

main_face.reverse!

main_face.pushpull 6, true

# Draw a line across a corner

cut = ents.add_line [5, 7, 6], [5, 8, 5]

# Create the chamfer

cut.faces[0].followme main_face.edges

Hình ở giữa cho thấy hộp với một Edge được dựng chắn ngang qua góc trên cùng. Hình

bên phải hiển thị hộp bị vát sau followme được gọi.

Đường dẫn cắt thu được bằng cách gọi phương thức edges cho đối tượng bề mặt-Face

trên cùng của khối hộp. Điều này trả về mảng bao gồm các đối tượng cạnh-Edge bao bọc bề mặt trên cùng. Khi bạn cần phải áp dụng followme cho tất cả các cạnh của một bề mặt, gọi ra phương thức edges dễ dàng hơn việc xác định vị trí của từng đối tượng cạnh riêng rẽ.

Trong đoạn mã trên, phương thức pushpull được thêm một tham số thứ hai với thiết lập là true. Thông thường, pushpull sẽ xóa đi bề mặt được sử dụng để đùn ra khối 3 chiều. Nhưng tham số (true) không bắt buộc chọn này đảm bảo rằng main_face sẽ vẫn truy xuất

Page 52: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

52

được sau khi pushpull được gọi ra. Hãy nhớ lấy điều này nếu bạn nhận được bất kỳ lỗi “reference to deleted Face"-“tham chiếu đến bề mặt đã xóa" khi thực thi kịch bản của bạn.

3.7.5 Tạo ra một khối cầu Tất cả mọi người nên biết làm thế nào để tạo ra một khối cầu trong SketchUp, và giống

như các ví dụ trên, nó sẽ dễ dàng được thực hiện bởi phương thức followme. Trong trường hợp này, cả bề mặt và đường dẫn đùn ra là hai vòng tròn có tâm trùng nhau. Điều này được thể hiện trong hình sau.

Đoạn mã trong kịch bản sau tạo ra bề mặt hình tròn và đường dẫn vòng tròn, và sau đó

gọi followme đùn ra khối cầu. Lưu ý rằng, hai vòng tròn có tâm trùng nhau nhưng vector pháp tuyến vuông góc với nhau.

sphere.rb

# Access the Entities object

ents = Sketchup.active_model.entities

# Create the initial circle

center = [0, 0, 0]

radius = 5

circle = ents.add_circle center, [0, 0, 1], radius

circle_face = ents.add_face circle

# Create the circular path

path = ents.add_circle center, [0, 1, 0], radius + 1

# Create the sphere

circle_face.followme path

# Remove the path ents.erase_entities path

Dòng mã cuối cùng trong đoạn mã dùng để xóa đi các đối tượng cạnh tạo nên đường dẫn đùn ra. Đây là một chú ý quan trọng khi bạn sử dụng phương thức followme.

3.8 Kết thúc chương Chương này đã trình bày một lượng lớn thông tin, từ cấu trúc dữ liệu cơ bản của

SketchUp cho các đối tượng đại diện cho các hình dạng trong một dự án SketchUp. Phần đầu của chương này trình bày về mô-đun Sketchup, và phương thức của nó dùng để cung cấp toàn bộ các thông tin về phần mềm SketchUp. Ngược lại, lớp Model chỉ đại diện cho một dự án

Page 53: Chuong 1,2 va 3

Chương III SketchUp Scripting by [email protected]

53

SketchUp đang hiện hành và nó có thể được lưu thành một tập tin có đuôi mở rộng là *. skp. Một đối tượng Model được sử dụng như là một cái công tơ nơ: nó chứa đựng nhiều đối tượng như Entities, Materials, Layers, Tools và các thứ khác nữa.

Đối tượng Entities đặc biệt quan trọng bởi vì nó lưu trữ tất cả các đối tượng đồ họa trong dự án SketchUp hiện hành. Các đối tượng đồ họa này được gọi là các đối tượng Entity, và lớp Entity có một số lớp con quan trọng. Một lớp con là Drawingelement được sử dụng như là lớp cha của tất cả các hình dạng trong API SketchUp.

Phần cuối cùng của chương này trình bày về hình dạng thực tế được dùng để tạo nên các mô hình trong SketchUp: cạnh, nhiều cạnh, bề mặt và hình khối. Các lớp và phương thức của chúng thật là dễ hiểu, nhưng nó có thể sẽ khó khăn khi phối hợp tốt chúng lại với nhau để dựng hình. Vì vậy, tôi khuyên bạn nên thực hành tạo ra các đối tượng trong kịch bản: tạo bề mặt từ các cạnh và sử dụng phương thức pushpull và followme để đùn ép bề mặt thành khối ba chiều.

Ngoài ra, để hiểu các cách thức thực hiện của từng dòng mã trong các đoạn mã tập tin kịch bản thì tôi khuyên bạn nên chịu khó gõ lần lượt từng dòng mã này trong hộp thoại Ruby console của SketchUp.

API là viết tắt của cụm từ “application programming interface”, nghĩa là giao diện lập trình ứng dụng của SketchUp. API là một giao diện mà một hệ thống máy tính hay ứng dụng cung cấp để cho phép các yêu cầu dịch vụ có thể được tạo ra từ các chương trình máy tính khác, và/hoặc cho phép dữ liệu có thể được trao đổi qua lại giữa chúng. Chẳng hạn, một chương trình máy tính có thể (và thường là phải) dùng các hàm API của hệ điều hành để xin cấp phát bộ nhớ và truy xuất tập tin.