mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Merge pull request #2749 from Alhadis/maxscript
Add language support for MAXScript
This commit is contained in:
		
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							@@ -692,3 +692,6 @@
 | 
			
		||||
[submodule "vendor/grammars/FreeMarker.tmbundle"]
 | 
			
		||||
	path = vendor/grammars/FreeMarker.tmbundle
 | 
			
		||||
	url = https://github.com/freemarker/FreeMarker.tmbundle
 | 
			
		||||
[submodule "vendor/grammars/language-maxscript"]
 | 
			
		||||
	path = vendor/grammars/language-maxscript
 | 
			
		||||
	url = https://github.com/Alhadis/language-maxscript
 | 
			
		||||
 
 | 
			
		||||
@@ -347,6 +347,8 @@ vendor/grammars/language-javascript:
 | 
			
		||||
vendor/grammars/language-jsoniq/:
 | 
			
		||||
- source.jq
 | 
			
		||||
- source.xq
 | 
			
		||||
vendor/grammars/language-maxscript:
 | 
			
		||||
- source.maxscript
 | 
			
		||||
vendor/grammars/language-ncl:
 | 
			
		||||
- source.ncl
 | 
			
		||||
vendor/grammars/language-python:
 | 
			
		||||
 
 | 
			
		||||
@@ -238,8 +238,10 @@ module Linguist
 | 
			
		||||
    disambiguate ".ms" do |data|
 | 
			
		||||
      if /^[.'][a-z][a-z](\s|$)/i.match(data)
 | 
			
		||||
        Language["Groff"]
 | 
			
		||||
      elsif /((^|\s)move?[. ])|\.(include|globa?l)\s/.match(data)
 | 
			
		||||
      elsif /(?<!\S)\.(include|globa?l)\s/.match(data) || /(?<!\/\*)(\A|\n)\s*\.[A-Za-z]/.match(data.gsub(/"([^\\"]|\\.)*"|'([^\\']|\\.)*'|\\\s*(?:--.*)?\n/, ""))
 | 
			
		||||
        Language["GAS"]
 | 
			
		||||
      else
 | 
			
		||||
        Language["MAXScript"]
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1970,6 +1970,15 @@ M:
 | 
			
		||||
  tm_scope: source.lisp
 | 
			
		||||
  ace_mode: lisp
 | 
			
		||||
 | 
			
		||||
MAXScript:
 | 
			
		||||
  type: programming
 | 
			
		||||
  color: "#00a6a6"
 | 
			
		||||
  extensions:
 | 
			
		||||
  - .ms
 | 
			
		||||
  - .mcr
 | 
			
		||||
  tm_scope: source.maxscript
 | 
			
		||||
  ace_mode: text
 | 
			
		||||
 | 
			
		||||
MTML:
 | 
			
		||||
  type: markup
 | 
			
		||||
  color: "#b7e1f4"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										29
									
								
								samples/MAXScript/macro-1.mcr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								samples/MAXScript/macro-1.mcr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
-- Taken from an example from Autodesk's MAXScript reference:
 | 
			
		||||
-- http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_84E24969_C175_4389_B9A6_3B2699B66785_htm
 | 
			
		||||
 | 
			
		||||
macroscript MoveToSurface
 | 
			
		||||
    category: "HowTo"
 | 
			
		||||
(
 | 
			
		||||
    fn g_filter o = superclassof o == Geometryclass
 | 
			
		||||
    fn find_intersection z_node node_to_z = (
 | 
			
		||||
        local testRay = ray node_to_z.pos [0,0,-1]
 | 
			
		||||
        local nodeMaxZ = z_node.max.z
 | 
			
		||||
        testRay.pos.z = nodeMaxZ + 0.0001 * abs nodeMaxZ
 | 
			
		||||
        intersectRay z_node testRay
 | 
			
		||||
    )
 | 
			
		||||
    
 | 
			
		||||
    on isEnabled return selection.count > 0
 | 
			
		||||
    
 | 
			
		||||
    on Execute do (
 | 
			
		||||
        target_mesh = pickObject message:"Pick Target Surface:" filter:g_filter
 | 
			
		||||
        
 | 
			
		||||
        if isValidNode target_mesh then (
 | 
			
		||||
            undo "MoveToSurface" on (
 | 
			
		||||
                for i in selection do (
 | 
			
		||||
                    int_point = find_intersection target_mesh i
 | 
			
		||||
                    if int_point != undefined then i.pos = int_point.pos
 | 
			
		||||
                )--end i loop
 | 
			
		||||
            )--end undo
 | 
			
		||||
        )--end if
 | 
			
		||||
    )--end execute
 | 
			
		||||
)--end script
 | 
			
		||||
							
								
								
									
										53
									
								
								samples/MAXScript/macro-2.mcr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								samples/MAXScript/macro-2.mcr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
-- Taken from an example from Autodesk's MAXScript reference:
 | 
			
		||||
-- http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_0876DF46_FAA3_4131_838D_5739A67FF2C1_htm
 | 
			
		||||
 | 
			
		||||
macroscript FreeSpline category:"HowTo" tooltip:"FreeSpline" (
 | 
			
		||||
local old_pos
 | 
			
		||||
local new_spline
 | 
			
		||||
local second_knot_set
 | 
			
		||||
 | 
			
		||||
fn get_mouse_pos pen_pos old_pen_pos = (
 | 
			
		||||
	if old_pos == undefined then old_pos = old_pen_pos
 | 
			
		||||
	if distance pen_pos old_pos > 10 then
 | 
			
		||||
	(
 | 
			
		||||
		if second_knot_set then
 | 
			
		||||
			addKnot new_spline 1 #smooth #curve pen_pos
 | 
			
		||||
		else
 | 
			
		||||
		(
 | 
			
		||||
			setKnotPoint new_spline 1 2 pen_pos
 | 
			
		||||
			second_knot_set = true
 | 
			
		||||
		)
 | 
			
		||||
		old_pos = pen_pos
 | 
			
		||||
		updateShape new_spline
 | 
			
		||||
	)-- end if
 | 
			
		||||
)-- end fn
 | 
			
		||||
 | 
			
		||||
fn draw_new_line old_pen_pos = (
 | 
			
		||||
	pickPoint mouseMoveCallback:#(get_mouse_pos,old_pen_pos)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
undo"Free Spline"on(
 | 
			
		||||
	new_spline = splineShape ()
 | 
			
		||||
	old_pen_pos = pickPoint ()
 | 
			
		||||
	
 | 
			
		||||
	if old_pen_pos == #RightClick then
 | 
			
		||||
		delete new_spline
 | 
			
		||||
	else
 | 
			
		||||
	(
 | 
			
		||||
		select new_spline
 | 
			
		||||
		new_spline.pos = old_pen_pos
 | 
			
		||||
		addNewSpline new_spline
 | 
			
		||||
		addKnot new_spline 1 #smooth #curve old_pen_pos
 | 
			
		||||
		addKnot new_spline 1 #smooth #curve old_pen_pos
 | 
			
		||||
		second_knot_set = false
 | 
			
		||||
		draw_new_line old_pen_pos
 | 
			
		||||
		q = querybox "Close Spline?" title:"Free Spline"
 | 
			
		||||
		if q then
 | 
			
		||||
		(
 | 
			
		||||
			close new_spline 1
 | 
			
		||||
			updateshape new_spline
 | 
			
		||||
		)
 | 
			
		||||
		select new_spline
 | 
			
		||||
	)--end else
 | 
			
		||||
)--end undo
 | 
			
		||||
)--end script
 | 
			
		||||
							
								
								
									
										64
									
								
								samples/MAXScript/svg-renderer.ms
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								samples/MAXScript/svg-renderer.ms
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
-- Taken from a 3-part tutorial from Autodesk's MAXScript reference
 | 
			
		||||
-- Source: http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_6B5EDC11_A154_4AA7_A972_A11AC36949E9_htm
 | 
			
		||||
 | 
			
		||||
fn ColourToHex col = (
 | 
			
		||||
	local theComponents = #(bit.intAsHex col.r, bit.intAsHex col.g, bit.intAsHex col.b)
 | 
			
		||||
	local theValue = "#"
 | 
			
		||||
	for i in theComponents do 
 | 
			
		||||
		theValue += (if i.count == 1 then "0" else "") + i
 | 
			
		||||
	theValue
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
local st = timestamp()
 | 
			
		||||
local theFileName = (getDir #userscripts + "\\PolygonRendering3.svg")
 | 
			
		||||
local theSVGfile = createFile theFileName
 | 
			
		||||
format "<svg xmlns=\"http://www.w3.org/2000/svg\"\n" to:theSVGfile
 | 
			
		||||
format "\t\txmlns:xlink=\"http://www.w3.org/1999/xlink\">\n" to:theSVGfile
 | 
			
		||||
 | 
			
		||||
local theViewTM =  viewport.getTM()
 | 
			
		||||
theViewTM.row4 = [0,0,0]
 | 
			
		||||
 | 
			
		||||
local theViewTM2 = viewport.getTM()
 | 
			
		||||
local theViewSize = getViewSize()
 | 
			
		||||
local theViewScale = getViewSize()
 | 
			
		||||
theViewScale.x /= 1024.0
 | 
			
		||||
theViewScale.y /= 1024.0
 | 
			
		||||
	
 | 
			
		||||
local theStrokeThickness = 3
 | 
			
		||||
	
 | 
			
		||||
gw.setTransform (matrix3 1)	
 | 
			
		||||
for o in Geometry where not o.isHiddenInVpt and classof o != TargetObject do (
 | 
			
		||||
	local theStrokeColour = white
 | 
			
		||||
	local theFillColour = o.wirecolor
 | 
			
		||||
	
 | 
			
		||||
	local theMesh = snapshotAsMesh o
 | 
			
		||||
	for f = 1 to theMesh.numfaces do (
 | 
			
		||||
		local theNormal = normalize (getFaceNormal theMesh f)
 | 
			
		||||
		
 | 
			
		||||
		if (theNormal*theViewTM).z > 0 do
 | 
			
		||||
		(
 | 
			
		||||
			local theFace = getFace theMesh f
 | 
			
		||||
			local v1 = gw.transPoint (getVert theMesh theFace.x)
 | 
			
		||||
			local v2 = gw.transPoint (getVert theMesh theFace.y)
 | 
			
		||||
			local v3 = gw.transPoint (getVert theMesh theFace.z)
 | 
			
		||||
			
 | 
			
		||||
			v1.x /= theViewScale.x 
 | 
			
		||||
			v1.y /= theViewScale.y 
 | 
			
		||||
			v2.x /= theViewScale.x 
 | 
			
		||||
			v2.y /= theViewScale.y
 | 
			
		||||
			v3.x /= theViewScale.x
 | 
			
		||||
			v3.y /= theViewScale.y
 | 
			
		||||
			
 | 
			
		||||
			format "\t<polygon points='%,%  %,%  %,%' \n" v1.x v1.y v2.x v2.y v3.x v3.y to:theSVGfile
 | 
			
		||||
			format "\tstyle='stroke:%; fill:%; stroke-width:%'/>\n" (ColourToHex theStrokeColour) (ColourToHex theFillColour) theStrokeThickness to:theSVGfile			
 | 
			
		||||
		)--end if normal positive
 | 
			
		||||
	)--end f loop
 | 
			
		||||
)--end o loop
 | 
			
		||||
 | 
			
		||||
format "</svg>\n" to:theSVGfile
 | 
			
		||||
close theSVGfile
 | 
			
		||||
local theSVGMap = VectorMap vectorFile:theFileName alphasource:0
 | 
			
		||||
local theBitmap = bitmap theViewSize.x theViewSize.y
 | 
			
		||||
renderMap theSVGMap into:theBitmap filter:true
 | 
			
		||||
display theBitmap
 | 
			
		||||
format "Render Time: % sec.\n" ((timestamp()-st)/1000.0)
 | 
			
		||||
							
								
								
									
										22
									
								
								samples/MAXScript/volume-calc.ms
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								samples/MAXScript/volume-calc.ms
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
fn CalculateVolumeAndCentreOfMass obj =
 | 
			
		||||
(
 | 
			
		||||
	local Volume= 0.0
 | 
			
		||||
	local Centre= [0.0, 0.0, 0.0]
 | 
			
		||||
	local theMesh = snapshotasmesh obj
 | 
			
		||||
	local numFaces = theMesh.numfaces
 | 
			
		||||
	for i = 1 to numFaces do
 | 
			
		||||
	(
 | 
			
		||||
		local Face= getFace theMesh i
 | 
			
		||||
		local vert2 = getVert theMesh Face.z
 | 
			
		||||
		local vert1 = getVert theMesh Face.y
 | 
			
		||||
		local vert0 = getVert theMesh Face.x
 | 
			
		||||
		local dV = Dot (Cross (vert1 - vert0) (vert2 - vert0)) vert0
 | 
			
		||||
		Volume+= dV
 | 
			
		||||
		Centre+= (vert0 + vert1 + vert2) * dV
 | 
			
		||||
	)
 | 
			
		||||
	delete theMesh
 | 
			
		||||
	Volume /= 6
 | 
			
		||||
	Centre /= 24
 | 
			
		||||
	Centre /= Volume
 | 
			
		||||
	#(Volume,Centre)
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/grammars/language-maxscript
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								vendor/grammars/language-maxscript
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule vendor/grammars/language-maxscript added at a465c9ca4a
									
								
							
		Reference in New Issue
	
	Block a user