Computing Form and Shape: Python Programming with the Rhinoscript Library

Brought by: Kadenze

Overview

This course explores the role of computation in the conception and representation of form and shape. Learn Python programming language as a creative medium for design, architecture, art and beyond. Learners will develop, analyze and critique algorithmic approaches to digital drawing, modeling, and projection. Specifically, the powerful and robust Python Rhinoscript library will be introduced and explored in detail. This library allows Rhinoceros, the popular 3D graphics and computer-aided design (CAD) modeling software to be scripted with text-based code. Scripting in this manner can automate existing processes and can lead to novel kinds of relationships, and orders of shape and form.

Architects, sculptors, and any artist or designer interested in either fabrication or communication of form and shape will recognize the importance of projection–the the transformation of three-dimensional geometry onto a two-dimensional picture plane, cut sheet, paper, or screen. As a result, this course focuses not only on the generation of geometry, but the output of geometry.

In parallel to extending learners' technical proficiency, this course will touch on the conceptual and theoretical implications of algorithmic design. Each of the five lessons will build upon each other to develop an understanding of the Python language, algorithmic strategies, and digital geometric craft (the interrelated structures and topologies that make up digital models).

Syllabus

Session 1: Procedural Points 
Why design algorithmically? Students will understand the basics of Python syntax and organization of the Rhinoscript library. Students will be comfortable creating, running, and editing a basic script. Students will demonstrate a capacity to create, work with, and distinguish between point coordinates and point objects. Demonstrations: procedural point spiral, gradient point cloud. Session 2: Curves Vs. Curvature 
What is the nature of a curve? Students will demonstrate multiple methods for creating and editing curves–which is the topological term for one-dimensional objects including straight line segments. The class will explore the concept of the “blip” and the capacity of a set of curves to collectively define space. Demonstrations: Interpolated curves of various degrees before and after sorting; best fit circles; curve parameters, evaluating curves, and extraction of curve points for the purse of editing curves with looping. Assignment: Double-blip connection of curves: blip within each curve and blip in the aggregation of curves. Session 3: The Depth Of A Surface 
What is the nature of a surface? Students will demonstrate methods for creating and editing surfaces beginning with the Rhinoscript functions that correspond with the most commonly used surface tools in Rhinoceros: loft, sweep1 and networksurface. Demonstrations: lofting and list-management, rebuilding surfaces in sequence. Assignment: conditional surface–divide a surface into patches and cull based on some geometric criteria. Session 4: Deconstruction Of Surfaces, The Genesis Of Lines 
How can a surface generate lines? How can lines represent a surface? This week's lecture begins with an important premise: a surface is a 2-D space organized in terms of 'U' and 'V' axes that can be treated similarly to 'X' and 'Y' axes in Cartesian space. This allows drawing “in” a surface, trimming a surface based on U/V domains and the evaluation of surfaces based on 2-D parameters. Demonstration: Growing lines based on surface normals; surface to surface lines. Assignment: Hatch a terrain-like surface so that its geometry is revealed completely when viewed orthographically. Session 5: The Project Of Projection 
How can projection serve as a creative act? Students will explore methods for geometrically constructing perspective computationally and use projective methods for the creation of new forms and shapes. Demonstration: constructing and arraying set of perspectives using surface-plane intersection. Assignment: Represent the process of oblique projection-as would be used to create an oblique axnometric drawing–using a set of curves.

Taught by

Carl Lostritto

Computing Form and Shape: Python Programming with the Rhinoscript Library
Go to course

Computing Form and Shape: Python Programming with the Rhinoscript Library

Brought by: Kadenze

  • Kadenze
  • Free
  • English
  • Certificate Available
  • Available at any time
  • intermediate
  • N/A
8.1.2PHP Version320msRequest Duration2MBMemory UsageGET en/courses/{slug}Route
    • Booting (205ms)
    • Application (115ms)
    • 1 x Booting (63.92%)
      204.61ms
      1 x Application (35.83%)
      114.71ms
      14 templates were rendered
      • public.courses.show (resources/views/public/courses/show.blade.php)3bladefile
        Params
        0
        course
        1
        links
        2
        config
      • public.courses.partials.breadcrumbs (resources/views/public/courses/partials/breadcrumbs.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.courses.partials.heading (resources/views/public/courses/partials/heading.blade.php)7bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        classes
      • public.courses.partials.details (resources/views/public/courses/partials/details.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.courses.partials.breadcrumbs (resources/views/public/courses/partials/breadcrumbs.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.courses.partials.heading (resources/views/public/courses/partials/heading.blade.php)7bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        classes
      • public.layouts.main (resources/views/public/layouts/main.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.layouts.partials.meta (resources/views/public/layouts/partials/meta.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.layouts.partials.navbar (resources/views/public/layouts/partials/navbar.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.auth.profile.partials.links (resources/views/public/auth/profile/partials/links.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      • public.auth.profile.partials.link (resources/views/public/auth/profile/partials/link.blade.php)8bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        route
        7
        title
      • public.auth.profile.partials.link (resources/views/public/auth/profile/partials/link.blade.php)8bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        route
        7
        title
      • public.auth.profile.partials.link (resources/views/public/auth/profile/partials/link.blade.php)8bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
        6
        route
        7
        title
      • public.layouts.partials.flash-session (resources/views/public/layouts/partials/flash-session.blade.php)6bladefile
        Params
        0
        __env
        1
        app
        2
        errors
        3
        course
        4
        links
        5
        config
      uri
      GET en/courses/{slug}
      middleware
      web, localize:en
      controller
      App\Http\Controllers\CourseController@show
      as
      en.courses.show
      namespace
      prefix
      /en
      where
      file
      app/Http/Controllers/CourseController.php:17-35
      6 statements were executed5.51ms
      • select * from `courses` where `slug_en` = 'computing-form-and-shape:-python-programming-with-the-rhinoscript-library' limit 1
        4.35ms/app/Http/Controllers/CourseController.php:20corspedia
        Metadata
        Bindings
        • 0. computing-form-and-shape:-python-programming-with-the-rhinoscript-library
        Backtrace
        • 17. /app/Http/Controllers/CourseController.php:20
        • 18. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 19. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 20. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • update `courses` set `visitors` = `visitors` + 1, `courses`.`updated_at` = '2025-02-20 05:15:19' where `id` = 716
        410μs/app/Http/Controllers/CourseController.php:21corspedia
        Metadata
        Bindings
        • 0. 2025-02-20 05:15:19
        • 1. 716
        Backtrace
        • 17. /app/Http/Controllers/CourseController.php:21
        • 18. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 19. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 20. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select `id`, `name_en`, `name_ar`, `topic_id`, `slug_en`, `slug_ar` from `subjects` where `subjects`.`id` in (1)
        210μs/app/Http/Controllers/CourseController.php:23corspedia
        Metadata
        Backtrace
        • 20. /app/Http/Controllers/CourseController.php:23
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 22. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 23. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 24. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select `id`, `name_en`, `name_ar`, `slug_en`, `slug_ar` from `topics` where `topics`.`id` in (1)
        150μs/app/Http/Controllers/CourseController.php:23corspedia
        Metadata
        Backtrace
        • 25. /app/Http/Controllers/CourseController.php:23
        • 26. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 27. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 28. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 29. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select * from `providers` where `providers`.`id` in (5) and `providers`.`deleted_at` is null
        170μs/app/Http/Controllers/CourseController.php:23corspedia
        Metadata
        Backtrace
        • 20. /app/Http/Controllers/CourseController.php:23
        • 21. /vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
        • 22. /vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:43
        • 23. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:260
        • 24. /vendor/laravel/framework/src/Illuminate/Routing/Route.php:205
      • select * from `html_files` where `html_files`.`id` = 710 limit 1
        220μs/app/Models/Course.php:84corspedia
        Metadata
        Bindings
        • 0. 710
        Backtrace
        • 21. /app/Models/Course.php:84
        • 28. view::public.courses.show:29
        • 30. /vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:125
        • 31. /vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php:58
        • 32. /vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php:72
      App\Models\HtmlFile
      1
      App\Models\Provider
      1
      App\Models\Topic
      1
      App\Models\Subject
      1
      App\Models\Course
      1
        _token
        xgNx150GF2dGOpOrdvOpVRejvu41gYAWCuaAD16b
        locale
        en
        _previous
        array:1 [ "url" => "https://www.corspedia.com/en/courses/computing-form-and-shape:-python-programm...
        _flash
        array:2 [ "old" => [] "new" => [] ]
        PHPDEBUGBAR_STACK_DATA
        []
        path_info
        /en/courses/computing-form-and-shape:-python-programming-with-the-rhinoscript-library
        status_code
        200
        
        status_text
        OK
        format
        html
        content_type
        text/html; charset=UTF-8
        request_query
        []
        
        request_request
        []
        
        request_headers
        0 of 0
        array:24 [ "sec-ch-ua-mobile" => array:1 [ 0 => "?0" ] "sec-ch-ua" => array:1 [ 0 => ""HeadlessChrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"" ] "cache-control" => array:1 [ 0 => "no-cache" ] "pragma" => array:1 [ 0 => "no-cache" ] "cdn-loop" => array:1 [ 0 => "cloudflare; loops=1" ] "priority" => array:1 [ 0 => "u=0, i" ] "upgrade-insecure-requests" => array:1 [ 0 => "1" ] "user-agent" => array:1 [ 0 => "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" ] "cf-connecting-ip" => array:1 [ 0 => "18.224.64.19" ] "accept" => array:1 [ 0 => "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" ] "sec-fetch-site" => array:1 [ 0 => "none" ] "cf-visitor" => array:1 [ 0 => "{"scheme":"https"}" ] "sec-fetch-mode" => array:1 [ 0 => "navigate" ] "sec-fetch-user" => array:1 [ 0 => "?1" ] "x-forwarded-proto" => array:1 [ 0 => "https" ] "cf-ipcountry" => array:1 [ 0 => "US" ] "accept-encoding" => array:1 [ 0 => "gzip, br" ] "sec-fetch-dest" => array:1 [ 0 => "document" ] "sec-ch-ua-platform" => array:1 [ 0 => ""Windows"" ] "x-forwarded-for" => array:1 [ 0 => "18.224.64.19" ] "cf-ray" => array:1 [ 0 => "914c04a5ce31d2ec-ORD" ] "host" => array:1 [ 0 => "www.corspedia.com" ] "content-length" => array:1 [ 0 => "" ] "content-type" => array:1 [ 0 => "" ] ]
        request_server
        0 of 0
        array:50 [ "USER" => "www-data" "HOME" => "/var/www" "HTTP_SEC_CH_UA_MOBILE" => "?0" "HTTP_SEC_CH_UA" => ""HeadlessChrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"" "HTTP_CACHE_CONTROL" => "no-cache" "HTTP_PRAGMA" => "no-cache" "HTTP_CDN_LOOP" => "cloudflare; loops=1" "HTTP_PRIORITY" => "u=0, i" "HTTP_UPGRADE_INSECURE_REQUESTS" => "1" "HTTP_USER_AGENT" => "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)" "HTTP_CF_CONNECTING_IP" => "18.224.64.19" "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" "HTTP_SEC_FETCH_SITE" => "none" "HTTP_CF_VISITOR" => "{"scheme":"https"}" "HTTP_SEC_FETCH_MODE" => "navigate" "HTTP_SEC_FETCH_USER" => "?1" "HTTP_X_FORWARDED_PROTO" => "https" "HTTP_CF_IPCOUNTRY" => "US" "HTTP_ACCEPT_ENCODING" => "gzip, br" "HTTP_SEC_FETCH_DEST" => "document" "HTTP_SEC_CH_UA_PLATFORM" => ""Windows"" "HTTP_X_FORWARDED_FOR" => "18.224.64.19" "HTTP_CF_RAY" => "914c04a5ce31d2ec-ORD" "HTTP_HOST" => "www.corspedia.com" "REDIRECT_STATUS" => "200" "SERVER_NAME" => "corspedia.com" "SERVER_PORT" => "443" "SERVER_ADDR" => "141.95.147.152" "REMOTE_USER" => "" "REMOTE_PORT" => "65066" "REMOTE_ADDR" => "172.69.17.48" "SERVER_SOFTWARE" => "nginx/1.18.0" "GATEWAY_INTERFACE" => "CGI/1.1" "HTTPS" => "on" "REQUEST_SCHEME" => "https" "SERVER_PROTOCOL" => "HTTP/2.0" "DOCUMENT_ROOT" => "/var/www/corspedia/public" "DOCUMENT_URI" => "/index.php" "REQUEST_URI" => "/en/courses/computing-form-and-shape:-python-programming-with-the-rhinoscript-library" "SCRIPT_NAME" => "/index.php" "CONTENT_LENGTH" => "" "CONTENT_TYPE" => "" "REQUEST_METHOD" => "GET" "QUERY_STRING" => "" "SCRIPT_FILENAME" => "/var/www/corspedia/public/index.php" "PATH_INFO" => "" "FCGI_ROLE" => "RESPONDER" "PHP_SELF" => "/index.php" "REQUEST_TIME_FLOAT" => 1740028519.571 "REQUEST_TIME" => 1740028519 ]
        request_cookies
        []
        
        response_headers
        0 of 0
        array:5 [ "content-type" => array:1 [ 0 => "text/html; charset=UTF-8" ] "cache-control" => array:1 [ 0 => "no-cache, private" ] "date" => array:1 [ 0 => "Thu, 20 Feb 2025 05:15:19 GMT" ] "set-cookie" => array:2 [ 0 => "XSRF-TOKEN=eyJpdiI6ImppWld1Zklqb2k3cWJjVDl2bk52cVE9PSIsInZhbHVlIjoiYjZBQ29BeTR1bnRsSDBzcGVNNU5ZNjJ2eTExQlFkbmhpL2hJVnY1NjU0N3lsQktQMmZqc0VRLzdKb3ZGeTdxMCtQMmVGeTRhb053TUt5azNxZG52T2lxZk1PcVdBbTZldjVWT0cyNzVZRHBZZjZCMFJhQjhzcTVscHU5TFhDVlIiLCJtYWMiOiJmZmRiY2ZhNzdkNmEyODcyMzY2MDJhZDIyZmMwYjU5Y2I1MDg0YmZhY2M5NjkxZjg1YTcwYWJlZTAyNzE1MzEyIiwidGFnIjoiIn0%3D; expires=Thu, 20 Feb 2025 07:15:19 GMT; Max-Age=7200; path=/; samesite=laxXSRF-TOKEN=eyJpdiI6ImppWld1Zklqb2k3cWJjVDl2bk52cVE9PSIsInZhbHVlIjoiYjZBQ29BeTR1bnRsSDBzcGVNNU5ZNjJ2eTExQlFkbmhpL2hJVnY1NjU0N3lsQktQMmZqc0VRLzdKb3ZGeTdxMCtQMmVGe" 1 => "laravel_session=eyJpdiI6InpWVzgvVmlGQ1UrVi9TRlF5SHY4ZUE9PSIsInZhbHVlIjoiVGFoeFppVWtseVpZQmZXSnJiU2RpVDArc2FhZEJDSzFpWUhRRG9iNi9QQmdwbWZqbmwzV2EzVzJMYlhPSzUzbk0xeWpJWXQyTDhBVGhYcVhuckhJTlV2V1AxZHRiY1lVWWZoV3c3UHo4VUcwdml2akEyL0k5aFpWQkRnNEdtMUciLCJtYWMiOiI2YmY2YTBjNzAyYTRmMzQ5ZWI1OWNmNzQ3NzFiNmVlNDkzMGY0ZDJjYjVjNDBhNDM5MzgyODI3ODExNWNiYjdkIiwidGFnIjoiIn0%3D; expires=Thu, 20 Feb 2025 07:15:19 GMT; Max-Age=7200; path=/; httponly; samesite=laxlaravel_session=eyJpdiI6InpWVzgvVmlGQ1UrVi9TRlF5SHY4ZUE9PSIsInZhbHVlIjoiVGFoeFppVWtseVpZQmZXSnJiU2RpVDArc2FhZEJDSzFpWUhRRG9iNi9QQmdwbWZqbmwzV2EzVzJMYlhPSzUzbk0x" ] "Set-Cookie" => array:2 [ 0 => "XSRF-TOKEN=eyJpdiI6ImppWld1Zklqb2k3cWJjVDl2bk52cVE9PSIsInZhbHVlIjoiYjZBQ29BeTR1bnRsSDBzcGVNNU5ZNjJ2eTExQlFkbmhpL2hJVnY1NjU0N3lsQktQMmZqc0VRLzdKb3ZGeTdxMCtQMmVGeTRhb053TUt5azNxZG52T2lxZk1PcVdBbTZldjVWT0cyNzVZRHBZZjZCMFJhQjhzcTVscHU5TFhDVlIiLCJtYWMiOiJmZmRiY2ZhNzdkNmEyODcyMzY2MDJhZDIyZmMwYjU5Y2I1MDg0YmZhY2M5NjkxZjg1YTcwYWJlZTAyNzE1MzEyIiwidGFnIjoiIn0%3D; expires=Thu, 20-Feb-2025 07:15:19 GMT; path=/XSRF-TOKEN=eyJpdiI6ImppWld1Zklqb2k3cWJjVDl2bk52cVE9PSIsInZhbHVlIjoiYjZBQ29BeTR1bnRsSDBzcGVNNU5ZNjJ2eTExQlFkbmhpL2hJVnY1NjU0N3lsQktQMmZqc0VRLzdKb3ZGeTdxMCtQMmVGe" 1 => "laravel_session=eyJpdiI6InpWVzgvVmlGQ1UrVi9TRlF5SHY4ZUE9PSIsInZhbHVlIjoiVGFoeFppVWtseVpZQmZXSnJiU2RpVDArc2FhZEJDSzFpWUhRRG9iNi9QQmdwbWZqbmwzV2EzVzJMYlhPSzUzbk0xeWpJWXQyTDhBVGhYcVhuckhJTlV2V1AxZHRiY1lVWWZoV3c3UHo4VUcwdml2akEyL0k5aFpWQkRnNEdtMUciLCJtYWMiOiI2YmY2YTBjNzAyYTRmMzQ5ZWI1OWNmNzQ3NzFiNmVlNDkzMGY0ZDJjYjVjNDBhNDM5MzgyODI3ODExNWNiYjdkIiwidGFnIjoiIn0%3D; expires=Thu, 20-Feb-2025 07:15:19 GMT; path=/; httponlylaravel_session=eyJpdiI6InpWVzgvVmlGQ1UrVi9TRlF5SHY4ZUE9PSIsInZhbHVlIjoiVGFoeFppVWtseVpZQmZXSnJiU2RpVDArc2FhZEJDSzFpWUhRRG9iNi9QQmdwbWZqbmwzV2EzVzJMYlhPSzUzbk0x" ] ]
        session_attributes
        0 of 0
        array:5 [ "_token" => "xgNx150GF2dGOpOrdvOpVRejvu41gYAWCuaAD16b" "locale" => "en" "_previous" => array:1 [ "url" => "https://www.corspedia.com/en/courses/computing-form-and-shape:-python-programming-with-the-rhinoscript-library" ] "_flash" => array:2 [ "old" => [] "new" => [] ] "PHPDEBUGBAR_STACK_DATA" => [] ]